[아마존 EC2 02] 아마존 EC2 구축하기
이번에는 앞서 살펴본 내용을 바탕으로 EC2 인스턴스를 구축하겠습니다. EC2 인스턴스를 구축한 다음, EC2 인스턴스로 접속할 수 있는 다양한 접속 패턴을 알아보겠습니다.
1. 클라우드포메이션으로 EC2 인스턴스 구축하기
01 단계 EC2 인스턴스를 생성하는 클라우드포메이션의 yml 파일은 다음과 같습니다.
```EC2 생성하는 클라우드포메이션 yml 파일
파일 이름 : VPC.yml, Security_Group.yml, EC2.yml
클라우드포메이션 스택 생성 순서 : VPC.yml → Security_Group.yml → EC2.yml
```
클라우드포메이션 전체 코드는 깃허브 리포지터리 [chapter4] → [EC2] → [chapter4.3-Create-EC2] 폴더에서 확인할 수 있습니다. 이번에 구축할 구성은 다음과 같습니다.
네트워크 구성은 2개의 퍼블릭 서브넷과 4개의 프라이빗 서브넷으로 구성되며, 퍼블릭 서브넷에 EC2 인스턴스를 배치하고 인터넷 게이트웨이를 통해 EC2 인스턴스로 접속합니다.
02 단계 Security_Group.yml 파일에 보안 그룹 생성에 필요한 리소스를 추가하겠습니다.
```Security_Group.yml
Type: AWS::EC2::SecurityGroup # ➊
Properties: # ➋
GroupDescription: !Sub ${SystemName}-${EnvName}-ec2-sg
GroupName: !Sub ${SystemName}-${EnvName}-ec2-sg
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
VpcId:
Fn::ImportValue: !Sub ${EnvName}-vpc
```
➊ 타입에는 AWS::ec2::SecurityGroup을 입력하여, 보안 그룹을 생성합니다. ➋ 보안 그룹 속성을 설정합니다. GroupName에 보안 그룹의 이름을 지정합니다. GroupDescription에 보안 그룹 설명을 입력합니다. SecurityGroupIngress는 인바운드 규칙으로 접속을 허용할 IP 주소와 포트를 입력합니다. 마지막으로 보안 그룹이 생성될 VPC를 지정합니다.
03 단계 EC2.yml 파일에 EC2 인스턴스 생성에 필요한 파라미터를 추가하겠습니다.
```EC2.yml
KeyPairName: # ➊
Description: gr-product-ec2 EC2 Key Pair
Type: String
Default: gr-product-ec2-key
EC2AMI: # ➋
Description: gr-product-ec2 EC2 AMI
Type: String
Default: ami-02d081c743d676996
InstanceType: # ➌
Description: gr-product-ec2 EC2 instance type
Type: String
Default: t2.micro
```
➊ EC2 인스턴스 생성에 필요한 파라미터로는 키 페어 이름을 지정하는 KeyPairName과 ➋ AMI를 지정하는 EC2 AMI ➌ 인스턴스 유형을 지정하는 InstanceType으로 구성되어 있습니다. AMI와 인스턴스 유형은 아마존 리눅스 2와 저렴한 비용으로 이용할 수 있는 인스턴스 유형 t2.micro를 선택했습니다.
04 단계 EC2.yml 파일에 EC2 인스턴스 키 페어 생성에 필요한 리소스를 추가하겠습니다.
```EC2.yml
NewKeyPair:
Type: AWS::EC2::KeyPair # ➊
Properties:
KeyName: !Ref KeyPairName
```
➊ EC2 인스턴스 키 페어를 생성합니다. 키 페어는 AWS 관리 콘솔에서 직접 생성할 필요가 있었으나, 2022년 업데이트를 통해 클라우드포메이션으로도 생성할 수 있게 되었습니다. AWS 관리 콘솔로 키 페어를 생성하면, 생성한 키 페어가 로컬 PC로 즉시 다운로드되지만 클라우드포메이션으로 키 페어를 생성하면 파라미터 스토어에 저장됩니다.
05 단계 EC2.yml 파일에 EC2 인스턴스 생성을 위한 Resources를 추가하겠습니다.
```EC2.yml
Type: AWS::EC2::Instance # ➊
Properties: # ➋
ImageId: !Ref EC2AMI
InstanceType: !Ref InstanceType
KeyName: !Ref NewKeyPair
NetworkInterfaces: # ➌
- DeviceIndex: 0
SubnetId: { "Fn::ImportValue": !Sub "${EnvName}-public-subnet-1a" }
GroupSet:
- Fn::ImportValue: !Sub ${EnvName}-ec2-sg
AssociatePublicIpAddress: true
BlockDeviceMappings: # ➍
- DeviceName: /dev/xvda
Ebs:
VolumeSize: 100
VolumeType: gp3
Encrypted : true
```
➊ EC2 인스턴스 생성을 위해 AWS::ec2::Instance 타입을 입력합니다. ➌ EC2 인스턴스 속성을 설정합니다. 먼저 AMI 지정을 위한 ImageId와, 인스턴스 유형을 지정하기 위한 InstanceType, 키 페어 사용을 위한 KeyName을 설정합니다. ➌ EC2 인스턴스의 네트워크를 설정을 위해 NetworkInterfaces를 이용합니다. NetworkInterfaces에는 EC2 인스턴스를 배치할 서브넷과 사용할 보안 그룹을 지정할 수 있습니다. 이번에는 인터넷 게이트웨이를 통해 EC2 인스턴스에 접속할 생각이므로 AssociatePublicIpAddress을 이용해 퍼블릭 IP 주소를 할당합니다. ➍ EBS 볼륨을 사용하기 위해 BlockDeviceMappings 속성을 추가합니다. 해당 속성에서 EBS 볼륨 크기와 타입, 암호화를 설정할 수 있습니다.
디바이스 이름은 리눅스 OS에 HVM 전가상화이므로 /dev/sda1 혹은 /dev/xvda 사용할 수 있지만, AMI에 따라 디바이스 이름이 나누어질수 있으며, 이번에 선택한 AMI는 /dev/xvda 디바이스 이름을 지정해야 합니다. 디바이스 이름으로 /dev/sda1를 지정한다면, 루트 볼륨을 인식하지 못하고, EC2 인스턴스가 중지됩니다.
UI로 불러와 EC2 인스턴스 리소스 생성하기
다음은 EC2 인스턴스 생성을 어떻게 하는지 UI를 통해 확인해봅시다.
01 단계 우선 클라우드포메이션 스택을 생성합니다. EC2.yml 스택을 생성하면 다음과 같은 파라미터 값이 입력되어 있으며, 별다른 수정 없이 스택을 생성합니다.
02 단계 EC2 콘솔 화면에서 보안 그룹으로 들어와 보면, 생성된 보안 그룹을 확인할 수 있습니다.
03 단계 인바운드 규칙에서는 개방한 22번 포트와 IP 주소를 확인할 수 있습니다.
04 단계 클라우드포메이션으로 키 페어를 생성하면 파라미터 스토어에 키 페어가 저장됩니다.
05 단계 파라미터 스토어에 저장된 파라미터를 클릭하면, 파라미터에 대한 정보를 확인할 수 있으며, 여기에 키 페어를 사용하는 복호화된 암호를 확인할 수 있습니다.
복호화된 암호는 ‘BEGIN RSA PRIVATE KEY’부터 시작하여 ‘END RSA PRIVATE KEY’까지 텍스트 형식으로 지정되어 있습니다. 키 페어를 사용하려면 별도로 파일을 생성해야 하며, 맥OS은 vi 명령어를 사용하여 vi gr-product-ec2-key.pem 형식으로 파일을 만든 다음, 복호화된 암호를 붙여넣습니다.
06 단계 gr-product-ec2-key.pem 파일을 생성한 다음, 다음과 같이 복호화된 암호를 넣으면 키 페어를 이용하여 EC2 인스턴스에 접속할 수 있습니다.
윈도우의 경우 텍스트 파일을 생성하여 암호를 입력하고, 확장자를 pem으로 바꾸어주면 됩니다.
07 단계 마지막으로 EC2 콘솔 화면에서 생성한 EC2 인스턴스를 확인할 수 있습니다.
EC2 인스턴스의 상태는 실행, 중지, 종료(삭제) 3가지 상태로 나눌 수 있으며, 인스턴스 상태를 클릭해서 인스턴스를 실행, 중지, 종료(삭제) 할 수 있습니다.
2. 맥OS 환경에서 EC2 인스턴스 접속
맥OS 환경은 터미널을 이용해서 EC2 인스턴스에 접속합니다.
01 단계 ➊ 접속할는 대상 EC2 인스턴스를 선택합니다. ➋ [연결]을 클릭합니다.
02 단계 ➊ [SSH 클라이언트]를 클릭합니다. ➋ SSH 클라이언트로 접속하는 방법을 확인합니다.
▼키 페어 권한 할당 명령어
```
// ➊ 키 페어 권한 할당
chmod 400 gr-product-ec2-key.pem
```
03 단계 초기 키 페어는 너무 많은 권한을 가지고 있기 때문에, 이 상태에서 접속을 시도한다면 접속이 거부될 수 있습니다. 따라서 키 페어의 권한을 축소시킨 후에 접속을 시도해야 합니다. 터미널을 열고 키 페어가 있는 경로에서 chmod 명령어를 실행합니다.
▼SSH 접속 명령어
```
// ➊ SSH 접속
ssh -i “gr-product-ec2-key.pem” ec2-user@ec2-x-xx-xxx-xxx.ap-northeast-2.compute.amazonaws.com
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
```
➊ SSH 명령어 중에서 -i 옵션을 사용하여 내려받은 키 페어를 지정하고 EC2 인스턴스에 접속을 시도합니다. 이 명령어를 사용하여 원격 인스턴스에 접속할 수 있습니다. ‘Are you sure you want to continue connecting‘라는 문구가 나온다면 ‘yes’를 입력합니다.
04 단계 맥OS 환경에서 EC2 인스턴스로의 접속이 성공적으로 확인되었습니다. 이제 원격 인스턴스에 접속하여 필요한 작업을 수행할 수 있습니다.
▼멕OS 환경에서 EC2 인스턴스에 접속에 성공한 화면 예
3. 윈도우 환경에서 EC2 인스턴스 접속
01 단계 ➊ URL로 들어가서 https://tera-term.softonic.kr/ 테라텀 설치 파일을 다운로드합니다. 윈도우에서는 SSH 접속을 위해 테라텀(Tera Term)이라는 프로그램을 사용합니다.
02 단계 언어 설정에는 한국어를 선택하고, 나머지는 기본값을 유지한 채로 [Next]를 클릭하여 테라텀 설치를 끝마칩니다. ➊ 설치가 완료되었다면 테라텀을 실행하고, 호스트에는 접속할 EC2 인스턴스의 IP 주소(퍼블릭 IP 주소)를 입력합니다. ➋ IP를 입력했다면 [확인]을 클릭합니다.
03 단계 ➊ 처음으로 접속하는 EC2 인스턴스에 접속 시, ‘이 컴퓨터와 키를 known-host 목록에 추가(A)’라는 경고 문구가 표시됩니다. 이는 접속하고자 하는 EC2 인스턴스의 정보가 테라텀에 없다는 문구로 ‘known-host 목록에 추가’의 [계속] 버튼을 클릭합니다. 이처럼 EC2 인스턴스 정보를 테라텀에 추가하면 다음 접속을 시도할 때는 경고 문구가 뜨지 않습니다.
04 단계 ➊ 사용자 이름을 입력합니다. EC2 리눅스 환경의 기본 이름은 ec2-user입니다. ➋ 접속 EC2 인스턴스의 키 페어를 업로드합니다. ➌ 접속을 위해 [확인]을 클릭합니다.
05 단계 윈도우 환경에서 테라텀을 이용해 EC2 인스턴스로의 접속을 시도합니다. 다음과 같은 텍스트가 출력되면 성공입니다.
▼테라텀에서 EC2 인스턴스에 접속에 성공한 화면 예
