안녕하세요! 

지난시간에 AWS의 간단한 용어에 대해 설명을 해 드렸는데요

이번에는 AWS 구성에 가장 기본이 되는 VPC를 구성해 보도록 하겠습니다.

 

지난시간 이야기

[AWS] - AWS 기초시리즈 #1 - AWS 시작시 알아야 하는 용어

[AWS] - AWS 기초시리즈 #2 - AWS 가입, 계정 설정하기

[AWS] - AWS 기초시리즈 #3 - AWS IAM 계정생성

 

테라폼을 이용하여 VPC를 구축한다면 요기

[IaC/Teraform on AWS] - [Terraform on AWS] #1 - Terraform을 이용해 AWS 인프라환경을 구축 / VPC 생성

 

 

 

먼저 VPC를 구성하기전에 VPC가 무엇인지 알아야겠죠

 

VPC (Amazon Virtual Private Cloud)는 AWS 계정전용 가상 네트워크인데요,

조금 쉽게 말해 AWS에서 사용하는 네트워크를 격리하는 개념입니다.

일종의 VPC를 이용하여 하나의 AWS계정에서 멀티테넌트로 여러 서비스를 분리하실 수 있습니다!

 

 

 

VPC구성순서

1. VPC 구성 

2. VPC 내부의 subnets 구성

3. 인터넷게이트웨이 생성

4. NAT 게이트 웨이 생성

5. 라우팅테이블 설정

 


 

아래의 어키텍처처럼  보통 서비스의 가용성을 높이기 위하여 2개의 존으로 분리하여 구성을 해줍니다.

이 하나의 존을 Availability Zone이라 부르며 줄여서 AZ라고 부릅니다!

 

 

 

지금은 굉장히 복잡해 보이실수 있지만 차근차근 하나씩 구성을 해보면서 더 익혀보도록 하죠

 

1. VPC 구성

 

AWS 내부의 리소스에서 사용할 네트워크을 구분짓기 위하여 VPC를 먼저 구성을 해줄텐데요

추가적으로 VPC는 리전에 종속되기에 다른 리전에 나누어서 같은 서비스를 연결하고자 하실때에는 각각 리전별로 다른 VPC를 구성 후 VPC Peering을 통해 연결해주어야 합니다.

 

VPC에서 사용하는 사설 아이피 대역은 아래와같습니다.

- 10.0.0.0 ~ 10.255.255.255(10/8 prefix)

- 172.16.0.0 ~ 172.31.255.255(182.16/12 prefix)

- 192.168.0.0 ~ 192.168.255.255(192.168/16 prefix)

 

일단 만들어 봅시다.

 

1) aws 콘솔에 로그인을 한 후 서비스메뉴에서 VPC를 클릭하여 줍니다.

 

2) VPC 대시보드에서 Your VPCs를 클릭 후 Create VPC를 눌러줍니다.

 

 

3) 생성할 VPC의 이름과 CIDR 블록을 지정해줍니다.

aws default vpc CIDR은 172.31.0.0/16 입니다.

 

10.100.0.0/16 대역으로 VPC를 구성해 주었으며

한번 구성된 네트워크 대역대는 변경이 불가하므로 넉넉하게 잡아주시는거를 추천드립니다.

 

 

 

 

 

2. Subnet 구성

 

 

서브넷은 보통 처음 아키텍쳐의 Availability Zone 내부의 네트워크개념인데요

보통 하나의 AZ안에 Public subnet, Private subnet 이렇게 2개의 서브넷으로 구성해줍니다.

 

 

 

구성을 할때 이건 퍼블릭용, 이건 프라이빗용 나누어서 구성을 하진않고

서브넷중에서 인터넷게이트웨이와 연결될(외부에서 접속할 수 있는) 서브넷을 public subnet이라고 하며

인터넷접근할 필요없는 내부 리소스들을 묶어줄 서브넷을 Private subnet이라고 합니다. 

 

Public subnet

  • 인터넷 트래픽이 가능합니다.

  • Public IP를 통해 외부에서 접근이 가능합니다.

  • 인터넷 게이트웨이가 연결될 서브넷입니다.

Private subnet

  • 인터넷연결이 불가능합니다.

  • 외부 트래픽이 필요 할 경우 Public subnet에 있는 NAT게이트웨이로 트래픽을 보내 외부와 통신합니다.

 

먼저 구성을 해 봅시다!

 

(먼저 구성하시기 전에 어떠한 대역대를 사용할 것인지 정해두면 구성을 좀 더 수월하게 진행하실 수 있습니다.)

보통 운영환경에서는 가용성을 높이기 위하여 Multi AZ로 구성을 하기때문에 AZ별로 2개의 서브넷(퍼블릭, 프라이빗) 

한국리전에 3개의 AZ가 있기때문에 6개의 서브넷을 구성하기도 합니다.

 

(나중되면 어떤 대역대가 어떤 서브넷인지 구분하기 어려워...지기도.....)

 

 

 

AZ1

AZ2

AZ3

Public subnet

10.100.10.0/24

10.100.20.0/24

10.100.30.0/24

Private subnet

10.100.11.0/24

10.100.21.0/24

10.100.31.0/24

 

저는 보통 위에 도표와 같이 제가 구분하기 쉽게 퍼블릭 서브넷을 10단위로 맞춰서 구성하고

프라이빗 서브넷은 홀수의 IP대역으로 구성해줍니다.

 

하지만 저는 테스트용도이기에

AZ 1개로 구성을 진행하겠습니다 ^0^

 

1) VPC 대시보드에서 subnet 클릭

 

 

2) 생성할 서브넷의 이름과 좀전에 생성하였던 VPC, AZ, 그리고 서브넷 CIDR블록을 지정하여줍니다.

저는 AZ1존에 public subnet을 먼저 생성하였습니다.

 

