
AWS ECS์ CodePipeline
๐ก AWS์ ECS ๊ทธ๋ฆฌ๊ณ AWS์ CodePipeline์ ํตํด CI / CD๋ฅผ ๊ฐ์ ์์ผ ๋ณด์์ต๋๋ค. ๋ค์ด๊ฐ๊ธฐ ์ ์ AWS ECS๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋จผ์ Docker์ ๋ํด ์์๋ณผ ํ์๊ฐ ์์ต๋๋ค. Docker๋ ์ปจํ ์ด๋์ ๊ธฐ๋ฐํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ์ํํธ์จ์ด ํ๋ซํผ์ ๋๋ค. ๊ฐ์โฆ
๋ค์ด๊ฐ๊ธฐ ์ ์
AWS ECS๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋จผ์ Docker์ ๋ํด ์์๋ณผ ํ์๊ฐ ์์ต๋๋ค.
Docker๋ ์ปจํ ์ด๋์ ๊ธฐ๋ฐํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ์ํํธ์จ์ด ํ๋ซํผ์ ๋๋ค. ๊ฐ์ ๋จธ์ ์ฒ๋ผ ๋ ๋ฆฝ๋ ์คํ ํ๊ฒฝ์ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ผ๋ก, ์ด์์ฒด์ ๋ฅผ ์ค์นํ๋ ๊ฒ๊ณผ ์ ์ฌํ ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ง๋ง ์ค์ ์ด์์ฒด์ ๋ฅผ ์ค์นํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์น ์ฉ๋์ด ์ ๊ณ ์คํ ์๋ ๋ํ ๋น ๋ฆ ๋๋ค. ์์ ์๋ ์๋์ VM Ware์ ๊ฐ์ ๊ฐ์ ๋จธ์ ์ ์ค์นํ์์ผ๋ ์ต๊ทผ์๋ ๋ฆฌ๋ ์ค ๊ณ์ด์์ Docker๊ฐ ๊ทธ ์ญํ ์ ๋์ ํ๊ณ ์์ต๋๋ค. Docker์ ๊ฐ์ ๋จธ์ ์ ์ฐจ์ด๋ ๊ฐ์ ๋จธ์ ์ ํ๋์จ์ด ์คํ์ ๊ฐ์ํํ์ง๋ง ์ปจํ ์ด๋๋ ์ด์ ๋ฌ๋ฆฌ ์ด์์ฒด์ ์์ค์์ ๊ฐ์ํ๋ฅผ ์ค์ํ์ฌ ๋ค์์ ์ปจํ ์ด๋๋ฅผ OS ์ปค๋์์ ์ง์ ๊ตฌ๋ํ๋ค๋ ์ ์ ๋๋ค. ์ปจํ ์ด๋๋ ํจ์ฌ ๊ฐ๋ณ๊ณ ์ด์์ฒด์ ์ปค๋์ ๊ณต์ ํ๋ฉฐ, ์์์ด ํจ์ฌ ๋น ๋ฅด๊ณ ์ด์์ฒด์ ์ ์ฒด ๋ถํ ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์ฌ ์ ๊ฒ ์ฐจ์งํฉ๋๋ค.
Amazon ECS๋ Cloud ํ๊ฒฝ์ ์ ์ฉ ๊ฐ๋ฅํ Container Service๋ก OS๋ฅผ ํฌํจํ์ง ์์ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ๋ฐฐํฌ์ ๊ธฐ๋์ด ๊ฐ๋ฅํ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ์๋น์ค์ ๋๋ค. ์ด๋ฒ ํฌ์คํ ์ ํตํด Dockerfile์ ์์ฑํ๊ณ ์ด๋ฅผ ์ด๋ฏธ์ง๋ก ๋น๋ํ์ฌ ECR์ ์ ๋ก๋ํ๋ ๋ฐฉ๋ฒ, ํ ์คํฌ๋ฅผ ์์ฑํด์ ํด๋ฌ์คํฐ ์ปจํ ์ด๋์ ์๋น์ค๋ฅผ ์คํ์์ผ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ํ์ดํ๋ผ์ธ ์๋น์ค๋ฅผ ์ด์ฉํ์ฌ CI/CD๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
1. Dockerfile ์์ฑ
Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ค์ ํ์ผ๋ก, ์ปจํ ์ด๋๊ฐ ์ด๋ป๊ฒ ๋์ํด์ผ ํ๋์ง์ ๋ํด ์ค์ ํฉ๋๋ค.
ํ๋ก์ ํธ๋ Svelte์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ํ๋ก์ ํธ๋ก, Svelte ๊ฐ๋ฐ ๋ด์ฉ์ ์๋ตํ๋๋ก ํ๊ฒ ์ต๋๋ค.
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}

