# #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폴더로 경로 이동

\-       <mark style="color:blue;">cd ../09-ebs/</mark>

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2Fd9UjjdT5ptyM0OMEnpls%2Fimage.png?alt=media&#x26;token=5a39749d-62f7-4537-bf26-467ea83222cb" alt=""><figcaption></figcaption></figure>

2\)    AMI 생성

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

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

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

\- \*\* Instance 정보\*\* \*

이미지 : Ubuntu 24.04

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

\***t2.micro가 선택이 안될 경우&#x20;**<mark style="color:red;">**t3.small**</mark>**을 선택합니다.**

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FAU4J68zNc6HZm18nYxVf%2Fimage.png?alt=media&#x26;token=b7f37601-666e-4809-a3d3-2d6a81dd0849" alt=""><figcaption></figcaption></figure>

키 페어: user<mark style="background-color:red;">\*\*</mark>-key

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

보안 그룹:&#x20;

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

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

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FQapk4yucpo05MwqVfzEs%2Fimage.png?alt=media&#x26;token=c6c82985-0434-492f-9b7a-37f4293a5ef3" alt=""><figcaption></figcaption></figure>

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

Storage: 10GB 크기의 gp3 EBS 볼륨 <mark style="color:red;">**추가**</mark>.

종료 시 삭제 "예" 선택

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FRGu7GbpHfSmadyK5ENFo%2Febs%20storage.jpg?alt=media&#x26;token=4782bd57-e0e6-4ab5-8d78-af4bca0cea80" alt=""><figcaption></figcaption></figure>

인스턴스 시작 클릭

&#x20;

3\) Instance 접속

![](https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2F9cdi4KKroQzkXLBtqr9x%2Fimage.png?alt=media\&token=a33af98a-2934-4c5c-b2ed-ed2646b0a7f3)

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

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

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FO2OOGOZCkyrGeZqx9sgA%2Fimage.png?alt=media&#x26;token=0c110c98-f7f8-484a-8577-551680425cd6" alt=""><figcaption></figcaption></figure>

\- > <mark style="color:blue;">sudo su</mark>

4\) data volume attach 확인

\- > <mark style="color:blue;">lsblk</mark>\\

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2F12i5ufa99X9b76qWo5uy%2Fimage.png?alt=media&#x26;token=c94c713d-132c-4bb2-a4f6-23716eb9a105" alt=""><figcaption><p>(t2.small 일 경우 출력  결과)</p></figcaption></figure>

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2F91GtDBetQRcahKNyH2eu%2F20230810_165153.png?alt=media&#x26;token=9e695eaa-5c89-4dbd-b253-617a71796f0b" alt=""><figcaption><p>(<mark style="color:red;">t3.small</mark> 일 경우 출력  결과)</p></figcaption></figure>

5\) Block device 포맷

\- 파일 시스템 생성

(t2.small 일 경우)- > <mark style="color:blue;">sudo mkfs -t xfs /dev/xvdb</mark>

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FwKcYC3LIqix7XNa1qULP%2Fimage.png?alt=media&#x26;token=59790285-9af3-461d-b565-a7514f63f76a" alt=""><figcaption><p>(t2.small 일 경우 출력  결과)</p></figcaption></figure>

(<mark style="color:red;">t3.small</mark> 일 경우)- > <mark style="color:blue;">sudo mkfs -t xfs /dev/nvme1n1</mark>

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FF2YXbVibTQhih8Jr55xr%2F20230810_165157.png?alt=media&#x26;token=71523322-1407-4ccd-ba1a-d2271a8a6977" alt=""><figcaption><p>(<mark style="color:red;">t3.small</mark> 일 경우 출력  결과)</p></figcaption></figure>

6\) Mount 할 디렉토리 생성

\-  > <mark style="color:blue;">mkdir /data</mark>

7\) Filesystem Mount

