MAENG.
Development

AWS ECS์™€ CodePipeline

2022. 03. 10

๋“ค์–ด๊ฐ€๊ธฐ ์ „์—.

AWS ECS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋จผ์ € Docker์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

Docker๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๊ธฐ๋ฐ˜ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ”Œ๋žซํผ์ด๋‹ค. ๊ฐ€์ƒ ๋จธ์‹ ์ฒ˜๋Ÿผ ๋…๋ฆฝ๋œ ์‹คํ–‰ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ, ์šด์˜์ฒด์ œ๋ฅผ ์„ค์น˜ํ•˜ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ ์šด์˜์ฒด์ œ๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„ค์น˜ ์šฉ๋Ÿ‰์ด ์ ๊ณ  ์‹คํ–‰ ์†๋„ ๋˜ํ•œ ๋น ๋ฅด๋‹ค. ์˜ˆ์ „์—๋Š” ์œˆ๋„์— VM Ware์™€ ๊ฐ™์€ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์„ค์น˜ํ•˜์˜€์œผ๋‚˜ ์ตœ๊ทผ์—๋Š” ๋ฆฌ๋ˆ…์Šค ๊ณ„์—ด์—์„œ Docker๊ฐ€ ๊ทธ ์—ญํ• ์„ ๋Œ€์‹ ํ•˜๊ณ  ์žˆ๋‹ค. Docker์™€ ๊ฐ€์ƒ๋จธ์‹ ์˜ ์ฐจ์ด๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์€ ํ•˜๋“œ์›จ์–ด ์Šคํƒ์„ ๊ฐ€์ƒํ™”ํ•˜์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด์™€ ๋‹ฌ๋ฆฌย ์šด์˜์ฒด์ œ ์ˆ˜์ค€์—์„œ ๊ฐ€์ƒํ™”๋ฅผ ์‹ค์‹œํ•˜์—ฌ ๋‹ค์ˆ˜์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผย OS ์ปค๋„์—์„œ ์ง์ ‘ ๊ตฌ๋™ํ•œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ํ›จ์”ฌ ๊ฐ€๋ณ๊ณ  ์šด์˜์ฒด์ œ ์ปค๋„์„ ๊ณต์œ ํ•˜๋ฉฐ, ์‹œ์ž‘์ด ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์šด์˜์ฒด์ œ ์ „์ฒด ๋ถ€ํŒ…๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ›จ์”ฌ ์ ๊ฒŒ ์ฐจ์ง€ํ•œ๋‹ค.

Amazon ECS๋Š” Cloud ํ™˜๊ฒฝ์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ Container Service๋กœ OS๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„ ๊ฐ€๋ณ๊ณ , ๋น ๋ฅธ ๋ฐฐํฌ, ๋น ๋ฅธ ๊ธฐ๋™์ด ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋น„์Šค๋กœ, ์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด Dockerfile์„ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œํ•˜์—ฌ ECR์— ์—…๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ…Œ์Šคํฌ๋ฅผ ์ž‘์„ฑํ•ด์„œ ํด๋Ÿฌ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ์˜ ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ํŒŒ์ดํ”„๋ผ์ธ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

1. Dockerfile ์ž‘์„ฑ

Docker ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ค์ •ํŒŒ์ผ๋กœ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ–‰๋™ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์„ค์ •ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ๋Š” Svelte์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๋กœ Svelete ๊ฐœ๋ฐœ๋‚ด์šฉ์€ ์ƒ๋žตํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

FROM node:alpine as builder
 
# work dir ๋ฅผ ๋งŒ๋“ค๊ธฐ
RUN mkdir -p /usr/src/app
 
# work dir ๊ณ ์ •
WORKDIR /usr/src/app
 
# NPM ์„ค์น˜
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package*.json /usr/src/app/package.json
RUN npm install --silent
 
# ์†Œ์Šค๋ฅผ ์ž‘์—…ํด๋”๋กœ ๋ณต์‚ฌํ•˜๊ณ  ๋นŒ๋“œ
COPY . /usr/src/app
RUN npm run build
 
FROM nginx:alpine
 
# nginx์˜ ๊ธฐ๋ณธ ์„ค์ •์„ ์‚ญ์ œ
RUN rm -rf /etc/nginx/conf.d
 