서브넷 생성과정을 반복합니다.

AZ를 하나 사용할 경우 2개의 서브넷 (Public, Private)을 생성하시면 됩니다!

 

 

 

 

 

3. Internet Gateway 구성

 

 

VPC에 종속되며, 인터넷에 연결하기 위하여 생성하는 게이트웨이입니다.

보통 public subnet에있는 내부 IP주소를 외부 IP로 매핑해주는 NAT같은 역할을 합니다.

 

1) VPC대시보드에서 Internet Gateways 항목을 누른후 Create internet gateway를 클릭하여줍니다.

 

 

 

2) 이름을 지정해준 후 생성해줍니다.

 

 

3) 처음에 생성하였던 VPC에 attach해줍니다.

 

 

 

4. NAT Gateway 구성

 

Private subnet에 연결된 서버들이 인터넷에 연결될 수 있도록 만들어주는 게이트웨이입니다.

 

 

1) VPC대시보드에서 NAT Gateways 항목을 누른후 Create NAT Gateway를 클릭하여줍니다.

 

 

 

2) NAT G/W가 위치될 서브넷을 지정후 IP를 할당해줍니다.

  • Subnet :  좀전에 생성하였던 public subnet을 선택해줍니다.

    • NAT가 Public zone에 위치하고 있어야 private 대역대에 있는 리소스들을 NAT를 통하여 외부로 연결할 수 있습니다.

  • EIP : 기존에 할당된 EIP가 있으시면 선택해주시고, 없다면 오른쪽에 Allocate Elastic IP address를 선택해 EIP를 생성해줍니다.

  • Tag : 저는 NAT의 이름을 함께 tag로 지정해주었습니다.

 

현재까지 구성한 것을 도식화 하여보면 아래와 같습니다!

(subnet은 AZ1존에 각각 하나씩 구성하였습니다.)

 

 

 

5. Routing Table구성

 

실제 트래픽을 게이트웨이들로 보내주려면 라우팅테이블을 구성해줘야합니다.

(저는 subnet별로 룰을 다르게 지정해줄거기에 public subnet용 라우트테이블, private subnet용 라우트테이블 2개를 구성하겠습니다.)

 

1) VPC대시보드에서 Route Tables 항목을 누른후 Create route table을 클릭하여줍니다.

 

 

 

 

2) Route Table의 이름과 VPC를 지정해줍니다.

1,2번을 반복하여 private subnet용 라우트테이블로 생성해줍니다.

 

3) 생성한 Route table에 rule을 지정해줍니다.

  • Public subnet

    • Destination : 0.0.0.0/0 

    • Target : Internet Gateway

 

  • Private subnet

    • Destination : 0.0.0.0/0 

    • Target : NAT Gateway

 

4) 생성한 Route table에 Subnet을 연결해줍니다.

public route table에는 public subnet을, private table에는 private subnet을 연결

 

  • Public route table

 

 

 

프라이빗 테이블에도 마찬가지로 해당 작업을 반복해줍니다.

 

 

이렇게 해서 아래와 같은 VPC구성을 마쳤습니다!

 

 

 

환경을 구성할때 네트워크 망을 구축하는것이 가장먼저 해야할 일이기에

VPC구성은 가장 중요한 구성 중 한가지이며

숙지하는데 도움이 되였기를 바랍니다 ㅎ.ㅎ

 

다음시간에는

가장 많이 들어보았던 EC2 구성을 해볼꼐욤!

 

 

 

 

 

 

참고

https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/what-is-amazon-vpc.html

 

# 참고
https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/what-is-amazon-vpc.html

 

 
AWS에서 기본적으로 제공하는 모니터링 서비스인 Cloudwatch룰 이용하면 Memory, Disk 사용량을 보지 못하는 제한이 있기에
Custom metric을 이용하여서 상세 모니터링 필요
 
작업 정보
- Amazon Linux AMI를 이용
- 모니터링할 서버에 접속 후 진행
 
 
작업순서
  1. Packge 설치
  2. 모니터링 스트립트 다운
  3. AWS Credential 입력
  4. Cron 일정을 걸어 Cloudwatch에 주기적으로 지표전송
  5. Cron 재시작
 

 
1. Packge 설치
 
sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64
 
 
2. 모니터링 스트립트 다운
curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O
 
unzip CloudWatchMonitoringScripts-1.2.2.zip && \
rm CloudWatchMonitoringScripts-1.2.2.zip && \
cd aws-scripts-mon
 
 
3. AWS Credential 입력
cp awscreds.template awscreds.conf
 
3-1 )  awscreds.conf 파일 수정
AWSAccessKeyId= <my-access-key-id>
AWSSecretKey= <my-secret-access-key>
 
# 해당 access key와 secret key는 IAM 항목에서 발급 / 확인 가능합니다.
 
 
 
4. Cron 일정을 걸어 Cloudwatch에 주기적으로 지표전송
 
4-1 )  Crontab 편집
crontab -e
 
4-2)  5분마다 메모리 및 디스크 공간 사용량을 CloudWatch에 전송
*/5 * * * * /home/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-avail --mem-util --swap-util
--disk-path=/ --disk-space-util --disk-space-avail --disk-space-used --from-cron
 
 
5. Cron 재시작
$ sudo service crond restart
Stopping crond:                                            [  OK  ]
Starting crond:                                            [  OK  ]
 
 
> AWS Console창에서 확인 했을 시 
사용자 지정 네임스페이스 항목에 새롭게 추가된 지표들을 확인 할 수 있습니다.
 


 


 
 
> Cron에 등록하지 않고 메모리 지표를 수집하고 CloudWatch로 보내려면
./mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --mem-used --mem-avail

