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}

์ฌ๊ธฐ์ ์ ๊น! ๋ง์ฝ 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 ์ปจํ ์ด๋์ LoadBalance์ ๋ํ ๋ณด์ ๊ทธ๋ฃน์ ์์ฑ
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์ 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.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 Code Deploy App Spec ํ์ผ๋ก BuildArtifact์ ์ ํํด์ค๋ค.

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