# ์•ฑ์˜ nginx์„ค์ • ํŒŒ์ผ์„ ์•„๋ž˜ ๊ฒฝ๋กœ์— ๋ณต์‚ฌ
COPY conf /etc/nginx
 
# ์œ„์—์„œ ์ƒ์„ฑํ•œ ์•ฑ์˜ ๋นŒ๋“œ์‚ฐ์ถœ๋ฌผ์„ nginx์˜ ์ƒ˜ํ”Œ ์•ฑ์ด ์‚ฌ์šฉํ•˜๋˜ ํด๋”๋กœ ์ด๋™
COPY --from=builder /usr/src/app/public /usr/share/nginx/html
 
# 80 ํฌํŠธ ์˜คํ”ˆ
EXPOSE 80
 
# container ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•  command. nginx ์‹œ์ž‘ํ•จ
CMD ["nginx", "-g", "daemon off;"]

2. ์ด๋ฏธ์ง€ ๋นŒ๋“œ

Docker์—์„œ ์ด๋ฏธ์ง€๋ž€, ์„œ๋น„์Šค ์šด์˜์— ํ•„์š”ํ•œย ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ,ย ์†Œ์Šค์ฝ”๋“œ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ,ย ์ปดํŒŒ์ผ๋œ ์‹คํ–‰ ํŒŒ์ผ ์„ ๋ฌถ๋Š” ํ˜•ํƒœ์ด๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ์„ค์ •๊ฐ’(ํ™˜๊ฒฝ)์„ ์ง€๋‹Œ ๊ฒƒ์œผ๋กœ ๋”์ด์ƒ์˜ ์˜์กด์„ฑ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๊ฑฐ๋‚˜ ์ด๊ฒƒ์ €๊ฒƒ ์„ค์น˜ํ•  ํ•„์š” ์—†๋Š” ์ƒํƒœ์˜ ํŒŒ์ผ์„ ์˜๋ฏธํ•œ๋‹ค.

$ docker build -t {IMGAE_TAG_NAME} {DOCKER_FILE_PATH}

Untitled

์—ฌ๊ธฐ์„œ ์ž ๊น! ๋งŒ์•ฝ Mac์„ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด??

์กฐ๊ธˆ์žˆ๋‹ค ECR์— ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

MAC m1 OS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ arm๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ์— m1 ๋…ธํŠธ๋ถ์œผ๋กœ ๋„์ปคํŒŒ์ผ์„ ๋นŒ๋“œํ•˜์—ฌ ๋„์ปค์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ฉด platform์ด linux/arm64์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ amazonlinux OS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” AWS EC2๋Š” linux/arm64๊ฐ€ ์•„๋‹Œ linux/amd64 ์ด๊ธฐ ๋•Œ๋ฌธ์— M1์—์„œ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ EC2 ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ--platformย ์˜ต์…˜์œผ๋กœ linux/arm64๋กœ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ด๋ฏธ์ง€ ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด Docker ๋Œ€์‹œ๋ณด๋“œ์˜ ์ด๋ฏธ์ง€ ๋ฉ”๋‰ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Untitled

์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์œผ๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋™์ž‘ํ•˜๋Š”์ง€ ์‹คํ–‰์‹œ์ผœ๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

$ docker run -it -p {HOST_PORT}:{CONTAINER_PORT} {DOCKER_IMAGE}

Untitled

์ •์ƒ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰์ด ๋œ๋‹ค๋ฉด, ๋Œ€์‹œ๋ณด๋“œ์—์„œ๋„ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Untitled

์„ค์ •ํ•œ ํฌํŠธ๋กœ ์ ‘์†ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์ƒ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Untitled

์ด์ œ Docker ์ด๋ฏธ์ง€๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑํ–ˆ์œผ๋‹ˆ, ์ด๋ฏธ์ง€๋ฅผ AWS ECR์— ์—…๋กœ๋“œ ํ•ด๋ณด์ž!

3. ํ™˜๊ฒฝ ๊ตฌ์ถ•

3-1. VPC ์ƒ์„ฑ

VPC ๋Œ€์‹œ๋ณด๋“œ์—์„œ VPC ๋งˆ๋ฒ•์‚ฌ๋ฅผ ํ†ตํ•ด VPC๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

Untitled

3-2. ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ Subnet Name์„ ์ˆ˜์ •

Untitled

3-3. ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์—์„œ Public๊ณผ Private ๋‘˜๋กœ ๋ฌถ์–ด์ค€๋‹ค.