์ฌ๊ธฐ์ ์ ๊น! ๋ง์ฝ Mac์ ์ด์ฉํ๊ณ ์๋ค๋ฉด??
์ ์ ํ ECR์ ๋น๋ํ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ ๋ ์ฃผ์ํ ์ ์ด ํ๋ ์์ต๋๋ค.
MAC m1 OS๋ ๊ธฐ๋ณธ์ ์ผ๋ก arm ๊ธฐ๋ฐ ์ํคํ
์ฒ์ด๊ธฐ ๋๋ฌธ์ m1 ๋
ธํธ๋ถ์ผ๋ก ๋์ปค ํ์ผ์ ๋น๋ํ์ฌ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ฉด platform์ด linux/arm64์ผ๋ก ์์ฑ๋ฉ๋๋ค. ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก amazonlinux OS๋ฅผ ์ฌ์ฉํ๋ AWS EC2๋ linux/arm64๊ฐ ์๋ linux/amd64์ด๊ธฐ ๋๋ฌธ์, M1์์ ๋น๋ํ ์ด๋ฏธ์ง๋ฅผ EC2์์ ์ฌ์ฉํ๋ ค๋ฉด ๋น๋ ๋จ๊ณ์์ --platform ์ต์
์ผ๋ก linux/arm64๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ด๋ฏธ์ง ๋น๋๊ฐ ์๋ฃ๋๋ฉด Docker ๋์๋ณด๋์ ์ด๋ฏธ์ง ๋ฉ๋ด์ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฏธ์ง๊ฐ ์์ฑ๋์์์ ํ์ธํ ์ ์๋ค.

์ด๋ฏธ์ง๊ฐ ์์ฑ๋์์ผ๋ ์ ์์ ์ผ๋ก ์ปจํ ์ด๋๊ฐ ๋์ํ๋์ง ํ์ธํด ๋ณด๊ธฐ ์ํด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํฉ๋๋ค.
$ docker run -it -p {HOST_PORT}:{CONTAINER_PORT} {DOCKER_IMAGE}

์ ์์ ์ผ๋ก ์ปจํ ์ด๋๊ฐ ์คํ์ด ๋๋ค๋ฉด, ๋์๋ณด๋์์๋ ํด๋น ์ปจํ ์ด๋๊ฐ ์คํ ์ค์์ ํ์ธํ ์ ์๋ค.

์ค์ ํ ํฌํธ๋ก ์ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ๋์ํจ์ ํ์ธํ ์ ์๋ค.

์ด์ Docker ์ด๋ฏธ์ง๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์์ฑํ์ผ๋, ์ด๋ฏธ์ง๋ฅผ AWS ECR์ ์ ๋ก๋ํด ๋ณด๊ฒ ์ต๋๋ค!
3. ํ๊ฒฝ ๊ตฌ์ถ
3-1. VPC ์์ฑ
VPC ๋์๋ณด๋์์ VPC ๋ง๋ฒ์ฌ๋ฅผ ํตํด VPC๋ฅผ ์์ฑํฉ๋๋ค.

3-2. ์์๋ณด๊ธฐ ์ฝ๊ฒ Subnet Name์ ์์

3-3. ๋ผ์ฐํ ํ ์ด๋ธ์์ Public๊ณผ Private ๋๋ก ๋ฌถ๊ธฐ
Public ์๋ธ๋ท๋ค์ ์ฐ๊ฒฐํ์ฌ public-rt๋ฅผ ๊ตฌ์ฑํ๊ณ Private ์๋ธ๋ท๋ค์ ์ฐ๊ฒฐํ์ฌ private-rt๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.

