본문 바로가기
ITPE metacog/Cloud metacog

Systems Operations on AWS

by 잘 배우고, 잘 익히기 2021. 4. 15.

AWS 플랫폼에 네트워크 및 시스템을 자동화 및 반복 배포하는 방법에 대해 알아보기

  • Amazon Virtual Private Cloud(VPC), Amazon Elastic Compute Cloud(Amazon EC2), Elastic Load Balancing(ELB), AWS Auto Scaling과 같은 표준 AWS 인프라 기능을 명령줄에서 사용합니다.
  • AWS CloudFormation 및 다른 자동화 기술을 사용하여 AWS 리소스 스택 생성
  • Amazon VPC를 사용하여 가상 프라이빗 네트워크를 구축
  • 명령줄 호출을 통해 Amazon EC2 인스턴스를 배포하고 인스턴스에서 흔히 발생하는 문제를 해결합니다.
  • Amazon EC2 인스턴스와 기타 AWS 서비스의 상태를 모니터링합니다.
  • AWS 클라우드에서 자격 증명, AWS 권한 및 보안을 관리
  • 태그, Amazon CloudWatch 및 AWS Trusted Advisor를 사용하여 AWS 계정의 리소스 사용을 관리
  • 재사용 가능한 Amazon EC2 인스턴스를 생성하는 최적의 전략을 결정
  • 단일 로드 밸런서 뒤에서 실행되는 Amazon EC2 인스턴스 집합을 구성
  • 기본 AWS CloudFormation 스택 정의를 문제 해결

개요

sysops 시스템 운영의 노하우 
서버와 인스턴스 서버는 애지중지, 인스턴스는 임시로 빌려서 사용
글로벌 인프라 리전과 가용 영역, 엣지 로케이션
- 데이터센터의 묶음이 가용영역(AZ) 
- 2개 이상의 가용영역을 합쳐서 리전
핵심 서비스  네트워크, 컴퓨팅, 스토리지, 관리 등
AWS 계정 보안 IAM(user, role)

클라우드 기반의 시스템 운영

시스템 운영 구축 이후 배포, 모니터링, 유지보수, 테스트, 보호 
DevOps 개념 : 개발자들이 운영까지도 고려
배경 : 클라우드로 인해 자동화 환경이 좋아지고, 운영 접근성 용이
DevSecOps 개발+운영에다 보안까지 고려하는 최근 트렌드
결국 클라우드 관리 비용 감소 가능
서비스 : WAF, Shield
캐시 데이터를 가까운 곳에 가져다 두고서 필요 시 불러 쓸 수 있는 개념
엣지 로케이션
CloudFront
엣지 로케이션에서의 서비스 CloudFront
 - 개념 : 웹 캐시 기능 제공 서비스 
 - 구성 : 전 세계 230개소에 존재
    .POP영역 : 사용자가 가장 먼저 접속하는 포인트
    .POP영역이 엣지 로케이션이라 볼 수 있음 
 - 활성화 : 엣지 로케이션에다 활성화(2번째 요청 부터 빠른 응답)
리전 선택 데이터 거버넌스, 법적 요구사항
지연시간
사용 가능한 서비스 여부 
비용 : 리전별로 다른 요금 비교 필요 
시스템 운영위한 주요 서비스 네트워크 : 가상 네트워크, 논리적 격리, IP범위/라우팅/게이트웨이/보안설정
컴퓨팅
액세스 : 인증, 액세스, 사용자/그룹/역할/정책
서비스 범위 리전(VPC밖 서비스) : S3, AMI(S3에저장), CloudWatch지표, VPC, EBS스냅샷 
  - 완전관리형 서비스들은 리전내 서비스 임
가용영역 : EC2, EBS, RDS, Subnet
전 세계 
 - IAM 사용자, 그룹, 역할  
 - Route53
 - CloudFront 배포 
시나리오 배포 
 요구사항 
고가용성, 필요에 따라 확장, 웹 로그 수집 및 분석
인스턴스 모니터링 및 유지관리, 보안을 고려한 설계
리소스 웹 서버, 데이터베이스, 오토스케일링, LB, 모니터링 및 로그

 

핵심 서비스

네트워그 구성

Route53-->인터넷게이트웨이-->Elastic Load Balancer -->웹서버( Private Subnet)

배포용 패키지 
IAM 인증(authentication) : 로그인을 의미 
인가(autorization) : 로그인 상태에서 어떤 일을 할 수 있을 지 권한 제공

정책을 만들어서 사용자/그룹/역할을 생성해서 사용 가능을 인가함 
인증의 방법인 
'자격증명'의 유형
이메일 주소와 암호 : AWS계정(루트)에 연결
IAM 사용자 이름과 암호 : Management console에 액세스 
  - 주어진 URL로만 접근 가능 
액세스 키 : CLI에서 주로 사용
멀티 팩터 인증
IAM 사용자 관리  그룹에 사용자를 할당
사용자 액세스 키 
권한 사용자에 대한 멀티 팩터 인증 관리 
맞춤형 권한 제공(서비스 및 리소스별)
사용자에 태그 추가 
계정 암호 정책 관리 : 암호화 수준, 길이, 암호 재설정
IAM 권한 관리 정책을 만들고서 인가를 해 줘서 사용 가능
정책 및 권한 정책 유형 
 - 자격 증명 기반 정책 
 - 리소스 기반 정책
 - SCP
 - ACL
자격증명 기반 정책 Version 
Statement
  - Effect : 권한
  - Action : 활동
  - Resource : 사용할 자원(ec2 등)
  - Condition 
리소스 기반 정책 bucket policy : S3만의 
Policy

Policy를 만들고 user에게 적용 가능 

자격 증명 생성 예

확인 방법 

임시 자격증명Role Role은 임시 자격 증명임 
 - 제한 시간을 설정하여 보안성 확보

Role을 사용하는 4가지 방법 
  - web identity : 소셜 계정을 이용한 인증 
  - 다른 AWS계정에 대한 인증 제공 : Trust relationship 이후 롤을 부여
      . switch role을 통해서 다른 AWS계정의 허용 롤의 정책을 인가 받음
  - AWS service : 서비스별로 IAM role 선택 가능
  - SAML : 기업간


ㅇ EC2인스턴스에서의 Role 사용 
    - access key나 secret access key를 사용하지 않아도 인증 가능 
    - 롤이 적용되어 있다면 내부에서 메타데이터로부터 인증키로 호출 진행 
      따라서, 코드에다 access key를 노출할 필요가 없음(하드코딩 불필요) 

랩탑 접속 시  key를 이용해서 aws 접속 가능
IAM 정책 규칙 명시적 거부가 우선 
 - DENY가 있을 경우 명시적 거부가 우선
 - DENY가 없을 경우 명시적 허용이 있으면 허용

묵시적 거부 : 명시적 사용을 하지 않으면 묵시적 거부
IAM 역할의 기능 리소스에 대한 접근 권한
SSO을 위한 SAML2.0 
교차 계정 접근 가능
MFA 인증 : 암호(지식), 토큰(소유)
복수 계정 격리 : 사업부별 격리 
 - 하나의 계정에 하나의 VPC 사용 
 --> 계정관리 통합 AWS Organizations
       - 사업부별 Root 계정 관리 
SCP SCP : OU에 SCP 할당 
 - OU에 AWS계정 할당

CLI 사용하여 AWS 서비스 제어 

Systems Manager
개요
시스템 관리 
 -  AWS 인프라에 대한 가시성과 제어를 제공
AWS 사용 방법 Management Console
CLI
SDK
CLI  aws config로 설정 
액세스키와 보안 액세스 키 받아서 처리
형식  
  aws 서비스명 작업  파라미터   옵션 
예시
  aws ec2 run-instances --cli-input-json file://webserver.json  ;; json방식으로 저장 후 사용
CLI  --query 옵션 aws ec2 describe-instances --query 'Resrvationino[0].Instances[0].State.Name'
  -> 의미 : 첫 번째 RI인스턴스의 상태 확인 
CLI --filter 옵션 aws ec2 describe-instances
--filter "Nme=instance-type, Values=t2.micro, t2.small"
--query "Reservations[*].Instances[*].InstanceId"
 -> 의미 : 인스턴스(--filter)의 인스턴스 ID만(--query) 표시 
