Next.js + Docker + Github action + ECR

Bie·2024년 5월 29일

컨테이너는 대부분 Fargate를 사용하는 것이 최선의 방법이라고 하지만 이번 토이프로젝트에는 비용을 들이고 싶지 않았다.

도커 컨테이너를 AWS 서비스를 이용해서 배포할때 제일 간단하게 + 비용없이(제일 중요) 하는 방법으로는 Github action(무료)로 ci/cd 파이프라인을 구축하여 ECR(월 5tb 무료)로 옮긴후 EC2로 배포하는 방법이 있다.

  1. 프로젝트 루트 디렉토리에 .github/workflows/deploy.yml 을 생성한후 브랜치에 푸시하였을때 도커 이미지를 빌드하여 ECR로 푸시하는 workflow를 작성한다.
    gitignore된 env파일은 github action으로 도커 빌드시 읽을 수 없으므로 gitub secrets에 넣어두고 사용한다.
//deploy.yml
name: "Deploy to ECR"
"on":
  push:
    branches:
      - "master"
jobs:
  ci:
    name: "Build Image"
    runs-on: "ubuntu-latest"
    steps:
      - name: "Checkout Code"
        uses: "actions/checkout@v4"

      - name: "Setup Node version"
        uses: actions/setup-node@v4
        with:
          node-version: 20.x

      - name: "Install packages"
        run: |
          npm install

  cd:
    name: "Deployment"
    runs-on: "ubuntu-latest"
    needs:
      - ci
    env:
      CREDENTIAL1 : ${{ secrets.CREDENTIAL1 }}
      CREDENTIAL2 : ${{ secrets.CREDENTIAL2 }}
    steps:
      - name: "Checkout Code"
        uses: "actions/checkout@v4"

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4.0.2
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v2

      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY_NAME }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build --build-arg CREDENTIAL1="${{ env.CREDENTIAL1 }}" \
          --build-arg CREDENTIAL2="${{ env.CREDENTIAL2 }}" \
          -f Dockerfile -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
  1. ARG는 도커 빌드 시 사용되고 빌드 된 후에는 사용할 수 없기 때문에 Dockerfile에서 env를 다시 명시해준다.
//Dockerfile
...
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

ARG CREDENTIAL1
ARG CREDENTIAL2
ENV CREDENTIAL1=$CREDENTIAL1
ENV CREDENTIAL2=$CREDENTIAL2
RUN \
    CREDENTIAL1=$CREDENTIAL1 \
    CREDENTIAL2=$CREDENTIAL2 \
    npm run build;
...

참고) Dockerfile에서 ARG와 ENV 차이점

  1. 빌드되고 배포되는 과정은 github actions 탭에서 확인할 수 있으며 에러사항은 로그에서 상세하게 확인할 수 있다. 처음에는 node 버전부터 action 버전까지 하나하나 수정하느라 ECR 푸시까지
    열번도 넘게 오류를 찾아 헤맸다. 중요한 것은 도커 빌드와 후에 사용할 수 있는 env를 어디에 보관할 것이냐 였고, 이번에는 비용을 지불하지 않기 위해 억지로 github secrets로 관리를 하지만...
    자본의 여유가 된다면 당연히 체계와 보안을 고려해서 parameter store나 secrets manager를 사용할 것이다.

0개의 댓글