3-4. ์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด ์์ฑํ์ฌ VPC์ ์ฐ๊ฒฐ
VPC ๋ง๋ฒ์ฌ๋ฅผ ํตํด ์ด๋ฏธ ์์ฑ๋์ด ์๋ค๋ฉด ๋์ด๊ฐ๋ ์ข์ต๋๋ค.

3-5. public-rt์ ์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด ์ถ๊ฐ
VPC ๋ง๋ฒ์ฌ๋ฅผ ํตํด ์ด๋ฏธ ์์ฑ๋์ด ์๋ค๋ฉด ๋์ด๊ฐ๋ ์ข์ต๋๋ค.

3-6. ECS ์ปจํ ์ด๋์ LoadBalancer์ ๋ํ ๋ณด์ ๊ทธ๋ฃน ์์ฑ
ECS ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์ค์ ํ๊ธฐ ๋๋ฌธ์ ๋ก๋ ๋ฐธ๋ฐ์์ ๋ณด์ ๊ทธ๋ฃน์ ์ค์ ํฉ๋๋ค.

ECS ์ปจํ ์ด๋์ ๊ฒฝ์ฐ Private Subnet์ ๋ฐฐ์นํ์ฌ ์ธ๋ถ์์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ํ๊ณ , ๋ก๋๋ฐธ๋ฐ์๋ฅผ ํตํด์ ๋ค์ด์ค๋๋ก ์์ค๋ฅผ ๋ก๋๋ฐธ๋ฐ์ ๋ณด์ ๊ทธ๋ฃน์ผ๋ก ์ค์ ํฉ๋๋ค.

3-7. NAT Gateway ์์ฑ
ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๊ณ EC2 ์ธ์คํด์ค๋ฅผ Private Subnet์ ๋ฐฐ์นํ ๋ NAT Gateway๋ฅผ ํตํด Private Subnet์ ์ธ์คํด์ค๊ฐ ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์, NAT Gateway๋ฅผ Public Subnet์ ๋ฐฐ์นํฉ๋๋ค.

3-8. private-rt์ NAT ๊ฒ์ดํธ์จ์ด ์ถ๊ฐ
๋ผ์ฐํ
ํ
์ด๋ธ์์ private-rt์ ๋ผ์ฐํ
ํธ์ง์ ํตํด NAT ๊ฒ์ดํธ์จ์ด๋ฅผ ์ถ๊ฐํฉ๋๋ค.

4. ECR์ ์ด๋ฏธ์ง ์ ๋ก๋
AWS ECS์์๋ ECR์ด๋ผ๋ ํ๋ผ์ด๋น ๋์ปค ๋ ์ง์คํธ๋ฆฌ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ๋์ปค ๋ ์ง์คํธ๋ฆฌ๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ ์ฅ ๋ฐ ๊ด๋ฆฌํ๋ ์๋น์ค๋ก, ์ด์ ์ ์์ฑํ๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ๊ธฐ ์ํด AWS ์ฝ์์ ์ ์ํ์ฌ ECR ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.


๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ๋๋ฉด ๋์๋ณด๋์์ ํธ์ ๋ช
๋ น ๋ณด๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ ๋ง๋ค์๋ Docker ์ด๋ฏธ์ง๋ฅผ ํด๋น ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ์
๋ก๋ํ ์ ์์ต๋๋ค.

์ด๋ฏธ์ง ์ ๋ก๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์๋ค๋ฉด ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

5. ์์ ์ ์
Task definition์์ ์์ ๋ฐ ์ปจํ ์ด๋๊ฐ ์ฐธ๊ณ ํ ์ด๋ฏธ์ง, ์ฌ์ฉํ ๋ฆฌ์์ค ์, ์์ ์ ํ, ๋ก๊น ๊ตฌ์ฑ ๋ฑ ๋ค์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.

์๋ง์ ์ ํ์ ์ ํํ๊ณ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋๋ค.