추가적으로 Custom Metric 지표 옵션
> Custom Metric 지표 옵션
이름
설명
--aggregated[=only]
인스턴스 유형, AMI ID 및 리전 전체에 대한 집계 측정치를 추가합니다. =only 값은 선택 사항입니다. 이 값을 지정하면 스크립트는 집계된 메트릭만 보고합니다.
--auto-scaling[=only]
Auto Scaling 그룹에 대해 집계된 측정치를 추가합니다. =only 값은 선택 사항입니다. 이 값을 지정하면 스크립트는 Auto Scaling 메트릭만 보고합니다. 스크립트를 사용하여 IAM 계정 또는 역할과 연결된 IAM 정책에는 EC2 작업 DescribeTags를 호출할 권한이 있어야 합니다.
--aws-access-key-id=VALUE
호출자를 식별하는 데 사용할 AWS 액세스 키 ID를 지정합니다. --aws-secret-key 옵션과 함께 사용해야 합니다. 이 옵션은 --aws-credential-file 매개 변수와 함께 사용하지 마십시오.
--aws-credential- file=PATH
AWS 자격 증명이 들어 있는 파일의 위치를 제공합니다.
이 매개 변수는 --aws-access-key-id 및 --aws-secret-key 매개 변수와 함께 사용할 수 없습니다.
--aws-iam-role=VALUE
AWS 자격 증명을 제공하는 데 사용되는 IAM 역할을 지정합니다. =VALUE 값이 필요합니다. 자격 증명을 지정하지 않으면 EC2 인스턴스와 연결된 기본 IAM 역할이 적용됩니다. IAM 역할은 하나만 사용할 수 있습니다. IAM 역할이 없거나 IAM 역할이 두 개 이상 있는 경우 스크립트에서는 오류를 반환합니다.
이 옵션은 --aws-credential-file--aws-access-key-id 또는 --aws-secret-key 매개 변수와 함께 사용하지 마십시오.
--aws-secret-key=VALUE
CloudWatch에 대한 요청에 서명하는 데 사용할 AWS 보안 액세스 키를 지정합니다. --aws-access-key-id 옵션과 함께 사용해야 합니다. 이 옵션은 --aws-credential-file 매개 변수와 함께 사용하지 마십시오.
--disk-path=PATH
보고할 디스크를 선택합니다.
PATH는 보고해야 할 파일 시스템의 마운트 지점 또는 마운트 지점에 있는 모든 파일을 지정할 수 있습니다. 디스크를 여러 개 선택하는 경우 각 디스크에 대해 --disk-path=PATH를 지정합니다.
/ 및 /home에 마운트된 파일 시스템의 디스크를 선택하려면 다음 매개 변수를 사용하십시오.
--disk-path=/ --disk-path=/home
--disk-space-avail
선택한 디스크의 DiskSpaceAvailable 측정치를 수집하여 전송합니다. 이 측정치는 GB 단위로 보고됩니다.
Linux 운영 체제의 예약된 디스크 공간으로 인해 사용된 디스크 공간 및 사용 가능한 디스크 공간이 총 디스크 공간에 정확하게 더해지지 않을 수 있습니다.
--disk-space-units=UNITS
디스크 공간 사용량을 보고할 단위를 지정합니다. 단위를 지정하지 않으면 디스크 공간은 GB 단위로 보고됩니다. UNITS는 바이트, KB, MB, GB 중 하나입니다.
--disk-space-used
선택한 디스크의 DiskSpaceUsed 측정치를 수집하여 전송합니다. 기본적으로 이 측정치는 GB 단위로 보고됩니다.
Linux 운영 체제의 예약된 디스크 공간으로 인해 사용된 디스크 공간 및 사용 가능한 디스크 공간이 총 디스크 공간에 정확하게 더해지지 않을 수 있습니다.
--disk-space-util
선택한 디스크의 DiskSpaceUtilization 측정치를 수집하여 전송합니다. 이 측정치는 % 단위로 보고됩니다.
참고로, 이 스크립트로 계산되는 디스크 사용률 측정치는 df -k -l 명령으로 계산한 값과 다릅니다. df -k -l 명령으로 계산한 값이 더 유용하다고 생각하면 스크립트에서 계산 값을 변경할 수 있습니다.
--from-cron
Cron에서 스크립트를 호출하는 경우 이 옵션을 사용합니다. 이 옵션을 사용하면 모든 진단 결과가 표시되지 않지만 사용자 계정의 로컬 시스템 로그에 오류 메시지가 전송됩니다.
--help
사용 정보를 표시합니다.
--mem-avail
MemoryAvailable 측정치를 수집하여 전송합니다. 이때, MB 단위로 보고합니다. 이 지표는 애플리케이션 및 운영 체제에서 할당한 메모리만 사용량으로 계산하며, --mem-used-incl-cache-buff 옵션을 지정하는 경우 캐시 및 버퍼 메모리도 사용량에 포함시킵니다.
--mem-used
MemoryUsed 측정치를 수집하여 전송합니다. 이때, MB 단위로 보고합니다. 이 지표는 애플리케이션 및 운영 체제에서 할당한 메모리만 사용량으로 계산하며, --mem-used-incl-cache-buff 옵션을 지정하는 경우 캐시 및 버퍼 메모리도 사용량에 포함시킵니다.
--mem-used-incl-cache-buff
이 옵션을 추가하면 --mem-util--mem-used 및 --mem-avail의 지표를 보고할 때 현재 캐시 및 버퍼용으로 사용 중인 메모리가 "사용됨"으로 표시됩니다.
--mem-util
MemoryUtilization 측정치를 수집하여 % 단위로 보고합니다. 이 지표는 애플리케이션 및 운영 체제에서 할당한 메모리만 사용량으로 계산하며, --mem-used-incl-cache-buff 옵션을 지정하는 경우 캐시 및 버퍼 메모리도 사용량에 포함시킵니다.
--memory-units=UNITS
메모리 사용량을 보고할 단위를 지정합니다. 단위를 지정하지 않으면 메모리는 MB 단위로 보고됩니다. UNITS는 바이트, KB, MB, GB 중 하나입니다.
--swap-used
SwapUsed 측정치를 수집하여 전송합니다. 이때, MB 단위로 보고합니다.
--swap-util
SwapUtilization 측정치를 수집하여 전송합니다. 이때, % 단위로 보고합니다.
--verbose
스크립트가 수행한 작업에 대한 자세한 정보를 표시합니다.
--verify
측정치를 수집하는 스크립트 실행을 테스트하고, 전체 HTTP 요청을 준비하지만 데이터를 보고하기 위해 CloudWatch를 실제로 호출하지는 않습니다. 이 옵션 역시 자격 증명이 제공되었는지 확인합니다. 자세한 정보 표시 모드에서 실행 중인 경우 이 옵션은 CloudWatch에 전송될 측정치를 출력합니다.
--version
스크립트의 버전 번호를 표시합니다.
참고 URL
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/mon-scripts.html
 
 
  Lambda 함수와 CloudWatch를 이용하여 Daily 백업 및 삭제
 