CLI --dry-run 권한 보유 유무 확인 가능
 - 필요 권한이 없을 경우 오류를 리턴함
출력형식
CLI --output table
테이블 형태 text형태로 표시
  테이블 형식 : --output table
  텍스트 형식 : --output text 
CLI 명령 레퍼런스 링크
https://docs.aws.amazon.com/ko_kr/cli/latest/reference/ec2/describe-instances.html

 

Systems Manager

기능 소프트웨어 인벤토리 수집, OS패치, 시스템 이미지, OS관리 및 구성
 - 자동화, 세션관리자, 패치관리자(종속성), RUN COMMAND(정의 명령어 등),
 - 유지관리 기간(스케쥴링), 상태관리자(수정발생 시 알림), 파라미터 스토어,
 - 인벤토리, 인사이트 대시보드 
세션 관리자 Bastion서버 필요 없이 내부에서 직접 private instance로 접근 가능 
  - 인바운드 포트 필요 없이 안전하게 인스턴스 접근
유지 관리 기간 작업 시간 예약
상태 관리자 일관된 구성을 유지, 변경이 발생되면 알림 제공
파라미터 스토어 코드에 포함하지 않고, 파라미터 스토어에 저장해 두고 
코드에서는 파라미터 스토어를 이용해서 id/pwd 요청을 할 수 있게 됨
인벤토리 설치된 소프트웨어에 대한 정보 수집
 - 애플리케이션 데이터, 파일, 네트워크 구성, 시스템 속성 등 
실습)
인벤토리
RUN COMMAND
파라미터 스토어
세션 관리자
인벤토리 : 구성과 권한 확인
  - 각 인스턴스에 SSH연결 없이 소프트웨어 구성 내역 확인 가능
RUN COMMAND : 여러 서버에서 작업을 실행
 - SSH로 인스턴스에 원격 액세스 필요없이 사용자 지정 애플리케이션 설치 가능
파라미터 스토어 : 애플리케이션 설정 또는 구성을 업데이트 
세션 관리자 : 인스턴스에서 명령줄에 액세스
 - 인바운드 포트를 열거나 ssh키 관리 필요 없이도 안전하고 감사가능한 인스턴스 관리 가능


과제 1: 관리형 인스턴스의 인벤토리 목록 생성
과제 2: Run Command를 사용하여 사용자 지정 애플리케이션 설치
과제 3: 파라미터 스토어를 사용하여 애플리케이션 설정 관리
과제 4: 세션 관리자를 사용하여 인스턴스에 액세스
  과제 1: 관리형 인스턴스의 인벤토리 목록 생성
  과제 2: Run Command를 사용하여 사용자 지정 애플리케이션 설치


  과제 3: 파라미터 스토어를 사용하여 애플리케이션 설정 관리

추가 차트 표시 : 차트가 2개에서 3개로 증가

  과제 4: 세션 관리자를 사용하여 인스턴스에 액세스


https://docs.aws.amazon.com/ko_kr/cdk/latest/guide/get_ssm_value.html

  - aws config : 권한을 가지고 있는 키값을 사전에 설정하는 과정 수행 후 인스턴스 정보 확인 가능 

추가 관리 도구

powerShell용 AWS도구 powershell명령줄에서의 스크립트 작업 가능 
 - 보안그룹 생성 및 구성, 인스턴스 시작 등 
SDK 다양한 언어 제공 : Go, Node.js, C++, Java 등 

 

컴퓨팅

인스턴스 프로비저닝 AMI : 이미지
네트워크 : VPC 
볼륨 스토리지 : EBS
사용자 데이터 : AMI 설치 시 실행되는 사용자 스크립트 
보안그룹 
키페어 : 인스턴스 접속
인스턴스 유형 범주 : 범용, 컴퓨팅 최적화, 스토리지 최적화, 메모리 최적화 
패밀리, 유형, 변형 등 
AMI 머신 이미지 
구성요소 :  인스턴스 볼륨 템플릿, 시작 권한, 블로 디바이스 매핑
AMI 선택 : AWS제공, 커뮤니티, 마켓플레이스, 사용자 구축
EC2 인스턴스용 블록 스토리지 SSD : 범용 gp2 & gp3(최신으로 사용 권장)  프로비전IOPS io1& io2 
HDD :  처리량 최적화 볼륨, Cold 볼륨
네트워킹 IGW : public subnet 접속
탄력적IP 고정IP , Public IP는 일시적/동적IP
ENI : virtual network interface, 모든 EC2인스턴스에 붙음
보안그룹 ENI에 SG가 걸려 있어서 ENI를 통과할 것인지 구성 
 - 구성 형태 : 어디서나, 특정 컴퓨터, 보안그룹 멤버의 SSH액세스 허용
사용자 데이터 시작 시 실행되는 리눅스 스크립트
CloudInit : 초기 설정 스크립트 표준 

cloudinit.readthedocs.io/en/latest/topics/availability.html


EC2 인스턴스 메타데이터 인스턴스 구성 또는 관리에 사용되는 데이터
 169.254.169.254 IP 주소에서 메타데이터 서비스 제공
 예) http://169.254.169.254/latest/meta-data/instance-id/
키페어  원격 접속 
자체 인스턴스 보안 설정 인스턴스 생성 후에 사용자 및 권한 변경
  - 리눅스 : kerberos 기반 SSO, ssh-keygen을 사용하여 public/private 키페어 생성
                사용자의 public 키를 ~/.ssh/authorized_keys에 추가
집합 전체 사용자 관리를 위한 전략 마련 
  - AMI, 구성 소프트웨어 사용
시작 후 구성 옵션 인스턴스 스크린샷 가져오기
종료 방지 활성화 :  protect against accidental termination
인스턴스를 NAT 인스턴스, 라우터 또는 방화벽으로 사용하는 경우
CLI 자동 생성
인스턴스 수명주기 실행중--> 중지됨--> 종료됨, 중지중--> 최대절전모드
실행 중 : 비용 청구
중지됨 : 청구되지 않음
종료됨 : 청구되지 않음 


최대 절전 모드 사전 조건 : 지원되는 유형, AMI, EBS 볼륨, 온디맨드 또는 RI
인스턴스 다시 시작 손상, OS아키텍처 또는 이미지 유형의 업그레이드, 다운그레이드, Auto Scaling, 비용절감
새 인스턴스 크기로 전환 인스턴스 유형 업데이트
AMI 사용 중단 최신 AMI를 쿼리해서 사용
공동 책임 모델 고객의 역할 존재
취약성 검사 및 침투 테스트 공격 테스트 시 사전 알림을 통해서 모니터링에서 배제 관리 필요
EC2 구매 옵션 온디맨드 인스턴스
예약 인스턴스 : 1년 또는 3년
스팟 인스턴스 : 온디맨드 요금 대비 최대90%까지 요금 절약
  - 온디맨드 인스턴스 이외에 자주 안쓰는 리소스에 적용
  - 1시간 또는 6시간 이내의 배치 작업 등에 적용 가능 : 짧은 시간 여러 개 분산 시 적용
  - 2분전에 알림 수신
  - 이용 통계 : 95% 정도는 최종 완료
전용 호스트 : 물리 장비 위치까지 고정하는 경우에 사용(CPU에 SW라이선스가 종속되는 경우)
전용 인스턴스 : 격리된 물리 장비에서 실행
i3.metal : 원하는 가상화 계층 또는 OS 실행  가능 물리 호스트
실습) 과제 1: Management Console을 사용하여 Amazon EC2 인스턴스 시작
과제 2: Bastion 서버에 로그인
과제 3: AWS CLI를 사용하여 인스턴스 시작
도전 과제 1: Amazon EC2 인스턴스에 연결
도전 과제 2: 웹 서버 설치 수정
과제1 과제 1: Management Console을 사용하여 Amazon EC2 인스턴스 시작
 - GUI 상으로 인스턴스 구성 및 시작 
과제2 과제 2: Bastion 서버에 로그인
SSH 접속 가능하도록 SG에 22번 포트 인바운드에서 허용


ㅇ 인스턴스에서 Connect 클릭해서  id/pwd 없이 접속 가능

ㅇ 아래와 같이 접속 시도

과제3
























































과제 3: AWS CLI를 사용하여 인스턴스 시작
최신  AMI
subnet 

 

 