ํ ์คํฌ ์ ์ ์ด๋ฆ๊ณผ ํ ์คํฌ ์ญํ , ์์ ๋ฉ๋ชจ๋ฆฌ, ์์ CPU ๋จ์ ๋ฑ์ ์ ๋ ฅํ๊ณ ์ปจํ ์ด๋ ์ถ๊ฐ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.

์ปจํ ์ด๋ ์ด๋ฆ๊ณผ ์ด๋ฏธ์ง ๋ฐ ํฌํธ ๋งคํ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๊ณ ์ถ๊ฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
ํธ์คํธ ํฌํธ๋ 0, ์ปจํ ์ด๋ ํฌํธ๋ 80์ ์ ๋ ฅํฉ๋๋ค. ํธ์คํธ ํฌํธ๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ ๊ฐ ํธ์คํธ์์ ํ ์คํฌ์ ์ธ์คํด์คํ๋ฅผ ํ๋ ์ด์ ์คํํ ์ ์์ต๋๋ค. ์ ์ ํฌํธ ๋งคํ์ด ๋จ์ผ ์ปจํ ์ด๋ ํฌํธ 80์๋ง ๋งคํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.

6. ํด๋ฌ์คํฐ ์์ฑ
์ปจํ ์ด๋ ์ธ์คํด์ค๋ค์ ๋ ผ๋ฆฌ์ ์ธ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด๊ฒ ๋๋๋ฐ ์ด ๋จ์๋ฅผ ํด๋ฌ์คํฐ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์์ ์ ๋ฐฐํฌํ๊ธฐ ์ํ ์ธ์คํด์ค๋ ๋ฐ๋์ Cluster์ ๋ฑ๋ก๋์ด์ผ ํฉ๋๋ค.

์ฉ๋์ ์๋ง์ ํ ํ๋ฆฟ์ ์ ํํ๊ณ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋๋ค.

์๋ธ๋ท์ private subnet์ ์ ํํ๊ณ , IP ํ ๋น์ ๋นํ์ฑํ๋ฅผ ์ ํํฉ๋๋ค. ๋ณด์ ๊ทธ๋ฃน์ ECS-Container๋ฅผ ์ ํํฉ๋๋ค.

7. ์๋น์ค ์์ฑ
์๋น์ค๋ฅผ ํตํด ํด๋ฌ์คํฐ์์ ์คํํ๊ณ ์ ์ง ๊ด๋ฆฌํ ์์ ์ ์๋ฅผ ์ง์ ํ ์ ์๋ค.

์์ ์์ ์ ํ๊ณผ ์์ ์ ์๋ฅผ ํํ๊ณ ์๋น์ค ์ด๋ฆ ๋ฐ ๋ฐฐํฌ ์ ํ ๋ฑ์ ์ ํํ๊ณ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋๋ค.

Blue/Green Deployments๋ ๋ฌด์ค๋จ ๋ฐฐํฌ์ ํ ๋ฐฉ์์ผ๋ก, ๊ธฐ์กด ๋ฒ์ ๊ณผ ์ ๋ฒ์ ์ด ๊ณต์กดํ๋ Rolling Update์๋ ๋ฌ๋ฆฌ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๊ธฐ์กด ๋ฒ์ ๊ณผ ์ ๋ฒ์ ์ด ๋ณ๋๋ก ์กด์ฌํ๋ ๋ฐฐํฌ ํํ๋ฅผ ๋งํฉ๋๋ค. Blue/Green Deployments์ ์ด์ ์ Rolling Update ๋๋น ๋ ๊ฐ์ง ๋ฒ์ ์ด ๊ณต์กดํ๋ฉด์ ์๊ธฐ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉฐ, ๋ฐฐํฌ ํ์๋ ๊ธฐ์กด ๋ฒ์ ์ด ์ผ์ ์๊ฐ ์ ์ง๋์ด ์๋ก์ด ๋ฒ์ ์ ๋ฐฐํฌ์ ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ ๋ ๋น ๋ฅธ Roll-back์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ ๋๋ค.
๋คํธ์ํฌ ๊ตฌ์ฑ์ ์ค์ ํฉ๋๋ค. ๋ง์ฝ ๋ก๋๋ฐธ๋ฐ์๊ฐ ์๋ค๋ฉด EC2 ์ฝ์์์ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์์ฑํ๋๋ก ํฉ๋๋ค.