Public ์„œ๋ธŒ๋„ท๋“ค์„ ์—ฐ๊ฒฐ์‹œ์ผœ public-rt๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  Private ์„œ๋ธŒ๋„ท๋“ค์„ ์—ฐ๊ฒฐ์‹œ์ผœ private-rt๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

Untitled

3-4. ์ธํ„ฐ๋„ท ๊ฒŒ์ดํŠธ์›จ์ด ์ƒ์„ฑํ•˜์—ฌ vpc์— ์—ฐ๊ฒฐ

vpc ๋งˆ๋ฒ•์‚ฌ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด์žˆ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€๋„ ์ข‹๋‹ค.

Untitled

3-5. public-rt์— ์ธํ„ฐ๋„ท ๊ฒŒ์ดํŠธ์›จ์ด ์ถ”๊ฐ€

vpc ๋งˆ๋ฒ•์‚ฌ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด์žˆ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€๋„ ์ข‹๋‹ค.

Untitled

3-6. ECS ์ปจํ…Œ์ด๋„ˆ์™€ LoadBalance์— ๋Œ€ํ•œ ๋ณด์•ˆ ๊ทธ๋ฃน์„ ์ƒ์„ฑ

ECS ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์˜ ๋ณด์•ˆ ๊ทธ๋ฃน์„ ์„ค์ •ํ•œ๋‹ค.

Untitled

ECS ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ Private Subnet์— ๋ฐฐ์น˜ํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ†ตํ•ด์„œ ๋“ค์–ด์˜ค๋„๋ก ์†Œ์Šค๋ฅผ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๋ณด์•ˆ ๊ทธ๋ฃน์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

Untitled

3-7. NAT Gateway ์ƒ์„ฑ

ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , EC2 ์ธ์Šคํ„ด์Šค๋ฅผ Private Subnet์— ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด NAT Gateway๋ฅผ ํ†ตํ•ด Private Subnet์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— NAT Gateway๋ฅผ Public Subnet์— ๋ฐฐ์น˜ํ•œ๋‹ค.

Untitled

3-8. private-rt์— NAT ๊ฒŒ์ดํŠธ์›จ์ด ์ถ”๊ฐ€

๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์—์„œ private-rt์˜ ๋ผ์šฐํŒ… ํŽธ์ง‘์„ ํ†ตํ•ด NAT ๊ฒŒ์ดํŠธ ์›จ์ด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

Untitled

4. ECR์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

AWS ECS์—์„œ๋Š” ECR์ด๋ผ๋Š” ํ”„๋ผ์ด๋น— ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค๋กœ ์ด์ „์— ์ƒ์„ฑํ–ˆ๋˜ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œ ํ•˜๊ธฐ ์œ„ํ•ด AWS ์ฝ˜์†”์— ์ ‘์†ํ•˜์—ฌ ECR ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

Untitled

Untitled

๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ๋‚˜๋ฉด ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ‘ธ์‹œ ๋ช…๋ น ๋ณด๊ธฐ ๋ฅผ ์ฐธ๊ณ ํ•ด ์ข€ ์ „์— ๋งŒ๋“ค์—ˆ๋˜ Docker ์ด๋ฏธ์ง€๋ฅผ ํ•ด๋‹น ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Untitled

์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ด๋ฏธ์ง€๊ฐ€ ์—…๋กœ๋“œ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Untitled

5. ์ž‘์—… ์ •์˜

Task definition์—์„œ ์ž‘์—… ๋ฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฐธ๊ณ ํ•  ์ด๋ฏธ์ง€, ์‚ฌ์šฉํ•  ๋ฆฌ์†Œ์Šค ์–‘, ์‹œ์ž‘ ์œ ํ˜•, ๋กœ๊น… ๊ตฌ์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

Untitled

์•Œ๋งž์€ ์œ ํ˜•์„ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

Untitled

ํ…Œ์Šคํฌ ์ •์˜ ์ด๋ฆ„๊ณผ ํ…Œ์Šคํฌ ์—ญํ• , ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ, ์ž‘์—… CPU ๋‹จ์œ„ ๋“ฑ์„ ์ž…๋ ฅํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.

Untitled