- 추가사항
백업 대상
백업 주기
백업 시간
보관 주기
삭제 대상
삭제 주기
삭제 시간
기타
실행중인 EC2 Instances AMI, Volumes
매일
당일 새벽 5시
7일
생성 후 7일이 지난 AMI, Snapshots
매일
당일 새벽 6시
 
 
- 순서는 다음과 같습니다.
    1. IAM 설정
    2. Lambda 함수작성 및 테스트
    3. CloudWatch 설정

 

 
 

IAM 설정

: AMI와 볼륨의 Snapshot을 위하여 EC2 Access를 허용하는 정책을 설정하여 줍니다.
 
1. 서비스에서 IAM을 클릭후 대쉬보드로 들어간 뒤 [역할] , [역할 만들기]를 차례대로 클릭하여 줍니다.
 
 
 
 
 
2. Lambda를 이용하여 자동백업, 삭제를 시행할 것이기에 [Lambda]서비스를 클릭한 후 아래의 [다음]을 누릅니다.
 
3.  다음 페이지의 [정책생성] 버튼을 클릭, 그 후 JSON탭을 누르면 보이는 기존의 코드를 지운 후  다음과 같은 코드를 넣어줍니다.
 
# IAM Role 
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2:*",
            "Resource": "*"
        }
    ]
}
 
 
4.  아래에 나오는 [정책검토] 버튼을 클릭한 후 설정값에 맞는 이름을 넣어 주고 아래의 [정책생성] 버튼을 클릭합니다.
 
5.  다시 처음의 IAM 대쉬보드에서 [역할], [역할만들기]를 재 클릭 해줍니다.
 
6.  정책에 만들어주었던 이름을 검색하여 선택한 후 아래의 [다음]버튼을 클릭합니다.
 
7. 역할 이름을 지정하여 줍니다. (태그 값은 지정하지 않고 넘어갔습니다.) 그 후 아래의 [역할 만들기] 버튼을 눌러줍니다.
 
 
8.  기존 검색창 리스트에 방금 만들어 논 역할이 보여지게 됩니다.
 
 
 
 

Lambda 함수 작성 및 테스트

: 사전에 실행 중 이던 EC2 인스턴스에 태그를 지정해 주어서 태그 값이 지정된 인스턴스만 백업이 진행되도록 하였습니다.
(Key : tag-key , Value : Backup) 
 
 
1. 서비스의 Lambda 대쉬보드에 들어가 [함수생성] 버튼을 클릭하여 줍니다.
 
 
2.  이름을 지정 한 후 처음에 지정해주었던 IAM역할을 선택해 줍니다. 그 후 [함수생성] 버튼을 클릭합니다.
: Python 2.7 이용
 
 
3.  기존의 Default코드를 삭제한 후 다음과 같은 코드를 넣고 아래의 기본설정 제한시간을 1분으로 조정해 줍니다.
 
# Automated AMI Backups
#
# @author Robert Kozora <bobby@kozora.me>
#
# This script will search for all instances having a tag with "Backup" or "backup"
# on it. As soon as we have the instances list, we loop through each instance
# and create an AMI of it. Also, it will look for a "Retention" tag key which
# will be used as a retention policy number in days. If there is no tag with
# that name, it will use a 7 days default value for each AMI.
#
# After creating the AMI it creates a "DeleteOn" tag on the AMI indicating when
# it will be deleted using the Retention value and another Lambda function
import boto3
import collections
import datetime
import sys
import pprint
ec = boto3.client('ec2',region_name='ap-northeast-2')
#image = ec.Image('id')
def lambda_handler(event, context):
     
    reservations = ec.describe_instances(
        Filters=[
            {'Name': 'tag-key', 'Values': ['backup', 'Backup']},
        ]
    ).get(
        'Reservations', []
    )
    instances = sum(
        [
            [i for i in r['Instances']]
            for r in reservations
        ], [])
    print "Found %d instances that need backing up" % len(instances)
    to_tag = collections.defaultdict(list)
    for instance in instances:
        try:
            retention_days = [
                int(t.get('Value')) for t in instance['Tags']
                if t['Key'] == 'Retention'][0]
        except IndexError:
            retention_days = 7
        #for dev in instance['BlockDeviceMappings']:
        #    if dev.get('Ebs', None) is None:
        #        continue
        #    vol_id = dev['Ebs']['VolumeId']
        #    print "Found EBS volume %s on instance %s" % (
        #        vol_id, instance['InstanceId'])
            #snap = ec.create_snapshot(
            #    VolumeId=vol_id,
            #)
             
            #create_image(instance_id, name, description=None, no_reboot=False, block_device_mapping=None, dry_run=False)
            # DryRun, InstanceId, Name, Description, NoReboot, BlockDeviceMappings
            create_time = datetime.datetime.now()
            create_fmt = create_time.strftime('%Y-%m-%d')
         
            AMIid = ec.create_image(InstanceId=instance['InstanceId'], Name="Lambda - " + instance['InstanceId'] + " from " + create_fmt, Description="Lambda created AMI of instance " + instance['InstanceId'] + " from " + create_fmt, NoReboot=True, DryRun=False)
             
            pprint.pprint(instance)
            #sys.exit()
            #break
         
            #to_tag[retention_days].append(AMIid)
             
            to_tag[retention_days].append(AMIid['ImageId'])
             
            print "Retaining AMI %s of instance %s for %d days" % (
                AMIid['ImageId'],
                instance['InstanceId'],
                retention_days,
            )
    print to_tag.keys()
     
    for retention_days in to_tag.keys():
        delete_date = datetime.date.today() + datetime.timedelta(days=retention_days)
        delete_fmt = delete_date.strftime('%m-%d-%Y')
        print "Will delete %d AMIs on %s" % (len(to_tag[retention_days]), delete_fmt)
         
        #break
     
        ec.create_tags(
            Resources=to_tag[retention_days],
            Tags=[
                {'Key': 'DeleteOn', 'Value': delete_fmt},
            ]
        )
 
 