๋ก๋๋ฐธ๋ฐ์ ์์ฑ์ ํ์ํ Target Group์ ๋จผ์ ์์ฑํฉ๋๋ค.


Application Load Balancer๋ฅผ ์์ฑํฉ๋๋ค.

VPC๋ ํ๋ก์ ํธ-vpc๋ฅผ ์ ํํ๊ณ Subnet์ public subnet์, ๋ณด์ ๊ทธ๋ฃน์ ECS-ALB๋ฅผ ์ ํํฉ๋๋ค.

๋ค์ ECS ์๋น์ค ์์ฑ ํ์ด์ง๋ก ์ด๋ํ์ฌ ๋ก๋๋ฐธ๋ฐ์ ๋ถ๋ถ์ ์๋ก๊ณ ์นจ ๋ฒํผ์ ๋๋ฅด๋ฉด, ๋ก๋๋ฐธ๋ฐ์๊ฐ ์๋ก ์๊ฒผ์์ ํ์ธํ ์ ์์ต๋๋ค.

AWS CodeDeploy๋ฅผ ์ฌ์ฉํ ๋ธ๋ฃจ/๊ทธ๋ฆฐ ๋ฐฐํฌ๋ฅผ ์ํํ๊ฒ ํ๋ ค๋ฉด 2๊ฐ์ ๋์ ๊ทธ๋ฃน์ด ํ์ํ๋ฏ๋ก, ๋์ ๊ทธ๋ฃน์ ์ถ๊ฐ๋ก ๋ฑ๋กํ๊ณ ์๋น์ค ์์ฑ์ ์๋ฃํฉ๋๋ค.


์๋น์ค ์์ฑ์ ์๋ฃํ๋ฉด ํด๋ฌ์คํฐ์ ์๋น์ค ์์ ๋ชฉ๋ก์์ ์ง์ ํ ์์ ์ด ์คํ ์ค์ธ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.

์ด์ ๋ก๋๋ฐธ๋ฐ์์ DNS๋ก ์ ์ํด ๋ณด๋ฉด ์ฑ๊ณต์ ์ผ๋ก ์น ํ์ด์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.

8. ํ์ดํ๋ผ์ธ ์์ฑ
์ด์ ํ์ดํ๋ผ์ธ ์๋น์ค๋ฅผ ํตํด GitHub์ ์ปค๋ฐ์ด ์ฌ๋ผ์ค๋ฉด ์๋์ผ๋ก ๋น๋ ๋ฐ ๋ฐฐํฌ๊ฐ ๋๋๋ก ๊ตฌ์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
ํ์ดํ๋ผ์ธ ์์ฑ์ ์์ ๋จผ์ , ํ๋ก์ ํธ ๋ฃจํธ ๊ฒฝ๋ก์ 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.yamlartifacts๋ ๋น๋์ ๊ฒฐ๊ณผ๋ก ์์ฑ๋ ํ์ผ ๋ชฉ๋ก์ ์๋ฏธํฉ๋๋ค. 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: 80taskdef.json ํ์ผ์ ์์ ์ ์ ํ์ผ๋ก, ECS์ ์์ ์ ์์์ JSON ๋ด์ฉ์ ๋ณต์ฌํด์ ํ์ผ๋ก ์์ฑํฉ๋๋ค.

๋ค์ AWS ์ฝ์๋ก ๋๋์์์ ํ์ดํ๋ผ์ธ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.


์์ค ๊ณต๊ธ์๋ก GitHub(๋ฒ์ 2)๋ฅผ ์ ํํ๊ณ GitHub์ ์ฐ๊ฒฐ์ ํด๋ฆญํฉ๋๋ค.

์ฐ๊ฒฐ๋ ๊นํ๋ธ ์ฃผ์๋ฅผ ์ ๋ ฅํ๊ณ ์ ์ฑ ์ค์น๋ฅผ ํด๋ฆญํฉ๋๋ค.

