AWS Docker 배포
AWS ECR에 이미지를 빌드/푸시하고 EKS에 배포하는 파이프라인
AWS 환경에서 Docker 이미지를 빌드하고 EKS 클러스터에 배포하는 파이프라인입니다.
사전 준비
다음 secrets와 vars를 미리 등록해야 합니다:
| 종류 | Key | Description |
|---|---|---|
| Secret | AWS_ACCESS_KEY_ID | AWS Access Key |
| Secret | AWS_SECRET_ACCESS_KEY | AWS Secret Key |
| Var | AWS_REGION | AWS 리전 (예: ap-northeast-2) |
| Var | AWS_ACCOUNT_ID | AWS 계정 ID |
| Var | EKS_CLUSTER | EKS 클러스터 이름 |
전체 코드
name: aws-deploy
# main 브랜치 push 시 실행
triggers:
push:
branches: [main]
paths: [src/**, Dockerfile, package.json]
env:
AWS_REGION: "${{ vars.AWS_REGION }}"
ECR_REGISTRY: "${{ vars.AWS_ACCOUNT_ID }}.dkr.ecr.${{ vars.AWS_REGION }}.amazonaws.com"
IMAGE_NAME: "my-app"
jobs:
# ─────────────────────────────────────────
# 1. 소스코드 체크아웃
# ─────────────────────────────────────────
checkout:
phase: source
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
# ─────────────────────────────────────────
# 2. AWS 인증 + ECR 인증
# ─────────────────────────────────────────
auth:
phase: source
needs: [checkout]
steps:
# AWS 자격증명 설정
- name: aws-auth
uses: "collabops/aws-auth@v1"
with:
access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
region: ${{ vars.AWS_REGION }}
# ECR Docker 인증
- name: ecr-auth
uses: "collabops/aws-ecr-auth@v1"
with:
region: ${{ vars.AWS_REGION }}
# ─────────────────────────────────────────
# 3. 테스트
# ─────────────────────────────────────────
test:
phase: test
needs: [checkout]
steps:
- name: unit-test
image: node:18
run: |
cd /workspace/source
npm ci
npm test
env:
CI: "true"
# ─────────────────────────────────────────
# 4. Docker 이미지 빌드 및 ECR 푸시
# ─────────────────────────────────────────
build:
phase: build
needs: [auth, test] # 인증 + 테스트 모두 완료 후
steps:
# 커밋 SHA를 이미지 태그로 사용
- name: prepare-tag
id: tag
run: |
SHORT_SHA=$(echo "${{ collabops.sha }}" | cut -c1-7)
echo "image_tag=${SHORT_SHA}" >> $COLLABOPS_OUTPUT
- name: build-push
uses: "collabops/docker-build-push@v1"
with:
tags: |
${{ env.ECR_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
${{ env.ECR_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.tag.outputs.image_tag }}
build-args: |
NODE_ENV=production
# ─────────────────────────────────────────
# 5. EKS 배포
# ─────────────────────────────────────────
deploy:
phase: deploy
needs: [build]
if: "collabops.ref == 'refs/heads/main' && collabops.event_name == 'push'"
steps:
# EKS 클러스터 인증 및 kubectl 설정
- name: eks-setup
uses: "collabops/aws-eks-setup@v1"
with:
region: ${{ vars.AWS_REGION }}
cluster-name: ${{ vars.EKS_CLUSTER }}
# kubectl로 배포
- name: rollout
image: amazon/aws-cli:2.22.35
run: |
SHORT_SHA=$(echo "${{ collabops.sha }}" | cut -c1-7)
IMAGE="${{ env.ECR_REGISTRY }}/${{ env.IMAGE_NAME }}:${SHORT_SHA}"
# Deployment 이미지 업데이트
kubectl set image deployment/${{ env.IMAGE_NAME }} \
app=${IMAGE} \
-n production
# 롤아웃 완료 대기 (최대 5분)
kubectl rollout status deployment/${{ env.IMAGE_NAME }} \
-n production \
--timeout=300s
echo "Deployed: ${IMAGE}"
# ─────────────────────────────────────────
# 6. Slack 알림
# ─────────────────────────────────────────
notify:
needs: [deploy]
if: "always()"
steps:
- name: slack
uses: "collabops/slack-notify@v1"
with:
webhook-url: ${{ secrets.SLACK_WEBHOOK }}
message: "EKS 배포: ${{ env.IMAGE_NAME }} (${{ collabops.sha }})"
title: "Deploy to EKS"
color: good실행 흐름
checkout
├── auth (AWS + ECR 인증)
└── test (유닛 테스트)
└── build (Docker 빌드 & ECR 푸시)
└── deploy (EKS 배포, main push만)
└── notify (Slack 알림, 항상)