#Task 10 EBS생성

Info

- Terraform VPC + EC2 with EBS instance Example

1) VPC

- VPC CIDR 은 10.0.0.0/16

- Subnet CIDR 은 10.X.0.0/24

- Subnet 은 본인이 선택한 Region의 Availability Zone 수만큼 생성 (ex. us-east-1 -> 4 Availability Zones -> 4 Subnets)

- 각 Availability Zone 별로 Public Subnet, Private Subnet 페어로 한개씩 존재하도록 생성

- Internet Gateway 생성 후 VPC에 Attach

Route Table 은 Public 과 Private Route Table 한개씩 총 2개 생성

- Public Route Table 은 Internet Gateway 로 통신 가능하도록 Route 추가 후 Public Subnet 4개와 연결 (Associatation)

- Private Route Table 은 Route 추가 없이 Private Subnet 4개와 연결 (Associatation)

- NAT Gateway 용 EIP 생성

- Public Subnet에 NAT Gateway 생성

- Private Route Table에 외부 통신을 위해서 NAT Gateway 로 통신 가능하도록 Route 추가

- SSH 허용을 위한 Admin 용 Security Group 과 HTTP 웹 접속 허용을 위한 Web Security Group, 총 두개 Security Group 생성

- Admin Security Group 에는 SSH(20) 포트를 본인 Cloud9 Public IP 허용하는 Rule 생성

- Web Security Group 에는 HTTP(80) 포트를 모두 허용하는 Rule 생성

- 각 Resource 를 생성하는 코드를 모두 Module 로 제작

2) EC2 with EBS Volume

- Instance에 Volume 사용 설정 완료된 AMI 이미지 제작

o 추가 Volume 사용을 위한 파일시스템 포맷 및 마운트

o Nginx 웹서버 설치 및 설정

o 추가 Volume 이 마운트 된 디렉토리에 HTML index 파일 생성

o 위 설정이 완료된 Instance 와 EBS 볼륨 모두 스냅샷 + AMI 생성

- 각 Public Subnet에 미리 제작된 AMI 를 사용하여 EC2 Instance 와 EBS Volume 배포.

- EC2 Instance 마다 EBS 데이터 Volume 생성 후 Attach

- 각 EC2 Instance 생성 후, User data 를 통해 index.html 테스트 웹 파일에 추가 정보 append

1) EBS 실습을 진행하기 위해서 09-ebs폴더로 경로 이동

- cd ../09-ebs/

2) AMI 생성

- 인스턴스에 EBS 가 실제 사용 가능 환경을 갖추려면, OS 설정이 필요. OS 설정이 추가된 AMI 이미지를 생성 후 배포.

AMI 를 만들기 위해서 먼저 인스턴스를 배포한다.

- AWS 콘솔에서 인스턴스 생성

- ** Instance 정보** *

이미지 : Ubuntu 24.04

Instance Type: t2.micro (or t2.small)

*t2.micro가 선택이 안될 경우 t3.small을 선택합니다.

키 페어: user**-key

Network : Default VPC(Cloud9 생성했던 VPC)

보안 그룹:

위치 무관(0.0.0.0/0)에서 SSH 트래픽 허용,

위치 무관(0.0.0.0/0)에서 HTTP 트래픽 허용

스토리지 구성 어드밴스드 선택

Storage: 10GB 크기의 gp3 EBS 볼륨 추가.

종료 시 삭제 "예" 선택

인스턴스 시작 클릭

3) Instance 접속

- 인스턴스 생성 완료되면 해당 인스턴스에 연결

- 초기 접속시에는 ubuntu 라는 유저. OS 설정 작업의 편의성을 위해 root 로 전환

- > sudo su

4) data volume attach 확인

- > lsblk

(t2.small 일 경우 출력 결과)
(t3.small 일 경우 출력 결과)

5) Block device 포맷

- 파일 시스템 생성

(t2.small 일 경우)- > sudo mkfs -t xfs /dev/xvdb

(t2.small 일 경우 출력 결과)

(t3.small 일 경우)- > sudo mkfs -t xfs /dev/nvme1n1

(t3.small 일 경우 출력 결과)

6) Mount 할 디렉토리 생성

- > mkdir /data

7) Filesystem Mount

(t2.small 일 경우) - > sudo mount /dev/xvdb /data

(t3.small 일 경우) - > sudo mount /dev/nvme1n1 /data

- 마운트 된 내역 확인.

- > df -h

(t2.small 일 경우 출력 결과)
(t3.small 일 경우 출력 결과)

8) /etc/fstab에 파일시스템 마운트 저장

- xvdb 블럭 디바이스의 UUID 확인

- > sudo blkid /dev/xvda1: LABEL="cloudimg-rootfs" UUID="e8070c31-bfee-4314-a151-d1332dc23486" TYPE="ext4" PARTUUID="5198cbc0-01" /dev/loop0: TYPE="squashfs" /dev/loop1: TYPE="squashfs" /dev/loop2: TYPE="squashfs" /dev/loop3: TYPE="squashfs"

(t2.small 일 경우 출력 결과)
(t3.small 일 경우 출력 결과)

UUID 메모장에 저장

- /etc/fstab 내용 편집

