suvera-dev ๐Ÿฅฆ

AWS ๋ฐฐํฌ์ž๋™ํ™” ๊ตฌ์ถ• _ 2. Docker ํ™˜๊ฒฝ ๊ตฌ์ถ• / ECR์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋ณธ๋ฌธ

Infra/CI CD

AWS ๋ฐฐํฌ์ž๋™ํ™” ๊ตฌ์ถ• _ 2. Docker ํ™˜๊ฒฝ ๊ตฌ์ถ• / ECR์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

suvera 2023. 7. 13. 20:43

์ด๋ฒˆ์—๋Š” ECRํ…Œ์ŠคํŠธ ์šฉ EC2๋ฅผ ๋งŒ๋“ค๊ธฐ,

๋„์ปค ํ™˜๊ฒฝ ๊ตฌ์ถ•, ๋นŒ๋“œํ•œ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ECR์— ์—…๋กœ๋“œ ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

 

 

 

- ์ตœ์ข… flow๋Š” ์œ„์™€ ๊ฐ™๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ github ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— Push ํ–ˆ์„ ๋•Œ github actions๋ฅผ ํ†ตํ•ด workflow๊ฐ€ ์ž๋™์œผ๋กœ ๋Œ์•„๊ฐ€๊ณ , ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋Š” ECR์— ์—…๋กœ๋“œ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ECS Task Definition์— ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ID๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ , ECS์— ์ž‘์—… ์ƒ์„ฑ ๋ช…๋ น์„ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ ๋œ๋‹ค !

 

 

 


 

1. ECR์„ ํ…Œ์ŠคํŠธ ํ•  EC2๋ฅผ ์ƒ์„ฑ

- ์•„์ง AutoScalingGroup ์ƒ์„ฑ ์ „์ด๋ผ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—†๋‹ค. ํ…Œ์ŠคํŠธ ํ›„ ์‚ญ์ œ ํ•ด์ฃผ์ž.

์ด๋ฆ„ : ECR-test

AMI : Amazon Linux 2023

์ธ์Šคํ„ด์Šค ์œ ํ˜• : t2.micro

์•„๋ž˜ ๋„คํŠธ์›Œํฌ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

- VPC : ๊ธฐ์กด์— ์ƒ์„ฑํ–ˆ๋˜ ๊ฒƒ.

- ์„œ๋ธŒ๋„ท : public-subnet-2a

- ํผ๋ธ”๋ฆญ IP ์ž๋™ํ• ๋‹น ํ™œ์„ฑํ™”

- ๋ณด์•ˆ๊ทธ๋ฃน : ๊ธฐ์กด ๋ณด์•ˆ๊ทธ๋ฃน -> ecs-ec2-sg

 

์ƒˆ ํ‚คํŽ˜์–ด๋ฅผ ์ƒ์„ฑ ํ•ด์ค€๋‹ค. -> ์ƒ์„ฑ๋œ pem ํ‚ค๋ฅผ ์ €์žฅํ•ด๋‘๊ธฐ ! SSH ์ ‘๊ทผ ์‹œ ํ•„์š”.

 

๋‚˜๋จธ์ง€ ์„ธ๋ถ€์ •๋ณด๋Š” ์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•ด์ค€๋‹ค. -> ์˜ค๋ฅธ์ชฝ ์ธ์Šคํ„ด์Šค ์‹œ์ž‘ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ธฐ !

 

 

2. EC2 ์ ‘์† ํ›„, Docker ํ™˜๊ฒฝ ๊ตฌ์„ฑ.

์ด์ œ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค -> ์ž‘์—… -> ์—ฐ๊ฒฐ์„ ๋ˆ„๋ฅด๊ณ  -> SSH ํด๋ผ์ด์–ธํŠธ๋กœ ์ด๋™.

ํ„ฐ๋ฏธ๋„์„ ํ‚จ๋‹ค !

pem key ๊ฐ€ ์žˆ๋Š” ๊ฒฝ๋กœ๋กœ ์ด๋™ ํ›„,

์œ„์— ์žˆ๋Š” ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

//pem ํŒŒ์ผ ๊ถŒํ•œ ๋ณ€๊ฒฝ
$ chmod 400 esc-ec2-testkey.pem

// ec2 ์ ‘์† ec2-user๋Š” ๊ณ„์ •, ip๋Š” ec2์˜ ipv4
$ ssh -i "esc-ec2-testkey.pem" ec2-user@3.38.255.173

์œ„ ์ฒ˜๋Ÿผ ์ƒˆ ๋ชจ์–‘์ด ๋œจ๋ฉด ์ ‘์†์— ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค !

์ด์ œ ๋„์ปค๋ฅผ ์„ค์น˜ํ•ด๋ณด์ž.

 

// sudo ๊ถŒํ•œ๋ถ€์—ฌ
sudo -i

// docker ์„ค์น˜
yum install -y docker