์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„๊ณผ ์ด๋ฏธ์ง€ ๋ฐ ํฌํŠธ ๋งคํ•‘์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•œ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋Š” ํ˜ธ์ŠคํŠธ ํฌํŠธ0, ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ80์„ ์ž…๋ ฅํ•œ๋‹ค. ํ˜ธ์ŠคํŠธ ํฌํŠธ๋ฅผ ์ง€์ •ํ•  ๊ฒฝ์šฐ ๊ฐ ํ˜ธ์ŠคํŠธ์—์„œ ํ…Œ์Šคํฌ์˜ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ์ •์  ํฌํŠธ ๋งคํ•‘์ด ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ 80์—๋งŒ ๋งคํ•‘ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Untitled

6. ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ

์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค๋“ค์€ย ๋…ผ๋ฆฌ์ ์ธ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์ด๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๋‹จ์œ„๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ž‘์—…์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œย ์ธ์Šคํ„ด์Šค๋Š” ๋ฐ˜๋“œ์‹œ Cluster ์— ๋“ฑ๋ก๋˜์–ด์•ผ ํ•œ๋‹ค.

Untitled

์šฉ๋„์— ์•Œ๋งž์€ ํ…œํ”Œ๋ฆฟ์„ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

Untitled

์„œ๋ธŒ๋„ท์€ private subnet์„ ์„ ํƒํ•˜๊ณ , IP ํ• ๋‹น์€ ๋น„ํ™œ์„ฑํ™”๋ฅผ ์„ ํƒํ•œ๋‹ค. ๋ณด์•ˆ ๊ทธ๋ฃน์€ ECS-Container๋ฅผ ์„ ํƒํ•œ๋‹ค.

Untitled

7. ์„œ๋น„์Šค ์ƒ์„ฑ

์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ž‘์—… ์ •์˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Untitled

์ž‘์—… ์‹œ์ž‘ ์œ ํ˜•๊ณผ ์ž‘์—… ์ •์˜๋ฅผ ํƒํ•˜๊ณ  ์„œ๋น„์Šค ์ด๋ฆ„ ๋ฐ ๋ฐฐํฌ ์œ ํ˜• ๋“ฑ์„ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

Untitled

Blue/Green Deployments๋Š” ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ์˜ ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์กด ๋ฒ„์ „๊ณผ ์ƒˆ๋ฒ„์ „์ด ๊ณต์กดํ•˜๋Š” Rolling Update์™€๋Š” ๋‹ฌ๋ฆฌ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ธฐ์กด ๋ฒ„์ „๊ณผ ์ƒˆ๋ฒ„์ „์ด ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋Š”ย ๋ฐฐํฌ ํ˜•ํƒœ๋ฅผ ๋งํ•œ๋‹ค.ย Blue/Green Deployments์˜ ์ด์ ์€ Rolling Update ๋Œ€๋น„ ๋‘๊ฐ€์ง€ ๋ฒ„์ „์ด ๊ณต์กดํ•˜๋ฉด์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐํฌํ›„์—๋„ ๊ธฐ์กด ๋ฒ„์ „์ด ์ผ์ •์‹œ๊ฐ„ ์œ ์ง€๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๋ฐฐํฌ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋”ย ๋น ๋ฅธ Roll-back์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์„ ์„ค์ •ํ•œ๋‹ค. ๋งŒ์•ฝ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์—†๋‹ค๋ฉด EC2์ฝ˜์†”์—์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•œ๋‹ค.

Untitled

๋กœ๋“œ๋ฐธ๋Ÿฐ์Šค ์ƒ์„ฑ์— ํ•„์š”ํ•œ Target Group์„ ๋จผ์ € ์ƒ์„ฑํ•œ๋‹ค.

Untitled

Untitled

Application Load Balancer๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

Untitled

VPC๋Š” ํ”„๋กœ์ ํŠธ-vpc๋ฅผ ์„ ํƒํ•˜๊ณ  Subnet์€ public subnet์„ ์„ ํƒํ•˜๊ณ  ๋ณด์•ˆ ๊ทธ๋ฃน์€ ECS-ALB๋ฅผ ์„ ํƒํ•œ๋‹ค.

Untitled

๋‹ค์‹œ ECS ์„œ๋น„์Šค ์ƒ์„ฑ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ, ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๋ถ€๋ถ„์— ์ƒˆ๋กœ๊ณ ์นจ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด, ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ฒผ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Untitled