- > sudo vim /etc/fstab - 메모장에 저장했던 UUID를 이용, 수정하여 아래 내용 추가

UUID=dc20bf83-01ae-4feb-b7c0-6b234f093ae1 /data xfs defaults,nofail 0 2
추가 한 예시 스크린샷

- umount 명령으로 현재 마운트된 것 언마운트

- > umount /data

- mount 명령을 통해 다시 재 마운트 시행. /etc/fstab에 작성 내역이 정상이면 마운트 동작 이상 없이 될 것.

- > systemctl daemon-reload

- > mount -a

9) nginx 웹서버 설치

- 아래 명령을 순서대로 입력

> sudo apt update -y > sudo apt install -y nginx > sudo systemctl start nginx > sudo systemctl enable nginx

10) 웹서버 html 기본 디렉토리를 /data 디렉토리로 변경

- sites-enabled/default 파일 변경

- > vim /etc/nginx/sites-enabled/default # sites-enabled/default server { ... # root /var/www/html; -> 해당 부분 주석 처리 후 변경 root /data/html; 입력 ... }

11) /data 디렉토리에 기본 index.html 파일 생성

- > cd /data > mkdir html > cd html vim index.html

html 파일 수정

<h1>Hello!</h1>

12) nginx 재부팅

- > systemctl restart nginx

- nginx 서버 동작 확인

- > systemctl status nginx

13) 웹브라우저 접속 시 정상 작동 확인

- 해당 인스턴스의 Public IP를 복사해 웹브라우저에서 접속 여부 확인.

14) AMI 생성

- Instance 선택 -> Actions -> Image and Templates -> Create Image

- 이미지 이름 user**-image 입력 후 이미지 생성

15) AMI 로 Instance 배포 확인

- AMI ID 복사 후 메모장에 기록

- AMI 선택 -> AMI로 인스턴스 시작

이름 : ami-check-instance

유형 : t2.micro

Network : Default VPC(Cloud9 생성했던 VPC)

키 페어 : user**-key

보안 그룹 : 기존 보안 그룹 선택 -> launch-wizard-1

- Launch 시, Instance 생성 화면으로 전환.

- Instance Type, Tags 등을 설정 후 배포. 배포 후 새로 만든 EC2 인스턴스 IP로 브라우저 접속하여 웹페이지 정상인지 확인.

- EBS 볼륨 스냅샷 ID 확인 (10GiB인 스냅샷)

- 스냅샷ID 복사 후 메모장에 기록

16) Terraform 실행

업로드 된 폴더 09-ebs 하위 파일인 ebs.tfvars 파일 실행

변수설정

- ebs.tfvars 파일 확인 실행 환경에 맞게 변경

- # ebs.tfvars 파일 prefix = "user**" region = "ap-northeast-2" vpc_cidr = "10.0.0.0/16" public_subnets = [ {cidr = "10.0.1.0/24", availability_zone = "ap-northeast-2a"}, {cidr = "10.0.3.0/24", availability_zone = "ap-northeast-2c"}, ] private_subnets = [ {cidr = "10.0.11.0/24", availability_zone = "ap-northeast-2a"}, {cidr = "10.0.13.0/24", availability_zone = "ap-northeast-2c"}, ] admin_access_cidrs = ["<<YOUR_LOCAL_IP_CIDR>>"] ami_id = "<<AMI_ID>>" data_vol_snapshot_id = "<<DATA_VOLUME_SNAPSHOT_ID>>" instance_type = "t3.micro" keypair_name = "<<YOUR_KEYPAIR_NAME>>" data_volume_size = "15"

- Prefix는 알맞게 변경

- Region은 본인이 사용할 region 코드로 변경

- Subnet의 Availability Zone 값은 Region에 맞게 변경

- SSH 접속 허용할 IP 값 변경

- EC2 instance의 AMI 와 추가 데이터 볼륨 생성을 위한 Snapshot ID 설정

- EC2 instance에 설정할 keypair 명 설정

- 데이터용 EBS 볼륨 사이즈 설정

17) Init 명령으로 Terraform 수행을 위한 provider plugin 초기화 및 다운로드 수행

- terraform init

18) Plan 명령으로 Terraform 수행 전 실행 시뮬레이션 확인

- terraform plan --var-file=ebs.tfvars

19) Apply 명령으로 Terraform을 통한 Resource 생성 수행

- terraform apply --var-file=ebs.tfvars

20) Terraform 실행 내용 확인

- 선택한 Region에 VPC, Subnet, Internet Gateway, Route Table, NAT Gateway, Security Group, instance 생성 내용 확인.

- Instance에 EBS 볼륨 Attach 상태 확인.

- 생성된 Instance에 웹서버 설치 확인. Instance의 Public IP(또는 Public DNS) 로 브라우저에서 테스트 페이지 접속 확인.

21) Resource 삭제

- Terraform destroy

- Destroy 명령으로 생성된 EC2 Instance, EBS 볼륨 및 VPC 삭제 수행

- terraform destroy --var-file=ebs.tfvars

22) 폴더 삭제

- Cloud9 왼쪽 메뉴에 09-ebs폴더 우 클릭 후 Delete

Last updated