(t2.small 일 경우)  - > <mark style="color:blue;">sudo mount /dev/xvdb /data</mark>

(<mark style="color:red;">t3.small</mark> 일 경우)  - > <mark style="color:blue;">sudo mount /dev/nvme1n1 /data</mark>

\- 마운트 된 내역 확인.

\- > <mark style="color:blue;">df -h</mark>\\

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2F0mdfs89JmV7dHP74kxhS%2Fimage.png?alt=media&#x26;token=5d068970-7054-4c39-aea0-aaebd57423ce" alt=""><figcaption><p>(t2.small 일 경우 출력  결과)</p></figcaption></figure>

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FZimPyaZOuvd78vNNLWsb%2F20230810_165159.png?alt=media&#x26;token=7e58012c-7757-461e-88b6-d2b14b89c376" alt=""><figcaption><p>(<mark style="color:red;">t3.small</mark> 일 경우 출력  결과)</p></figcaption></figure>

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

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

\- > <mark style="color:blue;">sudo blkid</mark>\
/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"\\

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2F7Cqsbhk1n7VIoXtogOod%2Fimage.png?alt=media&#x26;token=47614d1a-d724-42d7-9202-58c622c9e0eb" alt=""><figcaption><p>(t2.small 일 경우 출력  결과)</p></figcaption></figure>

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2Fd3XK6in2Qy8neN4evOYk%2F20230810_165201.png?alt=media&#x26;token=b5216d42-e7cc-4ced-97eb-508d71ef2688" alt=""><figcaption><p>(<mark style="color:red;">t3.small</mark> 일 경우 출력  결과)</p></figcaption></figure>

**UUID 메모장에 저장**

\- /etc/fstab 내용 편집

\- > <mark style="color:blue;">sudo vim /etc/fstab</mark>\
\- 메모장에 저장했던 UUID를 이용, 수정하여 아래 내용 추가

```
UUID=dc20bf83-01ae-4feb-b7c0-6b234f093ae1 /data xfs defaults,nofail 0 2
```

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2F0LALmGo41cq6cWfMOLpe%2Febs%20storage2.jpg?alt=media&#x26;token=4388667c-b7d5-4ae7-b5bd-7154c1d8015a" alt=""><figcaption><p>추가 한 예시 스크린샷</p></figcaption></figure>

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

\- > <mark style="color:blue;">umount /data</mark>

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

\- > <mark style="color:blue;">systemctl daemon-reload</mark>&#x20;

\- > <mark style="color:blue;">mount -a</mark>

9\) nginx 웹서버 설치

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

\> <mark style="color:blue;">sudo apt update -y</mark>\
\> <mark style="color:blue;">sudo apt install -y nginx</mark>\
\> <mark style="color:blue;">sudo systemctl start nginx</mark>\
\> <mark style="color:blue;">sudo systemctl enable nginx</mark>

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

\- sites-enabled/default 파일 변경

\-       > <mark style="color:blue;">vim /etc/nginx/sites-enabled/default</mark>\
\# sites-enabled/default\
\
server {\
&#x20;   ...\
&#x20;   \
&#x20;   \# root /var/www/html; -> 해당 부분 주석 처리 후 변경\
&#x20;   <mark style="color:blue;">root /data/html;</mark> 입력\
&#x20;   ...\
}

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FGRvE8u1iqfb5IfDKSciw%2Fimage.png?alt=media&#x26;token=20468863-9b89-4128-8b13-e10d5fd75781" alt=""><figcaption></figcaption></figure>

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

\- > <mark style="color:blue;">cd /data</mark>\
\> <mark style="color:blue;">mkdir html</mark>\
\> <mark style="color:blue;">cd html</mark>\ <mark style="color:blue;">vim index.html</mark>\\

html 파일 수정

<mark style="color:blue;">\<h1>Hello!\</h1></mark>

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FDtGSECdtOA6VBrQ15ISI%2Fimage.png?alt=media&#x26;token=3cbe8fef-b563-439a-b17d-8d100d9ead58" alt=""><figcaption></figcaption></figure>