AWS CodeDeploy๋ฅผ ์‚ฌ์šฉํ•œ ๋ธ”๋ฃจ/๊ทธ๋ฆฐ ๋ฐฐํฌ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด, 2๊ฐœ์˜ ๋Œ€์ƒ ๊ทธ๋ฃน์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋Œ€์ƒ๊ทธ๋ฃน์„ ์ถ”๊ฐ€ ๋“ฑ๋กํ•˜๊ณ  ์„œ๋น„์Šค ์ƒ์„ฑ์„ ์™„๋ฃŒํ•œ๋‹ค.

Untitled

Untitled

์„œ๋น„์Šค ์ƒ์„ฑ์„ ์™„๋ฃŒํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„œ๋น„์Šค์— ์ž‘์—… ๋ชฉ๋ก์— ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ ์ž‘์—…์ด ์‹คํ–‰์ค‘์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Untitled

์ด์ œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์˜ DNS๋กœ ์ ‘์†ํ•ด ๋ณด๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ์›น ํŽ˜์ด์ง€๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

Untitled

8. ํŒŒ์ดํ”„๋ผ์ธ ์ƒ์„ฑ

์ด์ œ ํŒŒ์ดํ”„๋ผ์ธ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด Github์— Commit์ด ์˜ฌ๋ผ์˜ค๋ฉด ์ž๋™์œผ๋กœ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ๊ฐ€ ๋˜๋„๋ก ํ•ด๋ณด์ž.

ํŒŒ์ดํ”„๋ผ์ธ ์ƒ์„ฑ์— ์•ž์„œ ๋จผ์ €, ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๊ฒฝ๋กœ์— buildspec.yml, appspec.yaml, taskdef.jsonํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  GitHub์— ํ‘ธ์‰ฌํ•ด๋‘”๋‹ค.

buildspec.ymlย ํŒŒ์ผ์€ ๋Ÿฐํƒ€์ž„์— ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋‚ด๋ ค ๋ฐ›์€ ํ›„ ๋นŒ๋“œํ•˜๋Š” ์‹œ์ ์— ์‹คํ–‰๋  ๋ช…๋ น์–ด ๋ชฉ๋ก์„ ์ •์˜ํ•œ ํŒŒ์ผ์ด๋‹ค.ย pre_build,ย build,ย post_buildย 3๋‹จ๊ณ„์— ๊ฑธ์ณ ์‹คํ–‰๋  ๋ช…๋ น์–ด ๋ชฉ๋ก์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

version: 0.2
 
phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . --no-cache
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - printf '[{"name":"%s","imageUri":"%s"}]' $CONTAINER_NAME $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:latest > imagedefinitions.json
 
artifacts:
  files:
    - imagedefinitions.json
    - taskdef.json
    - appspec.yaml

artifacts๋Š” ๋นŒ๋“œ์˜ ๊ฒฐ๊ณผ๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ ๋ชฉ๋ก์„ ์˜๋ฏธํ•œ๋‹ค.ย imagedefinitions.json์—๋Š” ๋นŒ๋“œ ์™„๋ฃŒ ํ›„ ๋ฐฐํฌ ๋Œ€์ƒ์ด ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•˜๋Š”๋ฐ, ์ด ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœย Amazon ECSย ์„œ๋น„์Šค์— ์†Œ์†๋œ ์ž‘์—… ์ •์˜๋ฅผ ๊ฐœ์ •ํ•˜๊ณ , ์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ณผ์ •์„ ์ž๋™์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

appspec.yaml ํŒŒ์ผ์€ CodeDeploy์—์„œ ๋ฐฐํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: <TASK_DEFINITION>
        LoadBalancerInfo:
          ContainerName: 'docker-svelte-container'
          ContainerPort: 80

taskdef.json ํŒŒ์ผ์€ ์ž‘์—…์ •์˜ ํŒŒ์ผ๋กœ, ECS์˜ ์ž‘์—…์ •์˜์—์„œ JSON ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•ด์„œ ํŒŒ์ผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

Untitled

๋‹ค์‹œ AWS ์ฝ˜์†”๋กœ ๋˜๋Œ์•„์™€์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ƒ์„ฑํ•˜์ž.

Untitled

Untitled

์†Œ์Šค ๊ณต๊ธ‰์ž๋กœ Github(๋ฒ„์ „ 2)๋ฅผ ์„ ํƒํ•˜๊ณ  GitHub์— ์—ฐ๊ฒฐ์„ ํด๋ฆญํ•œ๋‹ค.