ㅇ CLI : 인스턴스 시작 명령어
    aws ec2 run-instances 

  도전 과제 : 웹페이지 접속 불가 
  - user data 확인을 통해서 web서버 기동 불량 확인

 

 

2일차 : ELB, Auto Scaling, Route53

 

ELB

온디맨드 조정
인스턴스로 연결되는 과정 user --> Route53 --> ELB(인스턴스로 분산) --> 인스턴스(Auto Scaling 그룹)
ELB 기능 여러 대상으로 트래픽 자동 분산
 - 고가용성(다수 분산), 상태확인, 보안 기능(EC2 미노출)
 - TLS종료(사용자로부터 ELB로의 HTTPS 구간이었으나, ELB~EC2내부 구간은 HTTP로 통신)
    . ELB~EC2간에는 EC2의 복호화 부담(5%정도 리소스) 경감을 위해 HTTP로 통신
 - 4계층/7계층 로드 밸런싱
 - 운영 모니터링 가능
ELB 유형 ALB : HTTP/HTTPS 사용
NLB : TCP, UDP, SSL 사용 
CLB(이전 세대로 지금은 사용하지 않음)
ALB 기능 별도 타겟 그룹 설정 기능 : EC2그룹을 서비스 제공 기능에 따라 별도로 구성
 - example.com/search, example.com/user 등으로 별도의 타겟 그룹 설정 가능
 --> 장애 요인 분산 효과적 대응 기능 제공

 

Auto Scaling

오토스케일링 수요에 맞게 확장하고 비용 절감하도록 축소하는 자동화 기능
기능 예약 기능 제공(시간 기준 예약)

오토스케일링 인스턴스 상태 인스턴스 상태 유지
비정상 인스턴스 종료 
로드밸런서를 사용하는 경우 로드밸런서의 인스턴스 확인 
EC2 Healthy : 상태가 건강
 - 상태값 변경 가능 : aws autoscaling set-instance-health명령
오토스케일링 종료 정책 종료 대상 결정
종료 순서 : 인스턴스 수가 가장 많은 영역, 복수의 정책을 나열된 순서대로 실행
종료 정책
  - OldestInstance
  - NewestInstance
  - OldestLaunchConfiguration : 가장 오래된 인스턴스 종료(과금 기준 고려 시 필요)
  - ClosestToNextInstanceHour
Steady State 그룹 생성 최소, 최대, 원하는 값으로 설정
- desired capacity 값이 증가하면서 스케일아웃

NAT인스턴스(아웃바운드만 허락)
 - NAT GW는 완전관리형이나 NAT인스턴스를 사용하고자 하는 고객 있음
 - NAT인스턴스는 1,1,1로 설정해 두면 장애시 다시 복구 
동적 조정 단계 추적 조정 : 에어컨 같이 수치를 정해 놓고 자동으로 ON/OFF 하는 방식
단순 조정 : CPU사용률 등 단순 지표
단계 조정 : 축소 경보, 확장 경보
  - EC2 만드는 5분정도의 시간에 유입되는 트래픽에 대응하기에 어려운 단순조정 대응
  - 급격한 트래픽 증가가 있을 경우를 대비해서 설정값을 여러 개 설정
  - 예) EC2 만들고 있는 중에도 필요 시 늘리는 동작 수행 

Route53

기능 리전간 트래픽 분산 기능 
도메인 이름 등록
도메인 이름을 ip주소로 분석
지연시간, 상태확인, 가중치 기준으로 요청을 라우팅
라우팅 정책 단순 라우팅 : 라운드 로빈 방식
지리 위치 라우팅 : 유럽의 경우에 나라에 맞는 컨텐츠를 전달 시 필요
  - 유럽 나라별로 ip가 다른 상황에서 적용 용이
  - 미국의 경우에는 주단위로 라우팅 제공 가능 
  - 리전간 로드밸런싱도 가능
가중치 기반 라우팅 : 트래픽 비율을 나누어서 전달
지연 시간 기반 라우팅(LBR) : Latency(요청-응답간의 시간)이 짧은 쪽으로 트래픽 전달
블루/그린 배포
 - 무중단 배포 전략
가중치 기반 라우팅을 활용해서 블루/그린 배포 가능 
 - 기존 : 블루 
 - 신규 : 그린 
Route53에서 가중치 기반 라우팅을 통해서 배포 
블루/그린 배포 = 레드/블랙 배포(넷플릭스 용어)

 

실습

과제 과제 1: Amazon EC2 Auto Scaling을 위한 새 Amazon Machine Image 생성
과제 2: Auto Scaling 환경 생성
AMI 생성 과제 1: Amazon EC2 Auto Scaling을 위한 새 Amazon Machine Image 생성
  -CLI 로 AMI 생성, Auto Scale용 이미지 생성
  UserData.txt
[ec2-user@ip-10-5-10-12 ~]$ cat UserData.txt #!/bin/bash yum update -y --security yum -y install httpd php stress chkconfig httpd on /etc/init.d/httpd start cd /var/www/html wget https://us-west-2-tcprod.s3.amazonaws.com/courses/ILT-TF-100-SYSOPS/v3.3.31/lab-3-scaling-linux/scripts/ec2-stress.zip unzip ec2-stress.zip echo 'UserData has been successfully executed. ' >> /home/ec2-user/result find -wholename /root/.*history -wholename /home/*/.*history -exec rm -f {} \; find / -name 'authorized_keys' -exec rm -f {} \; rm -rf /var/lib/cloud/data/scripts/*

