AWS에 처음부터 배포하기 1) EC2 인스턴스 생성
이전에는 무료 호스팅 사이트인 Vercel을 사용하여 배포했다면, 이번에는 대중적으로 사용되고 있는 AWS를 사용하여 배포해보자.
GCP(Google Cloud Platform)와 Azure와 함께 클라우드 3대장으로 꼽히는 AWS(Amazon Web Service)는 다양한 기능(S3, CloudWatch, Lambda function 등)을 제공한다. 그 중 널리 사용되는 EC2가 무엇인지 살펴보고 생성해 볼 것이다.
참고로 이전에 AWS 관련해서 작성했던 포스팅도 같이 보면 도움될 것이다.
EC2(Elastic Compute Cloud)
AWS에서 제공하는 가상 서버로 가상화된 서버 리소스에 접근하여 클라우드라는 공간에서 크기가 유연하게 변경되는 기능을 제공한다. 지역적인 특징을 가지므로 인스턴스 생성 지역 외의 다른 지역에서는 해당 인스턴스를 사용할 수 없다.
기본적으로 유료 서비스지만, AWS에 새로운 계정을 만들면 프리 티어(Free-tier)를 통해 일정량의 EC2를 무료로 사용할 수 있다. 하지만 그 이상을 사용하거나 프리 티어가 종료되면, 기능을 사용한 만큼 요금을 지불(Pay-as-you-go)하므로 Cost monitor를 통해 요금 관리에 신경써야 한다. 그래서 AWS에서는 좀 더 저렴한 요금으로 EC2 리소스를 사용할 수 있도록 3가지 요금제를 제공한다.
- On-demand: 시간 단위로 가격이 고정된 요금제로 최소한의 비용을 지불하여 사용한다.
- Reserved: 한정된 EC2 용량으로 사용 가능하며 1–3년 동안 시간별로 할인이 적용되어 On-demand보다 조금 저렴하다.
- Spot: 경매같이 입찰 가격을 적용하여 가장 큰 할인율을 가지므로 비용 절감시 유용하다.
이제 본격적으로 EC2에 인스턴스를 생성해보자.
AWS에 로그인하여 EC2에 접속, Launch instance
를 눌러 시작한다. 그 전에 현재 regions이 제대로 설정되어있는지 확인한다.
Note: Your instances will launch in the Asia Pacific (Seoul) Region
인스턴스를 만드는데 다음과 같은 옵션을 설정해야 한다.
Name and tags
인스턴스의 이름과 태그를 지정하는 섹션으로, 네이밍 형식은 공식적으로 정해진 것이 없어 구분하기 쉽게 지으면 된다.
참고로 태그는 AWS 리소스에 할당되는 라벨이라고 한다.
Application and OS Images(Amazon Machine Image)
AMI(Amazon Machine Image)는 EC2 인스턴스를 생성할 때 필요한 환경 설정을 담은 템플릿이다.
Image라는 단어를 보고 Docker 이미지가 생각났는데, 찾아보니 약간의 차이가 있었다. Docker 이미지는 컨테이너를 만들기 위한 실행 파일 모음집 같은 것이므로 AMI보다는 조금 협소한 개념으로 이해했다.
default로 설정되어 있으면서 Free tier인 Amazon Linux 2023 AMI
와 x86 Architecture
를 차례대로 선택했다.
Browse more AMIs를 클릭하면 다양한 AMI 사이에서 Amazon Linux 2가 보이는데, Amazon Linux 2023과는 출시 차이 정도로 이해했다.
참고로 Amazon Linux AMI은 23년 12월 31일을 끝으로 지원이 종료됐다.
Instance type
다음은 CPU와 메모리 등을 고르는 인스턴스 타입을 선택한다.
나의 경우, 간단한 웹 사이트를 올릴 것이므로 t2.micro
로 선택했다.
위 네이밍 컨벤션을 참고해 t2.micro의 특징을 유추해보면
- Burst 가능한 성능(Burstable performance)을 가지는 2세대 micro 타입
이라고 할 수 있겠다. 참고로 Burstable performance는 평소에는 저수준의 CPU 리소스를 사용하다, 고수준의 성능이 필요할 때 CPU를 추가로 사용할 수 있는 것을 의미한다.
추가적으로 찾아보니 t2나 t3는 General purpose에 적합하다고 한다.
Key pair (login)
인스턴스에 보안 접속해야 할 때 필요한 것이 바로 Key pair다.
이미 만들어둔 key pair가 있다면 선택하면 되지만, 없다면 Create new key pair를 통해 새로 만들어야 한다.
key pair name에는 아래 언급된 네이밍 규칙(255 ASCII 문자, 선/후 공백 불가)을 참고하여 이름을 타이핑한다. 나는 [name]-keypair
형식으로 지었다.
Key pair type은 SSH key pair 생성시 사용할 암호화 알고리즘을 선택하는 옵션으로
- 호환성이 중요하다면 RSA(Rivest-Shamir-Adleman)를
- 높은 성능이나 효율성을 고려한다면 Ed25519 방식을 선택하면 된다.
Private key file format은 사용 중인 운영체제에 따라 고르면 되는데
- 리눅스나 유닉스를 사용한다면
.pem
을 - Windows를 사용한다면
.ppk
를 선택하면 된다.
설정을 완료하고 Create key pair를 눌러 local에 key pair를 저장하고, key pair name에 방금 만든 key pair를 선택한다.
Network settings
총 4가지 옵션이 default로 설정되어 있는데 Edit으로 해당 옵션을 수정할 수 있다.
- Network: 인스턴스를 시작하기를 원하는 VPC(Virtual Private Cloud)
- Subnet: 네트워크 인터페이스가 위치한 서브넷
- Auto-assign public IP: 인스턴스의 개인 네트워크 인터페이스에 공용 IP 주소를 자동으로 할당할지 여부
- Firewall (security groups): 인스턴스의 트래픽을 제어하는 방화벽 규칙 그룹으로 인바운드/아웃바운드 규칙을 설정할 수 있다.
일반적으로 보안 및 관리를 고려하여 새로운 보안 그룹을 생성하는 것이 좋다고 한다. 나도 내 도메인에 맞게 새 보안 그룹을 생성하여 규칙을 추가하였다.
- Allow SSH traffic from Anywhere (0.0.0.0/0): SSH(22 port) 접속시 사용
- Allow HTTPS traffic from the internet: HTTPS(443 port) 접속시 사용
- Allow HTTP traffic from the internet: HTTP(80 port) 접속시 사용
Configure storage
인스턴스의 용량 옵션을 정하는 곳으로 Advanced를 눌러보면, EBS Volumes을 설정하는 섹션임을 알 수 있다.
EBS(Elastic Block Storage)는 EC2 인스턴스에 부착되는 일종의 가상 하드 디스크로 Storage Volume(저장 공간)을 생성한다. 그 위에는 File System이 생성된다.
EBS는 특정 Availability Zone(AZ)에 생성되며 하나의 region 안에 여러 AZ가 존재할 수 있어 중심부로부터 서버의 복사본이 AZ로 전달된다. 전달받은 AZ는 한 쪽 서버에서 에러가 발생했을 때 백업 역할을 하여 서비스를 제공하는 Disaster Recovery 기능을 가진다.
EC2 같은 특정 서비스를 사용할 때 AZ를 설정해야 하는데, 전 단계인 Network settings의 Subnet이 여기에 해당한다. Subnet이 특정 AZ에 연결된 네트워크를 의미하므로 Subnet을 선택하는 것이 AZ를 선택하는 것이다.
default로 1x8 GiB gp3 Root volume (Not encrypted)
로 되어 있는데 뜯어보자.
- 1x는 볼륨(volume) 갯수를 의미, 즉 1개의 스토리지 장치가 할당된다.
- 8 GiB는 볼륨 크기를 의미, 즉 8 기비바이트(GiB)를 나타낸다.
- gp3: EBS 볼륨 타입 중 하나로 General Purpose SSD 군에 속한다. 고성능과 비용 효율성을 제공하면서 gp2보다 저렴하다.
- Root volume: EC2 인스턴스의 운영 체제가 설치된 기본 디스크로
1x8 GiB gp3
로 설정한다는 의미다. 인스턴스가 부팅시 사용된다. - Not encrypted: 데이터가 암호화되지 않은 상태로 저장된다.
나의 경우 default 설정을 건드리지 않았지만, 프로젝트 특성에 따라 다른 EBS 볼륨 타입을 선택할 수 있다.
SSD(Solid State Drives)군으로는
- General Purpose SSD(gp3, gp2): 보편적으로 사용된다.
- Provisioned IOPS SSD(io1, io2): 용량이 매우 큰 데이터베이스를 관리할 때 사용하며 가격이 비싸다.
HDD(Hard Disk Drives)군으로는
- CDD HDD(sc1): 파일 서버같이 IO 비율이 빈번하지 않거나 장시간 보관해도 괜찮은 데이터를 처리할 때 사용한다. 비용이 매우 저렴하다.
- Throughput Optimize HDD(st1): 빅데이터 데이터 웨어하우스나 로그 프로세싱 시 주로 사용한다.
- Magnetic(Standard)은 디스크 1GB 당 가장 저렴한 비용을 가진다.
sc1과 st1을 선택할 수 없는 이유는 boot volume으로 사용할 수 없기 때문이다.
boot volume과 root volume은 동일한 볼륨을 가리킨다고 한다. 조금 깊게 들어가보면 약간의 차이가 있다.
- boot volume: 인스턴스를 부팅시 사용하고
- root volume: OS(2번째에서 설정한 Amazon Linux 2023)가 설치된 주 볼륨
Advanced details
IAM 유저를 지정하거나 Hostname type, cloudWatch, metadata 설정 등 자세한 옵션을 추가할 수 있다.
Summary
지금까지 설정한 값들을 보여 준다. 또한 동일한 설정으로 추가 생성할 인스턴스 갯수를 정할 수 있다.
이렇게 GUI로 인스턴스를 생성하는 방법도 있지만 AWS CLI로도 EC2 인스턴스를 생성할 수 있다. AWS Launch Instance 버튼 아래 Review commands를 클릭하면 EC2 인스턴스를 생성할 때의 설정 값들을 명령어 형식으로 확인할 수 있다.
Instance state가 Pending에서 Running으로 바뀌면 EC2 인스턴스가 성공적으로 만들어졌다. (지금부터 과금 시작이다)
생성된 인스턴스 id를 눌러보면 상세 설정을 비롯하여 alarm, monitoring, security, netwoking, storage, tags 등 다양한 옵션을 살펴볼 수 있다.
다음 포스트에서는 SSH로 EC2 인스턴스에 접속하여 Jenkins를 설치할 것이다.