AWS - Infra
이 포스트는 AWS 인프라에 대해 간략히 알아본 후 EC2 배포, CloudFormation 생성을 진행해본다.
아래는 이번 포스트에서 다뤄볼 범위 도식화이다.
1. AWS
1.1. AWS Cloud
가용 영역 (AZ, Availability Zone)
- 한 개 이상의 데이터 센터들의 모음
Region
- 지리적 영역 내에서 격리되고 물리적으로 분리된 여러 개의 가용 영역의 모음
- 최소 2개, 최대 6개의 가용 영역으로 구성
- AWS 서비스 구성 시 가용 영역을 분산하여 구성하는 것 권장
Edge
- 외부 인터넷과 AWS 글로벌 네트워크망을 연결하는 별도의 센터
- 엣지 로케이션과 리전별 엣지 캐시로 구성됨
- CloudFront(CDN 서비스), Direct Connect, Route 53(DNS 서비스), AWS Shield(DDoS Protection), AWS Global Accelerator 가 엣지에서 동작함
2. AWS Network
AWS VPC - 리소스 격리
- Virtual Private Cloud
- 독립된 가상의 클라우드 네트워크
VPC 에 대한 더 상세한 내용은 AWS - VPC (1): 기초 를 참고하세요.
AWS VPN - 가상 사설망
- Virtual Private Network
- 공용 인터넷을 통해 가상의 사설 네트워크를 구성하여 Private 통신을 제공
- 데이터 암호화, 전용 연결 등 여러 보안 요구 충족 가능
- AWS 에서는 Site-to-Site VPN 과 클라이언트 VPN 제공
VPN 에 대한 더 상세한 내용은 AWS - Network 연결 옵션 (2): VPN 를 참고하세요.
ELB - 로드 밸런서
- Elastic Load Balancing
ELB 의 상세한 내용은 AWS - Load Balancing (1): ELB 을 참고하세요.
AWS PrivateLink - 프라이빗 연결
- 퍼블릭 인터넷에 데이터가 노출되지 않도록 하고, 내부 네트워크를 통해 AWS 서비스와 on-Premises 간의 안전한 비공개 연결 제공
PrivateLink 의 상세한 내용은 AWS - VPC (2): Endpoint 를 참고하세요.
Route53 - DNS
Route53 - DNS 의 상세한 내용은 AWS - Load Balancing (2): Route 53 를 참고하세요.
AWS 전송 게이트웨이 - 네트워크 확장
- VPC 나 On-Premises 등의 네트워크를 단일 지점으로 연결할 수 있는 라우팅 서비스
AWS 전송 게이트웨이 - 네트워크 확장 의 상세한 내용은 AWS - Network 연결 옵션 (3): Transit Gateway (전송 게이트웨이) 를 참고하세요.
AWS Direct Connect - AWS 전용 연결
- 데이터 센터, Co-Location 환경과 같은 장소에서 AWS 와의 전용 네트워크 연결을 제공하는 전용선 서비스
AWS Direct Connect 의 상세한 내용은 AWS - Network 연결 옵션 (5): AWS Direct Connect 를 참고하세요.
AWS CloudFront - CDN(컨텐츠 전송/캐시)
- 컨텐츠를 캐싱하여 서비스 제공
AWS CloudFront 의 상세한 내용은 AWS - Load Balancing (3): CloudFront 를 참고하세요.
AWS Global Accelerator - 글로벌 전송
- 글로벌 사용자를 대상으로 애플리케이션의 가용성과 성능을 개선할 수 있는 서비스
- AWS 글로벌 네트워크를 통해 사용자에서 애플리케이션으로 이어진 경로를 최적화하여 트래픽 성능 개선
AWS Global Accelerator 의 상세한 내용은 AWS - Load Balancing (4): Global Accelerator 를 참고하세요.
네트워크 보안
- 보안 그룹, 네트워크 ACL, 웹 방화벽 등이 있음
보안 그룹, 네트워크 ACL 의 상세한 내용은 AWS - Security (1): Security Group, ACL, VPC Flow Log 을 참고하세요.
3. 사전 준비
3.1. SSH
EC2 인스턴스에 접근하기 위해서는 SSH Key pair 가 필요하다.
SSH 인증 방식은 ‘user-password’ 방식과 ‘key pair file’ 방식이 있는데 ‘user-password’ 방식은 무차별 대입 공격 방식에 의해 권한 탈취의 우려가 있지만, ‘key pair file’ 방식은 개인키가 노출되지 않기 때문에 안전하고 key file 로 로그인이 가능하여 암호를 입력하지 않아도 되어 편리하다.
EC2 → Network & Security → Key Pairs 에서 생성가능하다.
- .ppk: Windows OS or Putty
- .pem: Mac OS or 리눅스 내장 SSH
SSH key 분실 시 임시로
System Manager Session Manager
를 이용하여 접근 후 관리자 권한 상승으로 임시 조치 가능
http://bit.ly/cnba0101
4. EC2 배포 테스트
- AWS console 에서 EC2 instance 배포
- 로컬에서 SSH 로 EC2 instance 접근
- EC2 instance 에 웹서비스 설치
- EC2 instance 삭제
AWS console 에서 EC2 instance 배포
아래와 같은 설정값으로 EC2 를 생성하여 배포한다.
- AMI: Amazon Linux 2 AMI
- Instance type: t2.micro
- Key pair: 위에서 생성한 key pair
- Auto-assign Public Ip: Enable
- Security Group
- SSH: source type > My IP
- HTTPS: source type > Anywhere
로컬에서 SSH 로 EC2 instance 접근
SSH -i {key file} ec2-user@{public-ip}
# 소유자만 파일을 볼 수 있도록 권한 변경
$ chmod 400 sandbox-jh.pem
$ ll
-r--------@ 1 - staff 1.6K 10 16 13:24 sandbox-jh.pem
# ssh 로 ec2 instance 접근
$ ssh -i sandbox-jh.pem ec2-user@43.201.xx.xx
The authenticity of host '43.201.xx.xx (43.201.xx.xx)' can't be established.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '43.201.xx.xx' (ED25519) to the list of known hosts.
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
4 package(s) needed for security, out of 7 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-xx-xx ~]$ whoami
ec2-user
EC2 instance 에 웹서비스 설치
# root 계정으로 전환
[ec2-user@ip-172-31-xx-xx ~]$ sudo su -
마지막 로그인: 월 10월 17 04:30:45 UTC 2022 일시 pts/0
# web 서비스 설치
[root@ip-172-31-xx-xx ~]# yum install httpd -y
# web 서비스 실행
[root@ip-172-31-xx-xx ~]# systemctl start httpd
# 페이지 구성
[root@ip-172-31-xx-xx html]# echo "Test Web Server" > /var/www/html/index.html
[root@ip-172-31-xx-xx html]# curl localhost
Test Web Server
http://public ip 로 접근하여 정상 출력되는지 확인한다.
EC2 instance 삭제
5. CloudFormation Stack 생성 테스트
- CloudFormation 스택 생성
- 스택 생성
- 생성된 자원 확인
CloudFormation
CloudFormation
은 AWS 인프라에 대해 코드로 개략적인 선언을 하는 방법으로,
생성할 AWS 인프라 자원을 코드로 정의하여 자동으로 정의된 자원을 생성하거나 삭제할 수 있다. (=IaC, Infrastructure as Code)
Template
는 AWS 인프라 지원을 코드로 정의한 파일로써 JSON, yaml 형식으로 작성 가능하다.
Template 를 CloudFormation 에 업로드하여 Stack 을 생성할 수 있으며, Stack 을 생성하면 Template 에 정의된 AWS 인프라 자원에 대해 순서대로 자동 생성된다.
Template 를 통해 EC2 instance 에 대한 OS, instance type, key-pair, tag, Security Group 을 정의하여 배포할 수 있다.
EC2 instance 가 부팅 시 자동으로 실행되는 명령어도 정의하여 배포할 수 있다. (UserData) CloudFormation Template (펼쳐보기)
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to enable SSH access to the instances. Linked to AWS Parameter
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: must be the name of an existing EC2 KeyPair.
LatestAmiId:
Description: (DO NOT CHANGE)
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
AllowedValues:
- /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref LatestAmiId
InstanceType: t2.micro
KeyName: !Ref KeyName
Tags:
- Key: Name
Value: WebServer
SecurityGroups:
- !Ref MySG
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
yum install httpd -y
systemctl start httpd && systemctl enable httpd
echo "<h1>Test Web Server</h1>" > /var/www/html/index.html
MySG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
스택이 다 생성되면 EC2 로 가서 WebServer EC2 instance 가 생성되었는지 확인해본다.
이후 스택을 삭제하면 자원을 일일히 수동 삭제할 필요없이 자동으로 생성된 자원이 삭제된다.
참고 사이트 & 함께 보면 좋은 사이트
본 포스트는 김원일, 서종호 저자의 따라하며 배우는 AWS 네트워크 입문를 기반으로 스터디하며 정리한 내용들입니다.
- 따라하며 배우는 AWS 네트워크 입문
- 따라하며 배우는 AWS 네트워크 입문 - 책가이드
- 따라하며 배우는 AWS 네트워크 입문 - 팀블로그
- SSH key 분실 시
- CloudFormation Template Download