๐ AWS์์ ๋ฉํฐ ์ ํ๋ฆฌ์ผ์ด์ CI/CD (ํ๋ก๋์ ์คํ์ผ)
Source: Dev.to
ํ๋ก์ ํธ ๋ชฉํ
- ๊ฐ๋ฐ์๋ ์ฝ๋๋ฅผ GitHub์ ํธ์ํฉ๋๋ค.
- GitHub Actions๊ฐ ์๋์ผ๋ก:
- ์ฝ๋๋ฅผ ํ ์คํธํฉ๋๋ค
- Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค
- ์ด๋ฏธ์ง๋ฅผ AWS ECR์ ํธ์ํฉ๋๋ค
- AWS ECS(Fargate) ๋๋ EC2 + Docker์ ๋ฐฐํฌํฉ๋๋ค
- ์ต์ข ์ฌ์ฉ์๋ HTTPS(ALB + ACM)๋ฅผ ํตํด ์ฑ์ ์ ๊ทผํฉ๋๋ค
- ๋ก๊ทธ ๋ฐ ๋ชจ๋ํฐ๋ง์ CloudWatch๋ฅผ ํตํด ์ํํฉ๋๋ค
- ๋กค๋ง/๋ธ๋ฃจโ๊ทธ๋ฆฐ ๋ฐฐํฌ๋ฅผ ์ง์ํฉ๋๋ค
๊ณ ์์ค ์ํคํ ์ฒ
flowchart TD
Developer -->|push| GitHubRepo[GitHub Repo (App1, App2, App3)]
GitHubRepo --> GitHubActions[GitHub Actions (CI/CD)]
GitHubActions -->|Test| Test
GitHubActions -->|Docker Build| Build
GitHubActions -->|Push to ECR| ECR[AWS ECR (Images)]
ECR --> ECS[AWS ECS (Fargate)]
ECS --> ALB[Application Load Balancer]
ALB --> EndUsers[End Users (HTTPS)]
๋ฆฌํฌ์งํ ๋ฆฌ ๊ตฌ์กฐ
multi-app-devops/
โโโ app1/
โ โโโ Dockerfile
โ โโโ src/
โโโ app2/
โ โโโ Dockerfile
โ โโโ src/
โโโ app3/
โ โโโ Dockerfile
โ โโโ src/
โโโ .github/
โโโ workflows/
โโโ deploy.yml
๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ฆฝ์ ์ด์ง๋ง ๋์ผํ ํ์ดํ๋ผ์ธ ๋ก์ง์ ํตํด ๋ฐฐํฌ๋ฉ๋๋ค.
Step 1: AWS ๊ณ์ ๋ฐ IAM
๋ค์ ๊ด๋ฆฌํ ์ ์ฑ ์ CI/CD IAM ์ฌ์ฉ์/์ญํ ์ ์ฐ๊ฒฐํฉ๋๋ค:
AmazonEC2FullAccessAmazonECS_FullAccessAmazonEC2ContainerRegistryFullAccessCloudWatchFullAccessIAMReadOnlyAccess
ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ์ ๊ทผ์ ์ํด Access Key๋ฅผ ์์ฑํฉ๋๋ค.
๋จ๊ณ 2: ๋คํธ์ํน (VPC)
- ๋ ๊ฐ์ ํผ๋ธ๋ฆญ ์๋ธ๋ท์ ๊ฐ์ง VPC๋ฅผ ์์ฑํฉ๋๋ค.
- Internet Gateway๋ฅผ ์ฐ๊ฒฐํ๊ณ ๋ผ์ฐํธ ํ ์ด๋ธ์ ๊ตฌ์ฑํฉ๋๋ค.
- ๋ณด์ ๊ทธ๋ฃน:
- ALB โ ์ธ๋ฐ์ด๋ ํฌํธ
80๋ฐ443 - ECS ์์
โ ์ธ๋ฐ์ด๋ ํฌํธ
3000,5000,80(๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๋ผ ํ์ํจ)
- ALB โ ์ธ๋ฐ์ด๋ ํฌํธ
3๋จ๊ณ: ECR ๋ฆฌํฌ์งํ ๋ฆฌ ์์ฑ
๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋น ํ๋์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค:
app1-ecrapp2-ecrapp3-ecr
๋์ค์ ์ฌ์ฉํ ์ ์๋๋ก ๋ค์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํฉ๋๋ค:
- AWS Account ID
- Region
- Repository URI (์:
123456789012.dkr.ecr.us-east-1.amazonaws.com/app1)
4๋จ๊ณ: ์ ํ๋ฆฌ์ผ์ด์ ๋์ปค๋ผ์ด์ฆ
์์ Dockerfile (๊ฐ ์ฑ์ ๋์ผํ ํจํด ์ฌ์ฉ):
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Step 5: ECS Cluster (Fargate)
- ECS ํด๋ฌ์คํฐ๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ฐ ์ฑ์ ๋ํ Task Definition์ ์ ์ํฉ๋๋ค:
- ์ปจํ ์ด๋ ์ด๋ฏธ์ง โ ECR URI
- ํฌํธ ๋งคํ โ ์ฑ์ด ๋ ธ์ถํ๋ ํฌํธ
- CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ค์
- ๊ฐ ํ์คํฌ ์ ์์ ๋ํ Service๋ฅผ ์์ฑํฉ๋๋ค:
- ๋ฐ์น ํ์ : FARGATE
- ์๋น์ค๋ฅผ ALB ๋์ ๊ทธ๋ฃน์ ์ฐ๊ฒฐ
- ์ํ๋ ๊ฐ์:
2(๊ณ ๊ฐ์ฉ์ฑ)
Step 6: Application Load Balancer
๊ฒฝ๋ก ๊ธฐ๋ฐ ๋ผ์ฐํ ๊ตฌ์ฑ:
| ๊ฒฝ๋ก | ๋์ ์๋น์ค |
|---|---|
/app1 | app1-service |
/app2 | app2-service |
/app3 | app3-service |
๋จ๊ณ 7: GitHub ๋น๋ฐ
๋ค์ ๋น๋ฐ์ ์ ์ฅ์์ ์ถ๊ฐํ์ธ์:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_ACCOUNT_IDECR_REPO_APP1(์ ์ฒด URI)ECR_REPO_APP2(์ ์ฒด URI)ECR_REPO_APP3(์ ์ฒด URI)
Step 8: GitHub Actions CI/CD ํ์ดํ๋ผ์ธ
.github/workflows/deploy.yml
name: CI-CD Pipeline
on:
push:
branches: [ "main" ]
env:
AWS_REGION: us-east-1
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
run: |
aws ecr get-login-password --region $AWS_REGION \
| docker login --username AWS --password-stdin \
${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.$AWS_REGION.amazonaws.com
- name: Build & Push App1
run: |
docker build -t app1 ./app1
docker tag app1:latest ${{ secrets.ECR_REPO_APP1 }}:latest
docker push ${{ secrets.ECR_REPO_APP1 }}:latest
- name: Deploy App1 to ECS
run: |
aws ecs update-service \
--cluster devops-cluster \
--service app1-service \
--force-new-deployment
# Repeat the build, push, and deploy steps for app2 and app3
๋จ๊ณ 9: ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊ทธ
- CloudWatch Logs โ ์ปจํ ์ด๋ stdout/stderr๋ฅผ ์บก์ฒํฉ๋๋ค.
- Metrics โ ์์ ๋น CPU, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋คํธ์ํฌ ์ฌ์ฉ๋.
- Health checks โ ALB ๋์ ๊ทธ๋ฃน์ ๊ตฌ์ฑ๋ฉ๋๋ค.
๋จ๊ณ 10: ๋ณด์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
- ์ต์ ๊ถํ IAM ์ ์ฑ ์ฌ์ฉ.
- ECR์์ ์ด๋ฏธ์ง ์ค์บ ํ์ฑํ.
- ALB์ ACM ์ธ์ฆ์๋ฅผ ์ฌ์ฉํด HTTPS ์ ์ฉ.
- IAM ์ก์ธ์ค ํค๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ๊ต์ฒด.
๋จ๊ณ 11: ํ ์คํธ ํ๋ฆ
- ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์์ ํ๊ณ
main๋ธ๋์น์ ํธ์ํฉ๋๋ค. - GitHub Actions ์ํฌํ๋ก๊ฐ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
- Docker ์ด๋ฏธ์ง๊ฐ ์ฌ๋น๋๋์ด ECR์ ํธ์๋ฉ๋๋ค.
- ECS ์๋น์ค๊ฐ ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ ๋กค๋ง ๋ฐฐํฌ๋ฅผ ์ํํฉ๋๋ค.
- ์ต์ข ์ฌ์ฉ์๋ ๋ค์ดํ์ ์์ด ์ ๋ฐ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ต๋๋ค.