아래의 내뇽은 보안성 위해 key값은 노출되지 않도록 합니다. 
find -wholename /root/.*history -wholename /home/*/.*history -exec rm -f {} \; find / -name 'authorized_keys' -exec rm -f {} \; rm -rf /var/lib/cloud/data/scripts/*

AMI 으로 인스턴스 생성(UserData를 포함해서 생성)
aws ec2 run-instances --key-name qwikLABS-L9016-4120667 --instance-type t3.micro --image-id ami-06cd52961ce9f0d85 --user-data file :///home/ec2-user/UserData.txt --security-group-ids sg-05440e5e4fc480196 --subnet-id subnet-0f8131bb5830d86e6 --associate-public-ip-address --tag-specificatio ns 'ResourceType=instance,Tags=[{Key=Name,Value=WebServerBaseImage}]' --output text --query 'Instances[*].InstanceId'

public DNS명 쿼리
[ec2-user@ip-10-5-10-12 ~]$ aws ec2 describe-instances --instance-id i-0486417bb460e077f --query 'Reservations[0].Instances[0].NetworkInterfaces[0].Associati on.PublicDnsName'

"ec2-13-112-102-222.ap-northeast-1.compute.amazonaws.com"   //DNS명 결과 출력


Auto Scale용 이미지 생성 (create image)

[ec2-user@ip-10-5-10-12 ~]$ aws ec2 create-image --name WebServer --instance-id i-0486417bb460e077f { "ImageId": "ami-0bab7e373d672f543" }


Congirue Load Balancer 생성

LB 생성 이후 Launch Configurations 진행





Auto Scaling 과제 2: Auto Scaling 환경 생성


 - 기존에 만들어 놓은 LB를 연결
ㅇ Target 트래킹 방식

 

데이터베이스

SQL과 NoSQL로 구분 SQL : RDS, Aurora
  - RDS : MySQL, PostgreSQL, MariaD, Aurora, Oracle, SQL Server
  - Redshift(Data Warehouse)
NoSQL : DynamoDB, Neptune(관리형 그래프), ElasticCache(메모리DB)
데이터베이스엔진 목적 저장자료 형태
 - 과거 : 행렬 위주의 표(테이블)를 만들어서 관리, 여러 테이블을 만들고 관계를 구성해서 조인
 - 최근 : 다양한 테이터 형태(key:value, graph, document, 시계열) 처리
스키마 설정 데이터 모델링을 통해서 스키마 설정
쿼리 SQL의 표준 문법을 활용
확장성 Scale-Up 방식과 Scale-out 방식 적용
 - NoSQL : Scale-out 방식으로 확장
RDS 관리 편리
백업 제공
RDS백업 자동
수동 : 스냅샷
Multi-AZ 고가용성 목적

  - DB 변경 시 주소를 Takeover 해서 DB서비스 제공
RDS 조정 오토스케일링은 할 수 없으나 스케일업 가능 
스토리지 용량 : 잡아 놓은 사이즈에 대한 비용이 과도할 수 있으므로 사용할 만큼만 설정
  - 처음에 작게 잡아 놓고서, 자동으로 늘어 나도록 관리하여 비용 절감
  - 프로비전드IOPS(SSD) : 고성능 필요시 사용
Aurora 성능 : PostgreSQL보다 3배, MySQL보다 5배 빠른 성능 
호환성 : Aurora MySQL, Aurora PostgreSQL이 있어 코드 변경 없이 간편히 마이그레이션 가능  
요금 : 종량제    
Aurora 구성 DB클러스터 : Main1개 + 3개의 복제본

 - 대부분의 경우 읽기가 90%로 복제본을 통해서 읽기 성능 향상
 - Aurora는 15개까지 복제본 가능

DynamoDB 완전관리형 : 바로 테이블을 만들어서 즉시 사용 
일정 성능 : 짧은 지연시간
유연성 : 용량 확장성
제어 : 세분화된 액세스 제어(컬럼별 접근제어 가능)
AWS DMS 마이그레이션 서비스
DMS 이점 최소한의 가동 중지로 DB를 AWS로 마이그레이션 : EC2에 SW배포로 DB변경
 - 간편 사용 
 - 최소한의 가동 중단 
 - 보편적인 DB 지원
 - 빠르고 쉬운 설정 
 - 안정성
 - 저렴한 비용
AWS SCT Schema Conversion Tool

 

네트워킹

VPC 논리적 분리된 네트워크 영역
전형적인 AWS 네트워크 구조도

 - CIDR 체계 적용

CIDR 예시) 10.0.0.0 /16 
 - 16은 prefix
 - prefix까지 고정해서 네트워크 구분 
ㅇ 0.0.0.0/0 모든 ip를 의미
ㅇ IP 할당 
    - 서브넷별로 5개가 예약되어 있어 사용 불가 : 0,1,2,3, 255

기본 라우팅 테이블  10.0.0.0/16 local    // local로 표시
가용 영역 분산 장애 시 방어를 위한 구조 
VPC 만들기(간단) Your VPC> Create VPC
 - Name, IP CIDR block
 - Edit DNS hostnames를 활성화 : EC2에 DNS 명칭 부여 가능
Subnet 만들기 VPC에 종속적이라 VPC 선택 필요 
VPC, Name, AZ, IP CIDR block 
인터넷게이트웨이 설정 Name만 설정하여 생성
 - 모든 VPC에는 1개 IGW 가능
Attach 수행해서 연결 
public subnet에 
public IP할당
 - 자동 할당 
auto-assign IP 

 

고정IP Elastic IP  NAT GW와 같이 고정IP가 필요한 경우에 사용
트래픽 방향 잡아 주기
Route Table(이정표)
private route table : default 생성분을 사용 

subnet associations 정의한 라우팅 테이블에 연결 
Route Table 생성 1) 생성
2) 연결 : 정의한 라우팅 테이블에 연결 

Public sunet의 트래픽을 IGW로 라우팅 설정 Destination Target    // 작은 범위부터 적용되는 규칙임 
10.0.0.0/16   local  // 밖으로 나가지 말고 안에서 트래픽 유통
0.0.0.0/0      Lab IGW  /// 나머지 전부는 Lab IGW로 나가도록 설정
 -  외부로 나가야 하는 경우 
 -  내부에서 쓰는 IP가 아니면 외부로 나갈 수 있어야 함

보안 패치를 위해 
Public sunet 접근 필요 : NAT GW
private route table 설정 
 - NAT GW와 private subnet 과 연결 
0.0.0.0/0 Lab NATGW 설정해서 인터넷 연결 가능 

Create NAT Gateway 설정 
  - Name, Subnet(public subnet), Elastic IP allocation(고정IP필요하므로 할당)
   0.0.0.0/0 Lab NATGW
 -> private subnet의 인스턴스도 인터넷 접속 가능 
접속 흐름 user --> Route53 이후
user --> IGW --> ELB --> Route Table --> NW ACL(subnet전에 무조건 거침) --> Public Subnet 
 - NW ACL에서는 인바운드와 아웃바운드 모두 설정 필요 
ENI ENI에 접속하기 위해서는 EC2의 SG을 통과해야 함 
Subnet-->SG --> ENI --> EC2 

보안 3단계 NW ACL, SG, Key 
앱서버에 올린 이미지 S3에 저장하는 방식(S3에 저장 시도시 인터넷 구간 발생)
-과거 : 앱은 NAT GW --> IGW --> S3 저장 : 전송 비용 발생 
--> 지금은
     VPC Endpoint : 앱서버에서 VPC Endpoint를 통해서 내부 S3로 접근 가능
Endpoint 구분 GW Endpoint : S3와 DynamoDB만 쓸 수 있음
Interface Endpoint : 나머지 서비스
  - ENI를 만들어서 다른 서비스와 VPC내에서 통신 가능
GW Endpoint 앱서버에서 VPC Endpoint를 통해서 내부 S3로 접근 가능 
- private link 
- 이점 : 인터넷 전송 비용 미발생 
ENI 사용 보안성 ENI를 사용하는 것은 SG를 쓸 수 있음 
 - 포트만 열어서 통신할 수 있어 보안 강화 
NAT GW 고가용성 AZ별로 NAT GW 생성해서 이중화 생성 
 - NAT GW는 이중화 생성해도 무조건 비용이 나가는 것이 아니라 쓴 만큼만 비용 지불
VPC 피어링 VPC끼리 서로 연결 
 - 서로 다른 IP 대역이라야 가능 
 - 한 쪽 라우팅 테이블에 설정, 다른 쪽에서도 라우팅 테이블에 설정

  - 피어링 생성 후 요청 설정을 해야 통신 가능 
  - 전이적 피어링은 미지원(개별VPC간에 별도로 각각 피어링 설정해야 통신 가능)

AWS Transit GW 허브 역할을 하는 트랜짓게이트웨이 
 - VPC 5,000개를 붙일 수 있음 
 - VPC 피어링으로 복잡할 경우 사용
VPN 연결 암호화 처리를 위한 연결 
 - 생성 후 라우팅 테이블 설정 필요 
Direct Connect  VPN과 달리 인터넷을 사용하지 않고 전용선을 직접 연결(제공에는 일주일 정도 소요) 
NAT 인스턴스와
NAT GW
NAT인스턴스는 사용자가 직접 만들어서 관리하는 형태 
NAT게이트웨이는 관리형으로 사용자의 관리 불필요(용량 대응 자동적 진행)

VPC엔드포인트 외부로 트래픽을 보내지 않고 내부망을 통해 S3 등 접근 가능하게 하는 서비스 
 - S3연결, DynamoDB연결
PrivateLink  내부망으로 빠른 속도 제공
ENI 한 인스턴스에 15개 네트워크 카드 
네트워크 인터페이스당 최대 50개  EIP주소

 

네트워크 보안

계층화된 네트워크 방어 체제
보안 그룹 네트워크 인터페이스 수준에서 인바운드/아웃바운 트래픽 허용에 사용
상태 저장의 특성 : Stateful (인바운드에서 설정된 것을 기억하고 아웃바운드 허용) 
NACL 서브넷용 방화벽 : 서브넷 수준에서 2차 보안 계층으로 보안 강화 
상태 비저장의 특성 : 트래픽이 한 방향으로 흐르도록 허용하는 경우에도
                            응답이 반대방향으로 흐를도록 명시적으로 허용해야 함
배스천 호스트 퍼블릭에 배스천 호스트를 만들어 놓고 내부의 프라이빗 인스턴스에 접근
요즘은 System Managers를 사용


네트워크 문제 해결 서브넷 내 인스턴스가 서로 통신하지 못하는 경우
 - 네트워크ACL확인, VPC Flow logs 기능 확인, 인스턴스 문제가 아닌 지 확인

NAT 구성이 미작동 
 - NAT GW : 라우팅 테이블 연결 점검 
 - NAT 인스턴스 : NAT 재시작, NAT Masquerading 구성 확인(아웃바운드 허용), 
                        인바운드 보안그룹 규칙 확인 

피어링 네트워크의 리소스에 미도달 
 - 피어링 요청 승인 
 - 라우팅 테이블 구성 
 - NACL 확인 
 - 보안 그룹 구성 확인 
 - CIDR 블록 규칙( 겹치지 않도록) 

VPC 실습)  VPC 생성 : Name CIDR, Action에서 Edit DNS hostnames 활성화
퍼블릭서브넷 생성 :  VPC선택, Name, AZ선택, CIDR(/24로설정), public일 경우 auto ip 할당 활성화
프라이빗서브넷 생성 :  VPC선택, Name, AZ선택, CIDR(/23으로설정), 
IGW 생성 : attch VPC 수행 필요 
라우팅 테이블 구성 
  - public route table : subnet associate 시 0.0.0.0/0을 IGW 
  - private route table : subnet associate 시 0.0.0.0/0을 NAT
퍼블릿 서브넷에서 Bastion서버 시작 
NAT 게이트웨이 생성 : Name, public subnet설정, Allocate Elastic IP로 할당 

도전 과제

도전 과제 
 - 프라이빗 서브넷에 프라이빗 인스턴스를 생성하고
 - 베스천 호스트 접속 후에 프라이빗 인스턴스로 접속 : ssh로 프라이빗 인스턴스 ip 접속
 - 프라이빗 인스턴스에서 NAT GW ping 가능 확인 

프라이빗 인스턴스 user data
#!/bin/bash # Turn on password authentication for lab challenge echo 'lab-password' | passwd ec2-user --stdin sed -i 's|[#]*PasswordAuthentication no|PasswordAuthentication yes|g' /etc/ssh/sshd_config systemctl restart sshd.service

 

   
   
   
   

 

스토리지 

유형 EBS, 인스턴스 스토어, EFS, S3, SG Glacier, Snowball
AWS로 전송 AWS Transfer Family : FTP서비스 
AWS DataSync : 동기화 
데이터 스토리지 시나리오 데이터 저장, 검색 및 관리 
일시적인 EC2인스턴스로부터 로그 파일 저장 
EC2인스턴스와 연결된 볼륨에 대한 백업
재해 복구용 온프레임스 데이터 백업 
EBS 네트워크 연결 : 인스턴스간에 전용 네트워크 구성도 가능 
블록 스토리지, 영구 
부팅 및 데이터 볼륨이 지원됨
EBS 볼륨 유형 SSD 타입 
- io1 프로비저닝된 IOPS 
- gp2 : 범용 SSD
하드 타입 
 - 처리량 최적화 볼륨 : st1   ==> 빅데이터
 - 콜드HDD : sc1
EBS 볼륨 생성 명령어  aws ec2 create-volume --size 80  ... 
 aws ec2 attach-volume --volume-id ....
EBS 증분 스냅샷 증분 백업 수행함 : FULL 백업이 아닌 증가된 것만 백업, 속도도 빠름
 스냅샷은 S3에 저장 
aws ec2 create-snapshot --volume-id   ㅇㅇㅇ  --description "ㅇㅇㅇ"


리전 사이에서 스냅샷 이동 
aws ec2 copy-snapshot --region ooo --source-region  --source-snapshot-id  --description

스냅샷은 비동기식으로 반환
일관성 위해 디스크/데이터베이스를 중지 또는 정지 
  - 리눅스에서는 fs_freesze 를 사용 
완료 시까지 보류 상태를 유지 

스냅샷의 복원 S3에 저장된 내용 복원
aws ec2 create-volume --size --availability-zone --volume type ...
인스턴스 스토어(무료) 임시 스토리지 : 휘발성
고속 제공
사용 : 버퍼, 캐시, 스크래치 데이터 저장 시 사용
EFS 공유 파일 스토리지 : 가용 영역이 다른 EC2간의 스토리지 공유
 - EC2에서 마운트를 통해서 사용
 - 윈도즈는 FSX를 이용해서 사용 가능
페타바이트 규모의 파일 시스템
탄력적 용량 
NFS 4.0, 4.1 프로토콜 지원
모든 EC2용 리눅스 기반 AMI와 호환
EFS 는 사용량 만큼 과금 : 자동으로 용량 증대
S3  오브젝트 = 파일 _+ 메타데이터 
버킷(루트폴더) 단위로 배포 
API를 통해서 요청
내구성 설계
객체당 최대 5TB
어디서든 액세스 
저장 무제한 
자동으로 용량 증가 
S3 액세스 설정 퍼미션 설정 가능 
ACL : 간단한 경우에 적용
BUCKET POLICY로 JSON으로 설정 가능 : 복잡한 경우에 적용
S3에 대한 이벤트 알림 호스팅 기능 활성화 가능 
SQS 대기열, SNS주제(이메일 등), 람다 함수 ==> 서버리스 서비스(자동 증감)
 - 추가됨, 삭제됨, 덮어씀
서버리스 서버를 별도로 관리하지 않아도 되는 구조
S3 객체 작업 aws s3 cp/sync/rm
 - 복사, 동기화, 객체제거 등 작업
aws s3api create-multipart-upload
put-object-acl
put-bucket-policy
list-objec-versions
S3버전관리 Object 관리 어려움 해소 
이름이 같아도 예전이름을 관리 : 복구해서 사용 가능, 지워도 지우는 마크만 함 
예전 버전 관리를 하면 비용은 지불해야 함
객체 스토리지 클래스 범용 : S3 standard 
  - 한번 올리고 다수가 받아가는 경우에 사용 : hot한 데이터임
S3 Intelligent-Tiering 
  - hot 한 데이터가 아닌 경우에 standard데이터를 옮겨서 사용(20% 저렴)
Infreq Access
 - S3 Standard-IA
 - S3 One Zone-IA --> 40%저럼(복제본 관리 방식 다름)
아카이브 : S3 Glacier는 80% 저렴

저장기간이 긴 경우에는 다운로드시는 standard보다 더 비쌈
  - 결국 다운로드 빈도가 적은 경우에 사용
Intelligent Tiering 2가지 계층간에 저장을 AI가 진행

S3 Glacier 매우 저렴한 데이터 고객 온프레미스 및 장기 백업
가져와야 할 경우에는 비용이 발생
  - 신속 : 1~5분, 전송비용이 가장 비쌈
  - 표준  : 3~5시간
  - 대량 : 5~12시간
Storage G/W 온프레미스에서 S3를 로컬 스토리지 처럼 사용할 수 있도록 서비스 제공
온프레미스에 파일 게이트웨이 설치 및 설정 후 S3와 연결 가능

파일 게이트웨이 : 파일 NFS
볼륨 게이트웨이 : 블록스토리지 볼륨 iSCSI
테이브 게이트웨이 : 가상테이브, 장기 백업용(S3의 VTL-iSCSI--> 장기 보관시 Glacier로)

스토리지 게이트 웨이는 온프레미스에서 S3를 로컬 스토리지 처럼 사용하기 위해 만든 서비스입니다.
프로토콜과 저장 방법의 특성으로 여러 게이트웨이로 나뉘어져 있습니다. 자세한 내용은 아래와 같습니다.

파일 게이트웨이 - 클라우드에 원활하게 연결하여 애플리케이션 데이터 파일과 백업 이미지를 Amazon S3 클라우드 스토리지에 내구성 높은 객체로 저장할 수 있게 해줍니다.

테이프 게이트웨이 - 백업 워크플로를 변경하지 않아도 온프레미스에서 물리적 테이프를 AWS에서 가상 테이프로 대체할 수 있습니다.

볼륨 게이트웨이 - 온프레미스 애플리케이션에 클라우드에서 지원하는 블록 스토리지 볼륨을 제공합니다.

Transfer Family SFTP엔드포인트를 사용해서 S3로 데이터 저장
DataSync 동기화, 압축, 완전관리형, 성능 우수 
Snowball 대규모 고객 데이터셋을 신청해서 옮기는 방식 
 - 장비를 고객에게 보내서 데이터를 로드하는 방식
Snow Mobile 트럭단위의 데이터를 받아서 데이터를 로드하는 방식
실습 과제 1: 리소스 생성 및 구성
과제 2: 인스턴스의 스냅샷 생성
과제 3: 도전 과제: Amazon S3와 파일 동기화


  ㅇ 롤 부여
     - EC2 인스턴스에게 S3Access 롤을 부여(키발급 없이도 S3에 접근)

ㅇ 인스턴스 정보 보기

aws ec2 describe-instances --filter 'Name=tag:Name,Values=Processor'
ㅇ 인스턴스 정보 필요한 내용만 보기 
    - 어떤 EBS와 연결되어 있는지 볼 수 있는 명령어 
aws ec2 describe-instances --filter 'Name=tag:Name,Values=Processor' --query 'Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.{VolumeId:VolumeId}'

ㅇ 인스턴스 중지 후 
   아래는 인스턴스ID 확인하는 명령어 
       aws ec2 describe-instances --filters 'Name=tag:Name,Values=Processor' --query 'Reservations[0].Instances[0].InstanceId'
  이 후 인스턴스 중지하는 명령어 
       aws ec2 stop-instances --instance-ids ㅇㅇㅇ
       aws ec2 wait instance-stopped --instance -id ㅇㅇㅇ
ㅇ 스냅샷 생성
    aws ec2 create-snapshot --volume-id VOLUME-ID
    aws ec2 wait snapshot-completed --snapshot-id ㅇㅇㅇ

ㅇ 인스턴스 시작 
    aws ec2 start-instances --instance-id ㅇㅇㅇ
    aws ec2 wait instance-running --instance-id ㅇㅇㅇ    

ㅇ 크론탭 작성 
  echo "* * * * * aws ec2 create-snapshot --volume-id VOLUME-ID 2>&1 >> /tmp/cronlog" > cronjob
  - 매분마다 실행( 분 시간 일 월 요일), 스냅샷 생성, '2>&1' 은 에러 저장의 의미
   crontab -l 로 크론탭 생성 확인 

ㅇ 크론탭에 등록 
   crontab cronjob 으로 스냅샷 시 : 2개 이상 

  스냅샷 확인 
    aws ec2 describe-snapshots --filters "Name=volume-id,Values=VOLUME-ID"
ㅇ 크론탭 작업 중지 
     crontab -r 
스냅샷 확인 
    aws ec2 describe-snapshots --filters "Name=volume-id,Values=VOLUME-ID"

ㅇ 스냅샷 삭제  : snapshotter 파이썬 파일 이용 
[ec2-user@ip-10-5-0-117 ~]$ more snapshotter.py #!/usr/bin/env python import boto3 MAX_SNAPSHOTS = 2 # Number of snapshots to keep # Create the EC2 resource ec2 = boto3.resource('ec2') # Get a list of all volumes volume_iterator = ec2.volumes.all() # Create a snapshot of each volume for v in volume_iterator: v.create_snapshot() # Too many snapshots? snapshots = list(v.snapshots.all()) if len(snapshots) > MAX_SNAPSHOTS: # Delete oldest snapshots, but keep MAX_SNAPSHOTS available snap_sorted = sorted([(s.id, s.start_time, s) for s in snapshots], key=lambda k: k[1]) for s in snap_sorted[:-MAX_SNAPSHOTS]: print("Deleting snapshot", s[0]) s[2].delete()

ㅇ 삭제 후 스냅샷이 2개만 남은 상황 확인 가능 
aws ec2 describe-snapshots --filters "Name=volume-id, Values=vol-0e001617b689eeb12" --query 'Snapshots[*].SnapshotId' [ "snap-0ba142b99b4d84749", "snap-09829836ed4001b14" ]

도전 과제 : 
S3와 파일 동기화 
ㅇ 버킷 리스트 보기 
aws s3 ls 

ㅇ 버킷에 대한 버저닝 수행 : 동일 이름에 의해 삭제되는 것을 방지

aws s3api put-bucket-versioning --bucket sample-bucket-1234 
     --versioning-configuration Status=Enable  

   - 버저닝 이후에는 기록 관리가 됨, 지우는 것도 지우는 표시만 하게 됨
ㅇ 파일 업로드 
    aws s3 sync .  s3://sample-test-1234

ㅇ 파일 확인 
    aws s3 ls s3://sample-test-1234

ㅇ 파일 삭제 후 sync 
    aws s3 sync . s3://sample-test-1234  -- delete
 
ㅇ 지워진 표시 리스트 확인 
  aws s3api list-objec-versions --bucket sample-test-1234

ㅇ s3로 업로드
   aws s3 cp sample.py   s3://sample-test-1234
     aws s3 cp sample.py   s3://sample-test-1234
       - 한 번 더 업로드하면 2개 버전을 관리해 줌 

ㅇ 파일 받기 
   aws s3api  get-object --bucket sample-test-1234 --key /files/sample1.txt
                  /files/sampl2.txt  --version-id   ㅇㅇㅇㅇㅇ
ㅇ Objects 확인 
    기본적으로 Storage class 는 Standard로 올라감 

  - 스토리지 클래스 변경 가능

ㅇ Glacier로 변경된 수 가져오기 할 때의 첫 번째 작업은 "Initiate restore" 먼저 수행 후 
    Download 액션 수행 가능

ㅇ S3에서 받아간 이력 로그 확인 기능 

ㅇ S3에 이벤트 발생시 람다로 전달 가능 

ㅇ 대용량 시에 사용하는 옵션으로 엣지 로케이션으로 올려서 효율적으로 해당AZ 업로드
   예시) 서울에서 버지니아 리전으로 업로드시 사용하면 효율적 

ㅇ 정적 웹사이트 호스팅 기능 

   
   

 

 

JMESPATH

https://jmespath.org/tutorial.html

Basic expression a.b.c.d 

리스트 a.b.c[0].d[1][0]
[0:5]  // 5개 가져오기
복수값 가져오기 모든 firts 값을 가져 오는 방법의 예시

조건문 state가 running 인 것 중에서 name을 가져오기 
파이프라인 first 중에서 0번째 것을 가져오기 즉 James가 됨

 

모니터링

개요 CloudWatch(모니터링, 이벤트, 로깅)
CloudTrail : 사용자가 어떤 일을 하는지 추적
Config : 상태를 저장하고, 어긋나면 알림을 제공함
GuardDuty : 보안
CloudWatch 로그수집
모니터링
이벤트에 응답
분석
CloudWatch 모니터링 리소스 상태 및 사용률을 모니터링
Agent : EC인스턴스, 온프레미스 서버 지표 수집 
이메일 통보 가능 
지표 표준지표와 사용자 지표
CloudWatch Dashboards 위젯들을 추가해서 한 화면에서 사용 가능 
모니터링 기준 EC2 인스턴스 5분 단위 데이터를 보고(프리티어)
 1분 단위 모니터링 시 추가 비용 
CloudWatch Metrics
  - 모든 데이터 확인 가능
CloudWatch Alarms 알람 임계치 설정 
SNS토픽으로 보내기 : 이메일로 보내기 등 가능 
CloudWatch Logs 별도의 아파치서버로그 수집을 위해서는 CloudWatch Agent를 설치해서 가능 
flow log : ENI 로그 필터를 걸어서 수집 가능 
   - https://docs.aws.amazon.com/vpc/latest/userguide/working-with-flow-logs.html

   - 소스포트, 소스주소, ENI 등 확인 가능 
 1) 구성 2)수집 3)분석(Logs Insights)
ㅇ 기능 
데이터로그 그룹으로 집계
에이전트가 로그로 전달
필터로 특정 문자열 검색
경보 생성 : 사용자 정의 지표로 조건 보고 가능 
로그 쿼리와 시각화 생성 
ㅇ 필터 패턴 
     awslogs.conf 로그 파일에서 필드 패턴을 정의하여 조건 지정 

CloudWatch Logs Insight 로그에 대한 쿼리 가능 

 - 사용 문법 : https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html

CloudWatch Events 룰 생성


ㅇ 이벤트 패턴으로 설정 가능 : 통보 기능도 설정 가능 
AWS CloudTrail 계정 활동의 모든 내용 기록 
  - 인스턴스 종료, 보안그룹 구성 변경 
  - 로그 제공 가능 

AWS Config ㅇ 상태 관리자 
   - EC2인스턴스 내부의 바뀌면 안되는 셋팅에 대한 관리 필요 
   - 상태 관리자가 모니터링하고 있다가 변경이 되면 알려 주 ㅁ
ㅇ Config
   - 서비스의 상태를 관리 
   - 예시) bucket을 만들 때, public하게 못 만들게 설정 가능 
   - public으로 bucket을 만들 때 경고 메일을 보내게 할 수 있음 
   . 현재 시스템 상태 및 서비스 모니터링 
   . 리소스 인벤토리 검색,
ㅇ Config 규칙 예
    EBS볼륨 암호화, 승인된AMI사용, Elastic IP가 인스턴스에 연결됨 
    적절한 태그가 EC2에 지정
ㅇ Config 및 CloudTrail 
   CloudTrail에 모든 Config 변경 사항 기록 

ㅇ S3 퍼블릭에 노출 여부 관리 

ㅇ EBS 암호화 여부 관리

보안 서비스 

WAF : XSS 막기 등(OWASP Top10 막기) 
Shield : 디도스 막기 
Certificate Manager : HTTPS 인증 
Macie : AI 기반 개인정보/암호화 여부 모니터링 및 통보 , 민감데이터
GuardDuty : AI 기반 지능형 위협 탐지(flow log, dns log) 
 - 활성화 - 지속 분석 -위협탐지 - 조치가능한 알림을 활용



실습
과제 1: CloudWatch 에이전트 설치
과제 2: CloudWatch Logs를 사용하여 애플리케이션 로그 모니터링
과제 3: CloudWatch를 사용하여 인스턴스 지표 모니터링
과제 4: 실시간 알림 생성
과제 5: 인프라 규정 준수 모니터링
 
에이전트 설치 과제 1: CloudWatch 에이전트 설치

1) 파라미터 스토어의 Value에 감시할 항목 등록
  - CloudWagtch Agent가 시작할 때 참조될 파라미터 Value 
{ "logs": { "logs_collected": { "files": { "collect_list": [ { "log_group_name": "HttpAccessLog", "file_path": "/var/log/httpd/access_log", "log_stream_name": "{instance_id}", "timestamp_format": "%b %d %H:%M:%S" }, { "log_group_name": "HttpErrorLog", "file_path": "/var/log/httpd/error_log", "log_stream_name": "{instance_id}", "timestamp_format": "%b %d %H:%M:%S" } ] } } }, "metrics": { "metrics_collected": { "cpu": { "measurement": [ "cpu_usage_idle", "cpu_usage_iowait", "cpu_usage_user", "cpu_usage_system" ], "metrics_collection_interval": 10, "totalcpu": false }, "disk": { "measurement": [ "used_percent", "inodes_free" ], "metrics_collection_interval": 10, "resources": [ "*" ] }, "diskio": { "measurement": [ "io_time" ], "metrics_collection_interval": 10, "resources": [ "*" ] }, "mem": { "measurement": [ "mem_used_percent" ], "metrics_collection_interval": 10 }, "swap": { "measurement": [ "swap_used_percent" ], "metrics_collection_interval": 10 } } } }

  참고 : CloudWatch 구성 파일 문법
  https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html

2) CloudWatch 실행 
  Run Command 에서 Agent 검색해서 
   파라미터 스토어에서 정의한 내용을 적용 


3) CloudWatch에서 Log groups 에 만들어 진 것을 확인 

로그 모니터링 과제 2: CloudWatch Logs를 사용하여 애플리케이션 로그 모니터링
 - 각 개별서버에 로그인 하지 않고도 로그 데이터에 액세스 가능 

1) Log groups
   create metric filter 
필터 패턴 예시
    [ip, id, user, timestamp, request, status_code=404, size]

2) alarm 


설정 후 초기에는 insufficient data 표시 

3) 알람 발생 시 noti. : 토픽을 만들어서 이메일로 통보 가능 

 

지표 모니터링 과제 3: CloudWatch를 사용하여 인스턴스 지표 모니터링

1) Monitoring 탭


2) View in metrics

 

알림  과제 4: 실시간 알림 생성

1) create rules

2) event와 topic 설정 

3) 토픽 



컴플라이언스 과제 5: 인프라 규정 준수 모니터링
1) Settings

2) Set up AWS Config
 Rules

 rule type : AWS Managed Rules

3) 점검 : Compliant/ Noncompliant 


 

리소스 사용 관리 

개요 태그 지정 
클라우드에서 비용 절감 기회 
비용 모니터링 및 결제 경보 
AWS Trusted Advisor
태그 환경, 애플리케이션, 소유자 , 부서, 비용센터, 목적, 스택
태그 지정 required-tags를 통해서 관리형 규칙 지정 가능(AWS Config에서 지정)
태그 생성 aws ec2 create-tags ...
비용  관리 전략  태그를 이용하여 인스턴스를 동시에 시작과 종료 
  - 테스트 서버 태그를 주말에 동시에 off 하고 월요일에 동시에 ON해서 비용 절감
  - 클라우드의 비용적 이점 활용 필요 
비용 관리 도구 전반적 사용량 비용 감시 
월별 청구서에 액세스
도구 : Cost Explorer
비용 절감을 고려한 설계 인스턴스의 적정크리 
RI : 장기 실행 인스턴스 그룹에 적용(1~3년까지 계약 가능)
배치 : 병렬 실행, 작업 완료 시 종료, 스팟 인스턴스 활용, AWS Lambda 고려
    - 람다는 코드만 올려 두고 사용할 때만 비용 지불 가능 
버스트 워크로드 : T2인스턴스 (burst 기능 활용 가능)
비용 최적화 지침 제공 : AWS Trusted Advisor의 도움 받기 
Cost Explorer 1) 일단위 비용 제공, 예상치도 제공 
2) 서비스별 비용도 확인 가능 : EC2, VPC, ...
3) 리전별 비용 확인
4) 다양한 필터 : 인스턴스 타입, Cost Category 태그 활용 필요 

AWS Budget  버짓을 정해 놓고 알람 통보 처리 가능
CloudWatch Billing 빌링 알람 생성 가능 
 - 버지니아 리전에서 알람을 생성해야 볼 수 있음 
서버리스 Stopinator 태그를 통해서 ec2인스턴스를 정지와 시작을 자동화 
결제 대시보드 Cost Explorer 에서 확인
AWS Trusted Advisor 비용최적화 
성능
보안
내결함성
서비스한도 
에 대한 알람 가시화
실습  과제 1: 태그를 사용하여 리소스 관리
과제 2: 태그 기준으로 인스턴스 중지 및 시작
과제 3: 도전 과제: 규정 미준수 인스턴스 종료
 development 인스턴스 관리  과제 1: 태그를 사용하여 리소스 관리
 development 인스턴스 관리 
1) 찾기 명령어 : aws ec2 describe-instances --filter "Name=tag:Project,Values=ERPSystem"
--query 옵션 사용
aws ec2 describe-instances --filter "Name=tag:Project,Values=ERPSystem" --query 'Reservations[*].Instances[*].InstanceId'

2) 출력에 다수 필드 포함
aws ec2 describe-instances --filter "Name=tag:Project,Values=ERPSystem" --query 'Reservations[*].Instances[*].{ID:InstanceId,AZ:Placement.AvailabilityZone}'
 - 인스턴스와 가용영역 정보 동시 표시

3) 프로젝트의 태그 포함하여 출력
aws ec2 describe-instances --filter "Name=tag:Project,Values=ERPSystem" --query 'Reservations[*].Instances[*].{ID:InstanceId,AZ:Placement.AvailabilityZone,Project:Tags[?Key==`Project`] | [0].Value}'


4) Project라는 모든 요소 중에 파이프 처리를 통해서 production 환경만 출력
aws ec2 describe-instances --filter "Name=tag:Project,Values=ERPSystem" --query 'Reservations[*].Instances[*].{ID:InstanceId,AZ:Placement.AvailabilityZone,Project:Tags[?Key==`Project`] | [0].Value,Environment:Tags[?Key==`Environment`] | [0].Value,Version:Tags[?Key==`Version`] | [0].Value}'

 5) Project 중에 development 환경에 있는 건만 표시 
aws ec2 describe-instances --filter "Name=tag:Project,Values=ERPSystem" "Name=tag:Environment,Values=development" --query 'Reservations[*].Instances[*].{ID:InstanceId,AZ:Placement.AvailabilityZone,Project:Tags[?Key==`Project`] | [0].Value,Environment:Tags[?Key==`Environment`] | [0].Value,Version:Tags[?Key==`Version`] | [0].Value}'


6) development 프로세스의 Version 태그 변경
#!/bin/bash ids=$(aws ec2 describe-instances --filter "Name=tag:Project,Values=ERPSystem" "Name=tag:Environment,Values=development" --query 'Reservations[*].Instances[*].InstanceId' --output text) aws ec2 create-tags --resources $ids --tags 'Key=Version,Value=1.1'


7) 결과 확인 
aws ec2 describe-instances --filter "Name=tag:Project,Values=ERPSystem" --query 'Reservations[*].Instances[*].{ID:InstanceId, AZ:Placement.AvailabilityZone, Project:Tags[?Key==`Project`] |[0].Value,Environment:Tags[?Key==`Environment`] | [0].Value,Version:Tags[?Key==`Version`] | [0].Value}'

  과제 2: 태그 기준으로 인스턴스 중지 및 시작
php용 AWS SDK를 사용하여 인스턴스를 중지하고 다시 시작 가능
  - stopinator.php스크립트를 이용해서 development 환경 서버를 종료하고 다음날 아침 시작 
중지명령 예시) ./stopinator.php -t"Project=ERPSystem;Environment=development"

시작명령 예시) ./stopinator.php -t"Project=ERPSystem;Environment=development" -s
  과제 3: 도전 과제: 규정 미준수 인스턴스 종료

 

배포 자동화

개요 클라우드에서의 구성 관리 
AMI 생성 및 전략 구축
구성 소프트웨어 사용 
AWS CloudFormation 
구성관리 필요성 새로운 리소스를 신속하게 시작 : 재해복구 등 
히스토리 관리 
자동화 및 반복 가능한 구성을 새엉
인스턴스 구성 기술 userdata
AMI
OpsWorks
CloudFormation 
AMI  기본 구성으로서의 사용자 정의 AM 
 - AMI의 인스턴스 사용자 데이터 사용 
AMI를 다른 리전에 복사 aws ec2 copy-image --source-image-id   ...
구성 서버 사용  인스턴스에 사용자 데이터를 제공하여 구성 
 - chef 
CloudFormation 장점 코드로 인프라 관리 : IaC(Infrastructure as Code0
지리적 위치 전반에 롤아웃
롤백 관리 편리 
배포 디버기 
종속성 관리 : 시스템 및 하위 서비스에 대한 종속성
모든 변경 사항을 문서화
반복 가능 및 동일한 환경을 배포
자동화 배포 기술 사용자 스크립트 
CloudFormation : 인프라 구성에 활용 편리
OpsWorks : 내부 SW설치에 활용 편리
CloudFormation 선언형 프로그래밍 언어
리소스 집합을 단일 스택으로 지정 가능 
CloudFormation 구성 요소 템플릿 : 생성할 리소스의 기본 정의 
스택 : 리소스들의 집합
CloudFormation template 구조

Parameters:
 - 사용자로부터 입력을 받아야 할 경우를 위해 사용
 예시) 

생성과정


Mappings:
 - 한쪽리전에서 만든 것을 다른 리전에 적용할 때 필요(ami-id차이 있음)
  - 리전마다 매핑 수행 
Conditions:
 - 조건문 정의 : 개발용과 프로덕트용에 대한 조건 분리 등에 적용 가능

Transform:

Resource:
 - Required 항목임, 대부분의 문법을 적용하는 파트임
  예제)  IGW 생성과 Attach


 
Outputs:
 - 결과를 내보내 줄 때 출력하는 부분

CloudFormation 작성
quick start
템플릿 활용해서 구성 가능 
https://aws.amazon.com/ko/quickstart/?solutions-all.sort-by=item.additionalFields.sortDate&solutions-all.sort-order=desc
템플릿 편집 툴 vscode 등
AWS CloudFormation Designer 툴 aws 툴 : drag & drop 툴
 - 코드가 자동으로 생성 
스택 시작 및 삭제 종속성 중요
  - S3의 버킷명의 유일성 준수 : 미준수시 롤백
  - VPC를 만들고 서브넷 생성 
parameter: 문법  유형 제한, 기본값, 최소/최대 길이
정규 표현식 제약 조건 지원
파라미터 참조 : "Ref"
가상 파라미터 : "AWS::Region"

매핑 문법 Fn::FindInMap : 찾기 내장함수 
Resources:문접 종속성 : "DependsOn"
CloudFormation::Init 사용자 데이터 반영 방법의 대안으로 적용 가능 
  - 실행 시 자동 롤백 
Outputs:문법 최종 동작 후 결과 리턴
스택의 리소스에 대한 선택적 정보 제공
스택 시작 추가 옵션 롤백 방지 : DO NOTHING 
스택 정책을 설정하여 스택 업데이트 제어 
파라미터 전달 
CloudFormation모범사례 소유권 기준
템플릿 재사용(Quick Start 활용)
모든 리소스 유형의 제한을 확인 : EC2인스턴스 20개 제한 등 
템플릿 생성
  - 자격증명을 내장하지 않음 
  - 고유 파라미터 유형 이용
  - 파라미터 제약 조건 사용 
  - 배포하기 전에 템플릿 확인 : dry-run 옵션으로 확인 
스택관리 
  - 모든 스택 리소스를 관리 
  - 변경 사항 집합을 만들어 관리(업데이트 전에)
  - 스택 정책 사용

CloudFormation문제해결

https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/troubleshooting.html

실습) 과제 1: CloudFormation 스택 배포
과제 2: 스택에 Amazon S3 버킷 추가
과제 3: 스택에 Amazon EC2 인스턴스 추가

스택 배포 과제 1: CloudFormation 스택 배포

1) template 파일 이용 스택 생성

2) 생성 후 진행 과정

S3 버킷 추가 과제 2: 스택에 Amazon S3 버킷 추가

1) update를 통해서 버킷 추가 시작 

2) 업데이트 과정 진행 

3) 생성 확인

EC2추가 과제 3: 스택에 Amazon EC2 인스턴스 추가
1)  EC2 배포를 위해 스택의 리전에 해당하는 최신 AMI 지정 
     - 다른 리전에 배포하기 위해 필요 설정임 
     Parameter: 섹션에 추가 

  - 참조 사이트 : aws.amazon.com/ko/blogs/compute/query-for-the-latest-amazon-linux-ami-ids-using-aws-systems-manager-parameter-store/

2) 인스턴스 속성 편집

   InstanceType :
   ImageID:
   SubnetID:
   SecurityGroupIds:
   IamInstanceProfile:
   Tags:

참조 : docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html


 3) Update 시 변경 내역 확인 : 여기서는 ec2 추가 확인 가능

4) 진행 사항 확인

ec2 생성 확인
추가된 ec2확인 가능 

스택 삭제 delete

 

CloudFormation용 yaml 파일(샘플)

AWSTemplateFormatVersion: 2010-09-09
Description: Lab template

# Lab VPC with public subnet and Internet Gateway

Parameters:

  LabVpcCidr:
    Type: String
    AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$'
    Default: 10.0.0.0/20

  PublicSubnetCidr:
    Type: String
    AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$'
    Default: 10.0.0.0/24

  AmazonLinuxAMIID:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

Resources:

  Bucket:
    Type: AWS::S3::Bucket

  Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: !Ref AmazonLinuxAMIID
      SubnetId: !Ref PublicSubnet
      SecurityGroupIds:
        - !Ref AppSecurityGroup
      IamInstanceProfile: !Ref InstanceProfile
      Tags:
        - Key: Name
          Value: App Server

###########
# VPC with Internet Gateway
###########

  LabVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref LabVpcCidr
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: Lab VPC

  IGW:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: Lab IGW

  VPCtoIGWConnection:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref IGW
      VpcId: !Ref LabVPC

###########
# Public Route Table
###########

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref LabVPC
      Tags:
        - Key: Name
          Value: Public Route Table

  PublicRoute:
    Type: AWS::EC2::Route
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref IGW
      RouteTableId: !Ref PublicRouteTable

###########
# Public Subnet
###########

  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref LabVPC
      MapPublicIpOnLaunch: true
      CidrBlock: !Ref PublicSubnetCidr
      AvailabilityZone: !Select 
        - 0
        - !GetAZs 
          Ref: AWS::Region
      Tags:
        - Key: Name
          Value: Public Subnet

  PublicRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref PublicSubnet

###########
# IAM Role for Instance
###########

  InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles: [!Ref AppRole]
      InstanceProfileName: App-Role

  AppRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: App-Role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /

###########
# App Security Group
###########

  AppSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: App
      GroupDescription: Enable access to App
      VpcId: !Ref LabVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: App

###########
# Outputs
###########

Outputs:

  LabVPCDefaultSecurityGroup:
    Value: !Sub ${LabVPC.DefaultSecurityGroup}