4.  상단에 [저장] 버튼을 누른 후 옆에 테스트 버튼을 눌러 테스트 파일을 만들고 테스트 버튼을 한번 더 눌러 실행시켜줍니다.
 
5.  EC2 대시보드로 가서 AMI와 볼륨의 Snapshot이 제대로 작동되는지 확인하여 줍니다
 
 

CloudWatch 설정

: 지정된 시간에 함수를 트리거 하기 위하여 CloudWatch를 이용합니다.
 
 
1.  서비스항목에서 CloudWatch를 클릭하여 옆 대시보드에 [규칙] , [규칙생성]을 차례대로 클릭하여 줍니다.
 
 
2.  지정된 시간에 함수를 시행할 것이므로 [일정]탭으로 들어 간 후 [Cron식]으로 매일 새벽 5시에 백업시간을 지정해 줍니다. 그 후 옆에 연결할 Lambda함수를 좀전에 작성하였던 Backup함수를 지정해 줍니다.
: Cron식은 GMT시간으로 계산되기때문에 한국시간에서 -9시간을 해주면 됩니다. 
 
Cron 식
00 20 ? * MON-SUN *
 
 
3.  아래에 [세부 정보 구성] 버튼을 클릭한 후 설정할 CloudWatch의 이름과 설명을 기술한 후 [규칙 생성] 버튼을 클릭합니다.
 
 
 
 
 

Scheduled Delete
 
주기적으로 삭제하는 방법도  Lambda함수코드와 Cron식만 달라지고 2,3번 항목에 대해선 동일한 방법으로 진행됩니다.
 
 
# Automated AMI and Snapshot Deletion
#
# @author Robert Kozora <bobby@kozora.me>
#
# This script will search for all instances having a tag with "Backup" or "backup"
# on it. As soon as we have the instances list, we loop through each instance
# and reference the AMIs of that instance. We check that the latest daily backup
# succeeded then we store every image that's reached its DeleteOn tag's date for
# deletion. We then loop through the AMIs, deregister them and remove all the
# snapshots associated with that AMI.
import boto3
import collections
import datetime
import time
import sys
ec = boto3.client('ec2', 'ap-northeast-2')
ec2 = boto3.resource('ec2', 'ap-northeast-2')
images = ec2.images.filter(Owners=["self"])
def lambda_handler(event, context):
    reservations = ec.describe_instances(
        Filters=[
            {'Name': 'tag-key', 'Values': ['backup', 'Backup']},
        ]
    ).get(
        'Reservations', []
    )
    instances = sum(
        [
            [i for i in r['Instances']]
            for r in reservations
        ], [])
    print "Found %d instances that need evaluated" % len(instances)
    to_tag = collections.defaultdict(list)
    date = datetime.datetime.now()
    date_fmt = date.strftime('%Y-%m-%d')
    imagesList = []
    # Set to true once we confirm we have a backup taken today
    backupSuccess = False
    # Loop through all of our instances with a tag named "Backup"
    for instance in instances:
    imagecount = 0
        # Loop through each image of our current instance
        for image in images:
            # Our other Lambda Function names its AMIs Lambda - i-instancenumber.
            # We now know these images are auto created
            if image.name.startswith('Lambda - ' + instance['InstanceId']):
                # print "FOUND IMAGE " + image.id + " FOR INSTANCE " + instance['InstanceId']
                # Count this image's occcurance
            imagecount = imagecount + 1
                try:
                    if image.tags is not None:
                        deletion_date = [
                            t.get('Value') for t in image.tags
                            if t['Key'] == 'DeleteOn'][0]
                        delete_date = time.strptime(deletion_date, "%m-%d-%Y")
                except IndexError:
                    deletion_date = False
                    delete_date = False
                today_time = datetime.datetime.now().strftime('%m-%d-%Y')
                # today_fmt = today_time.strftime('%m-%d-%Y')
                today_date = time.strptime(today_time, '%m-%d-%Y')
                # If image's DeleteOn date is less than or equal to today,
                # add this image to our list of images to process later
                if delete_date <= today_date:
                    imagesList.append(image.id)
                # Make sure we have an AMI from today and mark backupSuccess as true
                if image.name.endswith(date_fmt):
                    # Our latest backup from our other Lambda Function succeeded
                    backupSuccess = True
                    print "Latest backup from " + date_fmt + " was a success"
        print "instance " + instance['InstanceId'] + " has " + str(imagecount) + " AMIs"
    print "============="
    print "About to process the following AMIs:"
    print imagesList
    if backupSuccess == True:
        myAccount = boto3.client('sts').get_caller_identity()['Account']
        snapshots = ec.describe_snapshots(MaxResults=1000, OwnerIds=[myAccount])['Snapshots']
        # loop through list of image IDs
        for image in imagesList:
            print "deregistering image %s" % image
            amiResponse = ec.deregister_image(
                DryRun=False,
                ImageId=image,
            )
            for snapshot in snapshots:
                if snapshot['Description'].find(image) > 0:
                    snap = ec.delete_snapshot(SnapshotId=snapshot['SnapshotId'])
                    print "Deleting snapshot " + snapshot['SnapshotId']
                    print "-------------"
    else:
        print "No current backup found. Termination suspended."
 