12\) nginx 재부팅

\- > <mark style="color:blue;">systemctl restart nginx</mark>

\- nginx 서버 동작 확인

\- > <mark style="color:blue;">systemctl status nginx</mark>

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

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

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FHy7y5HFH0NEPU5j927VQ%2Fimage.png?alt=media&#x26;token=48a4e86c-3723-438b-b177-6cd85280daff" alt=""><figcaption></figcaption></figure>

##

14\) AMI 생성

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FIlu3BTz0HBofyi01M1Ca%2Fimage.png?alt=media&#x26;token=2fc44e45-7638-4442-b4c0-8e5ef33a67ea" alt=""><figcaption></figcaption></figure>

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

\- 이미지 이름 user<mark style="background-color:red;">\*\*</mark>-image 입력 후 이미지 생성

15\) AMI 로 Instance 배포 확인

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

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

이름 : ami-check-instance&#x20;

유형 : t2.micro&#x20;

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

키 페어 : user\*\*-key&#x20;

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

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FYMjsay2cMF1CDuR7AIwU%2Fimage.png?alt=media&#x26;token=0bc7977a-ec26-4e74-b6d3-6e790fe567eb" alt=""><figcaption></figcaption></figure>

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

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

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

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FioMn8ktrosaKeuPfPauw%2Fimage.png?alt=media&#x26;token=207734c6-65db-44bd-9fc7-f978d9732e3f" alt=""><figcaption></figcaption></figure>

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

16\)  Terraform 실행

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

변수설정

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

\- # ebs.tfvars 파일\
\
prefix              =       "user<mark style="background-color:red;">\*\*</mark>"\
region              =       "ap-northeast-2"\
vpc\_cidr            =       "10.0.0.0/16"\
\
public\_subnets      =       \[\
&#x20;   {cidr = "10.0.1.0/24", availability\_zone = "ap-northeast-2a"},\
&#x20;   {cidr = "10.0.3.0/24", availability\_zone = "ap-northeast-2c"},\
&#x20;   ]\
\
private\_subnets = \[\
&#x20;   {cidr = "10.0.11.0/24", availability\_zone = "ap-northeast-2a"},\
&#x20;   {cidr = "10.0.13.0/24", availability\_zone = "ap-northeast-2c"},\
]\
\
admin\_access\_cidrs      =   \[<mark style="background-color:red;">"<\<YOUR\_LOCAL\_IP\_CIDR>>"</mark>]\
\
ami\_id                  =   <mark style="background-color:red;">"<\<AMI\_ID>>"</mark>\
data\_vol\_snapshot\_id    =   <mark style="background-color:red;">"<\<DATA\_VOLUME\_SNAPSHOT\_ID>>"</mark>\
\
instance\_type           =   "t3.micro"\
keypair\_name            =   <mark style="background-color:red;">"<\<YOUR\_KEYPAIR\_NAME>>"</mark>\
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 초기화 및 다운로드 수행

\- <mark style="color:blue;">terraform init</mark>

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

\- <mark style="color:blue;">terraform plan --var-file=ebs.tfvars</mark>

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

\- <mark style="color:blue;">terraform apply --var-file=ebs.tfvars</mark>

20\)  Terraform 실행 내용 확인

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

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

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

<figure><img src="https://2744132130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZTJxGWFIVE9QNQ5WJSQ1%2Fuploads%2FFV0YYMCpNuekdZX6lnre%2Fimage.png?alt=media&#x26;token=abdd59ca-e252-472b-a826-ec42cb09ff40" alt=""><figcaption></figcaption></figure>

21\)  Resource 삭제

\- Terraform destroy

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

\- <mark style="color:blue;">terraform destroy --var-file=ebs.tfvars</mark>

22\) 폴더 삭제

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