๐Ÿš€ AWS์—์„œ ๋ฉ€ํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ CI/CD (ํ”„๋กœ๋•์…˜ ์Šคํƒ€์ผ)

๋ฐœํ–‰: (2026๋…„ 1์›” 1์ผ ์˜คํ›„ 03:36 GMT+9)
5 min read
์›๋ฌธ: Dev.to

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 ์‚ฌ์šฉ์ž/์—ญํ• ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค:

  • AmazonEC2FullAccess
  • AmazonECS_FullAccess
  • AmazonEC2ContainerRegistryFullAccess
  • CloudWatchFullAccess
  • IAMReadOnlyAccess

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ์ ‘๊ทผ์„ ์œ„ํ•ด Access Key๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„ 2: ๋„คํŠธ์›Œํ‚น (VPC)

  1. ๋‘ ๊ฐœ์˜ ํผ๋ธ”๋ฆญ ์„œ๋ธŒ๋„ท์„ ๊ฐ€์ง„ VPC๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. Internet Gateway๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ผ์šฐํŠธ ํ…Œ์ด๋ธ”์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ณด์•ˆ ๊ทธ๋ฃน:
    • ALB โ€“ ์ธ๋ฐ”์šด๋“œ ํฌํŠธ 80 ๋ฐ 443
    • ECS ์ž‘์—… โ€“ ์ธ๋ฐ”์šด๋“œ ํฌํŠธ 3000, 5000, 80 (๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋”ฐ๋ผ ํ•„์š”ํ•จ)

3๋‹จ๊ณ„: ECR ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ

๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋‹น ํ•˜๋‚˜์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

  • app1-ecr
  • app2-ecr
  • app3-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)

  1. ECS ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ ์•ฑ์— ๋Œ€ํ•œ Task Definition์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:
    • ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ โ†’ ECR URI
    • ํฌํŠธ ๋งคํ•‘ โ†’ ์•ฑ์ด ๋…ธ์ถœํ•˜๋Š” ํฌํŠธ
    • CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •
  3. ๊ฐ ํƒœ์Šคํฌ ์ •์˜์— ๋Œ€ํ•œ Service๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:
    • ๋Ÿฐ์น˜ ํƒ€์ž…: FARGATE
    • ์„œ๋น„์Šค๋ฅผ ALB ๋Œ€์ƒ ๊ทธ๋ฃน์— ์—ฐ๊ฒฐ
    • ์›ํ•˜๋Š” ๊ฐœ์ˆ˜: 2 (๊ณ ๊ฐ€์šฉ์„ฑ)

Step 6: Application Load Balancer

๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ๊ตฌ์„ฑ:

๊ฒฝ๋กœ๋Œ€์ƒ ์„œ๋น„์Šค
/app1app1-service
/app2app2-service
/app3app3-service

๋‹จ๊ณ„ 7: GitHub ๋น„๋ฐ€

๋‹ค์Œ ๋น„๋ฐ€์„ ์ €์žฅ์†Œ์— ์ถ”๊ฐ€ํ•˜์„ธ์š”:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_ACCOUNT_ID
  • ECR_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: ํ…Œ์ŠคํŠธ ํ๋ฆ„

  1. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  2. GitHub Actions ์›Œํฌํ”Œ๋กœ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  3. Docker ์ด๋ฏธ์ง€๊ฐ€ ์žฌ๋นŒ๋“œ๋˜์–ด ECR์— ํ‘ธ์‹œ๋ฉ๋‹ˆ๋‹ค.
  4. ECS ์„œ๋น„์Šค๊ฐ€ ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€ ๋กค๋ง ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  5. ์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” ๋‹ค์šดํƒ€์ž„ ์—†์ด ์—…๋ฐ์ดํŠธ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

AWS EKS ๋ฐ ECS์—์„œ ์ปจํ…Œ์ด๋„ˆ ์›Œํฌ๋กœ๋“œ ๋น„์šฉ ์ตœ์ ํ™”

์—ฌ๋Ÿฌ๋ถ„, ์•ˆ๋…•ํ•˜์„ธ์š”! ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ์ฃผ์ œ, ์ฆ‰ ํด๋ผ์šฐ๋“œ ๋น„์šฉ ์ ˆ๊ฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ด…์‹œ๋‹ค. ์ €๋Š” ์ตœ๊ทผ์— Aโ€ฆ์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋น„์šฉ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ๊นŠ์ด ํŒŒ๊ณ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆํ•ด, ๊ฐ™์€ ํ˜ธ๊ธฐ์‹ฌ, Tech์—์„œ ๋” ๋‚˜์€ ๊ตฌ์ถ•

์ƒˆํ•ด๊ฐ€ ์ฐพ์•„์™”๊ณ , ๋ง‰์—ฐํ•œ ๊ฒฐ์‹ฌ์„ ์„ธ์šฐ๋Š” ๋Œ€์‹  ์‹œ์Šคํ…œ, ์Šคํ‚ฌ, ์„œ๋ธŒ์Šคํ„ด์Šค์— ๋”์šฑ ์ง‘์ค‘ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋…„์€ ๊ธฐ๋ณธ์„ ๋ฐฐ์šฐ๋Š” ๋ฐ ์ง‘์ค‘ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

2025๋…„ ๋ฒ ์ŠคํŠธ: DevOps ๋ณ‘๋ชฉ ํ˜„์ƒ: IaC ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์ด ๋น ์ง„ ์กฐ๊ฐ

DevOps ๋ถ„์•ผ์—์„œ ์ผํ•œ๋‹ค๋ฉด, ์ด ๋ง์„ ์ฒœ ๋ฒˆ์€ ๋“ค์–ด๋ดค์„ ๊ฒ๋‹ˆ๋‹ค: โ€œ๋” ์ ์€ ์ž์›์œผ๋กœ ๋” ๋งŽ์ด ํ•ด๋ผ.โ€ ์ž๋™ํ™”๋Š” ๋” ๋งŽ์ด, ๋ณด์•ˆ์€ ๋” ๋งŽ์ด, ์‹ ๋ขฐ์„ฑ์€ ๋” ๋งŽ์ดโ€”ํ•˜์ง€๋งŒ ์ธ์›์€ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋” ์ ๊ฒŒ.