CleanUp Cron 식
00 21 ? * MON-SUN *
 
 
 
 
지난 시간에 AWS 을 가입하는법을 알아봤는데요,
AWS에 가입하자마자 제일 먼저 해야할 일은 IAM을 생성하여 사용자를 만드는 것이라 생각합니다.
(무수한 보안의 문제들로 인하여 root계정은 위험해염)
 
IAM이란?
IAM (AWS Identity and Access Management)의 약자로 AWS에서 보안을 담당하는 주요한 요소입니다.
AWS를 사용할 수 있는 사용자를 만드는 것 뿐만아니라, 각각의 사용자 및 리소스들의 권한과 같은 설정도 해줄수 있는 아주 막강하고 AWS의 대표되는 리소스입니다.
 
쉽게 설명드리자면, 보안을 철저히 해야하는 데이터센타의 경우 모든사람이 출입이 가능하지 않습니다.
보통 출입카드가 있거나 혹은 사전에 방문등록을 신청하여 임시 출입증을 부여 받습니다.
 
IAM도 이런 AWS의 보안관문이라고 생각하시면 쉬우실것같습니다.
 
IAM의 Dashboard를 한번 들어가볼까요?
 
  • IAM 콘솔화면 접속 
하단의 리소스 항목에서 IAM을 선택하셔도 괜찮고, 상단의 검색창에서 IAM으로 검색하셔도 됩니다.
 
  • IAM Dashboard

왼쪽 메뉴바에 보면 Users, Groups, Roles, Policies등의 정책들을 설정할 수 있는 항목이 있습니다.
 
자 그럼 root계정이 아닌 admin권한의 IAM 사용자를 추가하여 볼까요??
 
  • Admin Group 생성
User를 바로 생성해도 무방하지만 저는 Admin그룹을 미리 만들어 두고 나중에 사용자들을 Admin그룹에 넣어줄 예정입니다.
 
이름을 지정해준 후 admin 그룹에 맞는 정책을 연결해줍니다.
 
 
 
 
 
잘 생성된 것을 확인하실 수 있습니다!
 
 
  • Admin User 생성
왼쪽의 users 탭에서 Add user를 클릭하여줍니다.
 
 
 
사용할 User 이름을 입력한 후 Console 접속방식이기에 AWS Management Console access를 선택해줍니다. 또한 Custom password를 선택하여 임시 비밀번호를 입력해줍니다!
(아래의 Require password reset 을 체크해주면 처음 로그인할시 비밀번호 변경을 하게 됩니다.)
 
 
위에서 생성하였던 admin그룹에 쏙! 넣어줍니다.
(group을 생성하지 않았다면 가장 오른쪽에 Attach exising policies directly를 클릭하여 AdministratorAccess policy를 연결하여 줍니다.)
 
 
다음항목은 Tag를 지정해 주는 항목인데 저는 생략하였습니다 ㅎ.ㅎ 
 
잘 생성이 되었네요!
오른쪽에 Send email을 클릭하여 aws 접속정보를 email로 받아봅니다
 
 
생성한 admin IAM으로 접속해볼까요?
 
로그아웃을 해준 후 email로 받은 접속정보를 통해 콘솔화면에 접속합니다.
 
과연 로그인이 잘 될까요?
 
 
 
 
화면 상단에 admin계정으로 들어오신것을 확인하실 수 있습니다!
 
성! 공!
 
 
 
 

AWS 서비스를 사용하기 위해서는  계정부터 만들어야 겠지요?

이 페이지에서는 AWS 계정을 만드는 법을 설명해 드리도록 하겠습니다.

 


 

 

1. 계정만들기

01 ) 먼저, 아마존 웹 서비스(이하 AWS) 사이트에 접속합니다 

http://aws.amazon.com/

콘솔 로그인창으로 바로 접속하셔도 무방합니다.

http://console.aws.amazon.com

 

콘솔창으로 바로 들어오신분은 [AWS계정 새로만들기]를 클릭합니다



0 2 ) AWS 계정 생성 페이지로 들어옵니다.

필요한 빈칸을 모두 입력하여 줍니다.

이메일주소, 암호, 사용자가 지정하는 계정이름을 적고 하단의 주황색 버튼을 누릅니다.

 

0 3 ) 연락처 정보를 기입합니다.

우편번호는 나중에 비밀번호를 찾을때 사용될 수 있으니 따로 메모해두기를 권장해 드립니다.

추가적으로 해당사항은 영문으로 기입하여 주시길 바랍니다.

 

 

0 4 ) 결제정보를 입력합니다.

 

AWS 가입을 하는데 유료이진 않지만 서비스들을 사용한 만큼 지불하는 방식이기에

미리 결제할 카드를 지정해야 가입이 됩니다.

AWS같은경우 1년간 Free-tier로 정해진 규격내에서 무료로 이용가능하니때문에 