// docker ์‹œ์ž‘
systemctl start docker

// ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ
docker images

๋„์ปค ์„ค์น˜ ๊ณผ์ •
์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ

์•„์ง์€ ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค.

 

Docker file์„ ์ƒ์„ฑํ•ด๋ณด์Ÿˆ.

// dockerfile folder ์ƒ์„ฑ
$ mkdir dockerfile-folder

// dockerfile folder๋กœ ์ด๋™
$ cd dockerfile-folder/

// index.html ์ƒ์„ฑ
$ vi index.html

index.html ์•ˆ์— ์•„๋ฌด๊ฑฐ๋‚˜ ์ž‘์„ฑํ•ด๋ณด์Ÿˆ !

<!doctype html>
<h1>ecs gogo!</h1>

์ฐธ๊ณ  / vi ํŽธ์ง‘๊ธฐ ๋ช…๋ น์–ด : insert - i ๋ˆ„๋ฅด๊ณ , ์ž‘์„ฑํ•œ๋‹ค์Œ esc ๋ˆ„๋ฅด๊ณ , :wq! ํ•˜๋ฉด ์ €์žฅ ํ›„ ๋‚˜๊ฐ€์ง„๋‹ค. 

 

dockerfile์„ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜ ๋‚ด์šฉ์„ ๋ณต๋ถ™ํ•ด๋ณด์Ÿˆ

 

// dockerfile ์ƒ์„ฑ
$ vi dockerfile

 

FROM nginx:latest                           // ์„œ๋ฒ„์ด๋ฏธ์ง€ nginx๋Š” ์ตœ์‹ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•จ
LABEL name="demo"                          // dockerfile ์ž‘์„ฑ์ž

// index.html ํŒŒ์ผ์„ ํ•ด๋‹น ์œ„์น˜๋กœ ๋ณต์‚ฌ
// ๋ณดํ†ต์€ RUN ๋ช…๋ น์–ด๋ฅผ ์จ์„œ image๊ฐ€ ์˜ฌ๋ผ๊ฐ”์„ ๋•Œ, ์ˆ˜ํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค
COPY ./index.html /usr/share/nginx/html/index.html   

// nginx๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ 80ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— expose๋ฅผ ์ด์šฉํ•ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค
EXPOSE 80                                            

// nginx๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค (global directive ๋กœ daemon off๋ฅผ ์ ์šฉ)
CMD ["nginx", "-g", "daemon off;"]

MAINTAINER ๋Š” deprecated ๋˜์–ด์„œ LABEL๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค. 

 

์ด์ œ docker image๋ฅผ build ํ•œ๋‹ค.! 

 

// $ docker build -t [์ƒ์„ฑํ•  ์ด๋ฏธ์ง€๋ช…]:[ํƒœ๊ทธ๋ช…] [๋„์ปคํŒŒ์ผ์˜ ์œ„์น˜]
$ docker build -t ecs-nginx .

๋นŒ๋“œ์— ์„ฑ๊ณตํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋œฌ๋‹ค ! ์ƒ์„ฑ๋œ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

$ docker images

์ด๋ฏธ์ง€๊ฐ€ ์ž˜ ์ƒ์„ฑ๋˜์—ˆ๋‹ค. ์ด์ œ ECR๋กœ Push ํ•˜๊ธฐ ์ „์—, ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๊ฐ€ ๋™์ž‘ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž.

ecs-nginx์˜ IMAGE ID๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ๋‚ด๋ถ€์ ์œผ๋กœ 80ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ,

์™ธ๋ถ€ ์ ‘๊ทผ์€ 8000ํฌํŠธ๋ฅผ ์—ด์–ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

$ docker create -it --name ecs-nginx-container -p 8000:80 da80b8fb089b

๊ทธ ๋‹ค์Œ์œผ๋กœ docker ์ปจํ…Œ์ด๋„ˆ์˜ ID๋ฅผ ๊ฐ€์ ธ์™€์„œ start ํ•ด์ค€๋‹ค. ( ์ด๋ฏธ์ง€ id ๋ž‘ ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง์ž ~ )

 

$ docker ps -a
$ docker start 5cef98ddece6

- docker ps๋Š” ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์ŠคํŠธ ๋ถˆ๋Ÿฌ์˜ด, -a ๋ถ™์œผ๋ฉด ์‹คํ–‰ ์ค‘์ด์ง€ ์•Š์€ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์ŠคํŠธ ๋ถˆ๋Ÿฌ์˜ด

 

 

๋‹ค์Œ์œผ๋กœ, EC2 ๋ณด์•ˆ๊ทธ๋ฃน์ธ ecs-ec2-sg์— ๊ฐ€์„œ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™์— 8000ํฌํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด์–ด์„œ 3.38.255.173:8000์œผ๋กœ ์ ‘์†ํ•ด๋ณด์ž !!