Untitled

์—ฐ๊ฒฐ๋œ ๊นƒํ—™ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ƒˆ ์•ฑ ์„ค์น˜๋ฅผ ํด๋ฆญํ•œ๋‹ค.

Untitled

์›ํ•˜๋Š” ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๊ณ  Saveํ•œ๋‹ค.

Untitled

์—ฐ๊ฒฐ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ GitHub ์—ฐ๊ฒฐ์„ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค.

Untitled

CodePipeline์— ์—ฐ๊ฒฐํ•  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ด๋ฆ„๊ณผ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๋„ ์ž…๋ ฅํ•˜๊ณ  ๋ณ€๊ฒฝ๊ฐ์ง€์˜ต์…˜์— ์ฒดํฌํ•œ๋‹ค.

Untitled

๋นŒ๋“œ ๊ณต๊ธ‰์ž๋กœ AWS CodeBuild๋ฅผ ์„ ํƒํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.

Untitled

ํ™˜๊ฒฝ์ด๋ฏธ์ง€๋Š” ๊ด€๋ฆฌํ˜• ์ด๋ฏธ์ง€, ์šด์˜์ฒด์ œ๋Š” Ubuntu, ๋Ÿฐํƒ€์ž„์€ Standard, ์ด๋ฏธ์ง€๋Š” Standard:5.0, ํ™˜๊ฒฝ ์œ ํ˜•์€ Linux๋ฅผ ์„ ใ…Œ, ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ ๋นŒ๋“œ์˜ ๊ถŒํ•œ์„ ์Šน๊ฒฉํ•˜๊ธฐ์œ„ํ•ด ๊ถŒํ•œ์ด ์žˆ์Œ์— ์ฒดํฌํ•œ๋‹ค. ์„œ๋ธŒ๋„ท์€ NAT ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” Private Subnet์„ ์„ ํƒํ•ด์ฃผ๊ณ  VPC ๊ฒ€์ฆ์„ ํ•ด์ค€๋‹ค. ์ดํ›„ buildspec.yml์—์„œ ํ•„์š”๋กœํ•˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋“ค์„ ์ž…๋ ฅํ•ด์ค€๋‹ค. ๋นŒ๋“œ์‚ฌ์–‘์€ buildspec ํŒŒ์ผ ์‚ฌ์šฉ์„ ์ฒดํฌํ•ด์ค€๋‹ค.

Untitled

์ถ”๊ฐ€๋กœ, ์„œ๋ธŒ๋ชจ๋“ˆ ํ’€๋ง์„ย SSH Key๋ฅผ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํŒŒ์ดํ”„๋ผ์ธ์— ์ข…์†๋˜์–ด ์ƒ์„ฑ๋œ ์ฝ”๋“œ ๋นŒ๋“œ ์—ญํ• ์—ย AWSAppRunnerServicePolicyForECRAccess ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ , BuildSpec์˜ imagedefinitions.json์ด S3์— ์—…๋กœ๋“œ๋˜๊ธฐ ๋•Œ๋ฌธ์— AmazonS3FullAccess ๊ถŒํ•œ์„ CodeBuild ์„œ๋น„์Šค ์—ญํ• ์— ์—ฐ๊ฒฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ , EC2InstanceProfileForImageBuilderECRContainerBuilds๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‰ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Untitled

buildspec.yml์— ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

Untitled

๋ฐฐํฌ ๊ณต๊ธ‰์ž๋กœ Amazon ECS(Blue/Green)๋ฅผ ์„ ํƒํ•ด์ฃผ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐฐํฌ๊ทธ๋ฃน์„ ์„ ํƒํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ECS ์ž‘์—… ์ •์˜์™€ AWS Code Deploy App Spec ํŒŒ์ผ๋กœ BuildArtifact์„ ์„ ํƒํ•ด์ค€๋‹ค.

Untitled

Source โ†’ Build โ†’ Deploy ๊ณผ์ •์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋งˆ์น˜๋ฉด, ๋“œ๋””์–ด ๊นƒํ—™์— ์ปค๋ฐ‹ํ‘ธ์‰ฌ๋ฅผ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ์ฝ”๋“œํŒŒ์ดํ”„๋ผ์ธ ์„ธํŒ…์ด ๋๋‚ฌ๋‹ค.

Untitled