Free-tier로 지원가능한 서비스를 확인하시고 사용하시기를 권장해드립니다. (추가적인 비용이 나가는것을 방지하기 위해)

 

 

AWS Free-tier란? : https://aws.amazon.com/ko/free/faqs/?ft=nf

Free-tier 지원영역 확인하기 : https://aws.amazon.com/ko/free/

 

 

0 5 )  전화번호 인증을 거칩니다.

 

0 6 ) 지원플랜을 선택합니다.

 

 

사용자의 요구에 맞는 플랜을 선택합니다.

우선을 기본플랜으로 가입을 해보도록 하겠습니다.

 

0 7 ) 완료창 확인

가입이 잘 되었나 확인을 하기 위해 콘솔창으로 로그인을 해봅니다.

가입하였던 이메일과 암호를 입력하여 줍니다.

 

 

처음 가입하였을 시 루트 사용자가 되기때문에 상단에 루트사용자 로그인인지 확인하고 접속을 해줍니다.

 

 

입 시 내가 지정해준 이름으로 잘 로그인이 된걸 확인하실수 있습니다.

친절히 AWS측에서 가입축하 메일도 보내줍니다^0^

 

 

AWS에는 많은 용어, 약어들이 있기 때문에  처음 시작하는 사람들에게 다소 어렵게 느껴질 수 있습니다.

들어가기에 앞서 서비스 용어들에 대하여 간략히 짚고 넘어가도록 하겠습니다. 

 


 

 

AWS에 대해 좀 찾아보신 분이라면 리전(Region) 과 가용영역(Availability Zone) 이라는 용어를 아마 가장 많이 접했으리라 생각이 듭니다.

그많큼 많이 쓰이고 AWS 각 서비스 전반적으로 나오는 용어들 이기에 먼저  정리하도록 하겠습니다.

 

리전 (Region)

 

AWS는 세계 여러곳에서 호스팅 되고 있습니다. 이 위치들은 지리적으로 리전과 가용영역으로 구성되는데요. 

쉽게 설명해드리자면 리전은 AWS의 모든 서비스가 위치하고 있는 물리적인 장소 즉 개별 지리영역이라고 생각하시면 됩니다.

위의 그림을 보면 현재 12개의 리전으로 분리되어 있는데 이렇게 여러 리전을 두는 이유는

첫번째로 재해에 대비하기 위해서 입니다,

물리적인 위치가 서로 다른 전 세계의 나라들이 하나의 서버를 사용하게 되면 재해나 불가피한 서버의 중지가 발생했을 시 서비스를 공급할 수 없기 떄문에

여러곳에 리전을 두어 재해(지진, 화재, 홍수 등)시 다른 리전으로 서비스 하도록 만들어 줍니다.

또 한가지 다른 이유는  네트워크의 속도입니다.

만약에 미국 서버에있는 서비스를 우리나라에서 접속하면  아무래도 속도가 느려질 수 밖에 없는데 만약 우리나라에 서비스를 제공하는것을 목표로 하고있으면 

우리나라 리전에 서버를 만들어 서비스 하면  빠른 속도로 서비스가 가능해 집니다.

우리나라에도 서울리전이 2016년 1월에 추가가 되었으며, 서울리전에는 2개의 가용영역(AZ)이 포함되어 있습니다.

(제가 이 글을 2018년도에 작성을 하였는데 2020년 04월 기준 21개의 리전으로 늘어났습니다!) 

 

 

한국 ↔ AWS Region간 응답속도 비교

 

가용영역 (Availability Zone -AZ)

 

가용영역 (AZ)는 리전안에 있는 IDC(데이터센터)를 의미합니다. 

기본적으로 각 리전안에는 2개 이상의 가용영역을 가지고 있으며, 현재 서울리전에는 2개의 가용영역이 있습니다.

두개의 가용영역이 있다는 말은 즉 2개의 독립적인 IDC를 운영하고 있는 얘기 입니다.

AWS에서는 2개이상의 가용영역에 서비스를 올려 로드밸런싱을 이용해 트래픽을 분산시킬것을 권장하고 있습니다.

이는 한쪽 가용영역이 작동하지 않더라도 무중단 서비스를 제공하도록 하기 위해서 입니다. (가용영역을 높이기 위하여)

(2020년 04월 현재 서울리전에는 3개의 AZ가 있습니다)

 

 

엣지로케이션 (Edge Location)

 

 

엣지로케이션은 Region과 AZ와는 별개로 AWS의 CDN서비스인 CloudFront와 AWS의 DNS서비스인 Route53의 캐시서버라고 생각하시면 됩니다.

CDN과 DNS같은 서비스의 서버는 리전과 별개로 여러개의 엣지로케이션에 적용되어 서비스 되고 있으며 서울리전에는 3개의 엣지 로케이션이 있습니다. (17년 10월 기준)

 

 

* CDN (Content Delivery Network) : 콘텐츠 (HTML, 이미지, 동영상 등)를 사용자들이 빠르게 받을 수 있도록 전 세계 곳곳에 위치한 캐시서버에 복제해 주는 서비스

 

 

 


AWS 주요 서비스 용어


 

Computing

- EC2 (Elastic Compute Cloud) :  서버

클라우드 서버 인스턴스로 컴퓨팅 파워의 규모를 자유자재로 변경할 수 있는 웹 서비스 입니다.

 

- ECS (EC2 Container Service) : EC2를 Docker 컨테이너로 관리

EC2 인스턴스 클러스터에서 도커 컨테이너를 실행하고 관리할 수 있는 서비스

 

- ELB (Elastic Load Balancing) : L4

트래픽을 분산해주는 역할을 하며 고가용성 서비스를 구축할 수 있도록 합니다.

 

- Lambda (이벤트 응답으로 코드 자동실행)

서버없이 작성한 프로그래밍 코드를 실행하는 환경을 제공하는 서비스

 