์ ‘์†์ด ์ž˜ ๋˜๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋”ฐ !!

์ด์ œ ํ•„์š”์—†๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” ์ง€์›Œ์ค€๋‹ค ! 

$ docker stop 5cef98ddece6
$ docker rm 5cef98ddece6

์ฐธ๊ณ ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ง€์šฐ๋Š” ๋ช…๋ น์–ด๋Š” docker rmi 

 

3. ECR ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ƒ์„ฑํ•˜๊ธฐ

ECR ์ฝ˜์†”๋กœ ์ด๋™ํ•ด์„œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ ๋ˆ„๋ฅธ๋‹ค.

ecr-test ๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํ”„๋ผ์ด๋น—์œผ๋กœ ์ƒ์„ฑํ–ˆ๋‹ค.

 

4. ๋ฐฐํฌ์šฉ IAM ๊ณ„์ • ์ƒ์„ฑ, ๊ถŒํ•œ ๋ถ€์—ฌ

IAM ์ฝ˜์†” -> ์‚ฌ์šฉ์ž -> ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ 

- ์ด๋ฆ„ : deployer

- ์ฝ˜์†” ์—‘์„ธ์Šค ๊ถŒํ•œ์€ ์ฒดํฌ X

๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ ์ง์ ‘ ์ •์ฑ… ์—ฐ๊ฒฐ -> EC2ContainerRegistryPowerUser ๊ฒ€์ƒ‰ ํ›„ ์„ ํƒ -> ๊ถŒํ•œ ๋ถ€์—ฌ

์•„๋ž˜ ๊ถŒํ•œ์€ ECR์— ๋Œ€ํ•œ ๋ชฉ๋ก/์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๊ฐ–๋Š”๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์•ก์„ธ์Šค ํ‚ค๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ

์‚ฌ์šฉ์ž ์ƒ์„ธ -> ๋ณด์•ˆ ์ž๊ฒฉ ์ฆ๋ช…์„ ์„ ํƒํ•œ๋‹ค.

์•„๋ž˜๋กœ ๋‚ด๋ ค์„œ ์•ก์„ธ์Šค ํ‚ค ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญ.

์œ ํ˜•์€ - ๊ธฐํƒ€๋กœ ์„ ํƒํ›„ ๋งŒ๋“  ๋‹ค์Œ, .csv ํŒŒ์ผ ์ €์žฅํ•ด์ฃผ๊ธฐ 

csv ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋น„๋ฐ€ ์—‘์„ธ์Šค ํ‚ค๋Š” ๋”ฐ๋กœ ์ž˜ ์ €์žฅํ•ด๋‘์ž.

 

 

์ด์ œ EC2 ์„œ๋ฒ„๋กœ ์ด๋™ 

$ aws configure list

์œ„ ๋ช…๋ น์–ด ์ž…๋ ฅ ! ์•„์ง ์—ฐ๊ฒฐ๋œ aws ๊ณ„์ •์ด ์—†์„ ๊ฒƒ์ด๋‹ค. 

 

๋‹ค์Œ ๋ช…๋ น์–ด๋กœ aws ํด๋”, credentials ํŒŒ์ผ์„ ์ƒ์„ฑ + chmod๋กœ ๊ถŒํ•œ ๋ฐ”๊พผ ๋’ค์— ์ˆ˜์ •

$ mkdir ~/.aws
$ cd ~/.aws
$ touch credentials
$ chmod 755 ./credentials
$ vi credentials

์•„๋ž˜ ๊ตฌ๋ฌธ์„ insert ํ•˜๊ณ  ์ €์žฅํ•ด์ค€๋‹ค.

[default]
aws_access_key_id=deployer์˜ ์•ก์„ธ์Šคํ‚ค
aws_secret_access_key=deployer์˜ ๋น„๋ฐ€ํ‚ค
region=ap-northest-2
output=json

 

 

์ด์ œ ๊ณ„์ • ์ •๋ณด๊ฐ€ ๋‚˜์˜จ๋‹ค !

 

5. ECR ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ฐฐํฌ

 

ECR -> ํ‘ธ์‹œ๋ช…๋ น๋ณด๊ธฐ

 

2๋ฒˆ์˜ ๋„์ปค ์ด๋ฏธ์ง€๋Š” ์ด๋ฏธ ๋นŒ๋“œ ํ–ˆ์œผ๋ฏ€๋กœ,

1 -> 3 -> 4 ๋ช…๋ น์„ ๋”ฐ๋ผ์„œ ์‹คํ–‰ํ•ด๋ณด์ž.

 

3๋ฒˆ ๋ช…๋ น์— ecr-test ์—๋Š” ์ด๋ฏธ์ง€ ์ด๋ฆ„์ธ ecs-nginx๋กœ ๋ฐ”๊ฟ”์ฃผ์ž.

์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์™„๋ฃŒ !

Comments