์ํ๋ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ ํํ๊ณ Saveํฉ๋๋ค.

์ฐ๊ฒฐ ๋ฒํผ์ ๋๋ฌ GitHub ์ฐ๊ฒฐ์ ๋ง๋ฌด๋ฆฌํฉ๋๋ค.

CodePipeline์ ์ฐ๊ฒฐํ ๋ฆฌํฌ์งํ ๋ฆฌ ์ด๋ฆ๊ณผ ๋ธ๋์น ์ด๋ฆ๋ ์ ๋ ฅํ๊ณ ๋ณ๊ฒฝ ๊ฐ์ง ์ต์ ์ ์ฒดํฌํฉ๋๋ค.

๋น๋ ๊ณต๊ธ์๋ก AWS CodeBuild๋ฅผ ์ ํํ๊ณ ํ๋ก์ ํธ ์์ฑ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.

ํ๊ฒฝ ์ด๋ฏธ์ง๋ ๊ด๋ฆฌํ ์ด๋ฏธ์ง, ์ด์์ฒด์ ๋ Ubuntu, ๋ฐํ์์ Standard, ์ด๋ฏธ์ง๋ Standard:5.0, ํ๊ฒฝ ์ ํ์ Linux๋ฅผ ์ ํํ๊ณ , ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ฑฐ๋ ๋น๋์ ๊ถํ์ ์น๊ฒฉํ๊ธฐ ์ํด ๊ถํ์ด ์์์ ์ฒดํฌํฉ๋๋ค. ์๋ธ๋ท์ NAT ๊ฒ์ดํธ์จ์ด๊ฐ ํฌํจ๋์ด ์๋ Private Subnet์ ์ ํํ๊ณ VPC ๊ฒ์ฆ์ ์งํํฉ๋๋ค. ์ดํ buildspec.yml์์ ํ์๋ก ํ๋ ํ๊ฒฝ ๋ณ์๋ค์ ์ ๋ ฅํฉ๋๋ค. ๋น๋ ์ฌ์์ buildspec ํ์ผ ์ฌ์ฉ์ ์ฒดํฌํฉ๋๋ค.

์ถ๊ฐ๋ก, ์๋ธ๋ชจ๋ ํ๋ง์ SSH Key๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ํด๋น ํ์ดํ๋ผ์ธ์ ์ข
์๋์ด ์์ฑ๋ ์ฝ๋ ๋น๋ ์ญํ ์ AWSAppRunnerServicePolicyForECRAccess ๊ถํ์ ์ถ๊ฐํ๊ณ , BuildSpec์ imagedefinitions.json์ด S3์ ์
๋ก๋๋๊ธฐ ๋๋ฌธ์ AmazonS3FullAccess ๊ถํ์ CodeBuild ์๋น์ค ์ญํ ์ ์ฐ๊ฒฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ EC2InstanceProfileForImageBuilderECRContainerBuilds๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ฏธ์ง๋ฅผ ํธ์ํ ์ ์๋๋ก ํฉ๋๋ค.

buildspec.yml์ ์ฌ์ฉํ ํ๊ฒฝ ๋ณ์๋ฅผ ์ถ๊ฐํฉ๋๋ค.

๋ฐฐํฌ ๊ณต๊ธ์๋ก Amazon ECS(Blue/Green)๋ฅผ ์ ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐฐํฌ ๊ทธ๋ฃน์ ์ ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ECS ์์ ์ ์์ AWS CodeDeploy App Spec ํ์ผ๋ก BuildArtifact๋ฅผ ์ ํํฉ๋๋ค.

Source โ Build โ Deploy ๊ณผ์ ์ ์ฑ๊ณต์ ์ผ๋ก ๋ง์น๋ฉด, ๊นํ๋ธ์ ์ปค๋ฐ ํธ์๋ฅผ ํ์ ๋ ์๋์ผ๋ก ํด๋น ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ณ ๋ฐฐํฌํ๋ ์ฝ๋ ํ์ดํ๋ผ์ธ ์ธํ ์ด ๋๋ฉ๋๋ค.