- Auto Scaling (서버 자동증설)

트래픽에 따라 EC2인스턴스들을 확장해주는 서비스

위의 ELB와 함께 사용되는 기능으로 특정 트래픽을 초과시 자동으로 EC2 인스턴스를 생성하고

다시 트래픽이 줄어들면 추가 생성하였던 EC2인스턴스들을 삭제하는 서비스입니다.

Storage

S3(Simple Storage Service) : 일반 스토리지

HTTP 프로토콜과 연동되는 스토리지 정적 사이트를 호스팅하는데 사용할 수도 있습니다.

이미지 파일이나 웹 사이트 정적 요소 관리등을 할 수 있으며, 파일 마다 버전관리가 가능합니다.

 

Glacier: 저렴한 스토리지

S3와 다르게 저장에만 특화되어있는 저렴한 스토리지 서비스로 저장하고 꺼내는데 3시간-5시간 걸린다는 특징을 가지고 있습니다.

S3에서 -> Glacier로 백업을 자동 생성하도록 설정이 가능합니다.. (데이터 백업및 보관용도)

 

EBS(Elastic Block Store) : 빠른 블록 스토리지

EC2 인스턴스에 가상하드를 달아주는 서비스로 EC2 인스턴스는 종료되고 재생성될때 기존의 데이터가 유지가 안되지만

EBS를 연결하여 EBS에 파일을 저장한다면 EC2 인스턴스와 관계 없이 영구적으로 보관이 가능합니다.

Networking

CloudFront : AWS의 CDN 서비스

리전에 상관없이 엣지 로케이션 기준으로 가장 가까운 곳에서 파일 캐시를 가져오기 때문에 속도도 빠르며 비용도 EC2 혹은 S3로 서비스를 제공하는것 보다 더 저렴하다고 합니다.

 

Route 53: AWS의 DNS 서비스

EC2 / ELB 같은 서비스와 결합하여 사용이 가능하며 Route 53으로 L4 혹은 GSLB(Global Server Load Balancing)를 구축 할 수 있습니다.

 

VPC(Virtual Private Cloud) : 네트워크

클라우드 가상 네트워크 구축 서비스로서 내부망(VPN)을 구축하거나 서브넷을 나눠 네트워크를 용도별로 관리가 가능하도록 제공합니다.

VPC를 이용하여 AWS안에서 논리적으로 격리된 공간을 프로비저닝 할 수 있으며, 

IP 주소범위 선택, 서브넷 생성, 라우팅테이블 및 네트워크 게이트웨이 구성 등 가상 네트워크 환경을 완벽하게 제어할 수 있습니다.

 

Database

DynamoDB: AWS의 NoSQL 데이터베이스 서비스

 

RDS(Relational Database Service):  RDBMS 클라우드 서비스

Amazon Aurora, MySQL, MariaDB, PostgreSQL, Oracle, SQL Server등을 지원하고 있습니다.

 

- Redshift AWS의 DW설정, 페타규모

 

ElastiCache: Database Caching 서비스 (캐시 클러스터)

Memcached, Redis 호환을 지원하고 있습니다.

 

Security

- IAM(Identity and Access Management) : 사용자 계정 및 그룹관리

개별 IAM계정을 만들어 사용자별로 AWS 보안자격증명을 부여

 

- Security Group : 방화벽

AWS에서 제공하는 방화벽 서비스입니다.

 

- CloudTrail : 계정에대한 API호출기록

Management Console, SDK, 명령줄 도구 및 고급 AWS서비스를 사용하여 

실행한 API호출에 대한 정보와 로그파일을 전달

 

Management Tools

CloudWatch :모니터링 시스템

AWS 서비스들을 모니터링하거나 알람을 받는 설정들을 할 수 있는 서비스입니다.

특정 금액 초과할 경우 알람을 받거나 EC2의 CPU 사용률등의 알람도 가능합니다.

 

CloudFormation : 리소스 템플릿 생성

AWS 서비스 생성 및 배포 자동화 템플릿 서비스입니다.

AWS의 다양한 서비스들을 이용하여 아키텍쳐 구현시 미리 만들어놓은 템플릿(JSON)을 이용하여 생성하거나 직접 템플릿을 작성하여 관리가 가능하도록 하는 서비스입니다.

 

 


EC2 Instance  요금측정  관련 용어


 

- On-Demand :  사용한 만큼 지불하는 요금정책

온디맨드 요금은 인스턴스 유형에 따라 시간낭 또는 초당 컴퓨팅 파워에 대한 비용을 지불합니다.

 

- RI (Reserved Instance) :  일정기간동안 사용할 것을 미리 지정하고 할인을 적용받는 요금정책

최대 75%까지 할인 받을 수 있으며, 수요가 꾸준하거나 예측가능한 애플리케이션의 경우 

예약인스턴스를 적용하여 상당한 비용을 절감할 수 있습니다.

 

- Spot Instance :  입찰방식의 요금정책

사용자가 입찰가격을 제시하면  AWS에서 남는 인스턴스들에 대해  spot가격을 책정하는데

이 가격이 입찰가격 내로 들어오면 인스턴스가 자동으로 가동되는 방식

하지만 제시한 입찰가격보다 AWS spot가격이 더 높을 경우 인스턴스가 중지되므로

항상 실행되어야하는 인스턴스유형에는 적합하지 않습니다.

최대 90% 까지 할인 된 가격으로 인스턴스를 사용할 수 있습니다.

 

 

 

 

 

 

  • 참고자료

AWS EC2 Document 

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/using-regions-availability-zones.html

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html

https://aws.amazon.com/ko/ec2/pricing/

Region간 Latency비교

https://www.cloudping.info/

AWS VPC Document

https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/what-is-amazon-vpc.html

 

 

 

+ Recent posts