[AWS] lightsail container CD 파이프라인 구축하기

Donghun Seol·2023년 1월 23일
0

API 서버를 AWS LightSail Container에 배포하기 위해 작성한 Github Actions Workflow 파일이다. 컨테이너를 빌드하고, 도커허브에 푸쉬하는 등의 일반적인 로직들은 구글링한 참고자료와 기존의 Actions를 조합해서 손쉽게 구축되었으나, 환경변수를 자동으로 입력하는 부분이 문제였다.

AWS cli에서 환경변수를 입력하는 방법은 하드코딩으로 한땀한땀 넣는 방법과, 양식에 맞는 json파일을 입력으로 넣는 두 가지 방법이 있었다. 나는 jq를 활용해서 json파일을 생성하고 해당 파일을 AWS-CLI의 입력값으로 넣는 방법을 활용했다.

이 방법을 활용하고, 환경변수를 안전하게 관리하기 위해서는 최초의 컨테이너 배포는 lightsail console에서 수동으로 진행해줘야 한다. 최초의 배포가 완료되면 aws-cli에서 get-container-service-deployments명령으로 이전 배포버전의 환경변수를 불러 올수 있고, 해당 값을 redirection하고, jq로 가공해서 양식에 맞는 containerConfig.json 파일을 커맨드라인의 명령어 조합으로만 만들 수 있다.

아래 코드에서 Deploy To LightSail 부분을 참고하면 된다. 유의할 점은 배포 성공시 표준출력으로 환경변수가 출력 되고, 해당 출력을 actions log에서 확인할 수 있다. 따라서 마지막 출력을 /dev/null로 리다이렉션 해줘서 환경변수가 노출되지 않게 설정해 주었다.

참고자료

https://brewagebear.github.io/ligthsail-ci-cd-setup/
https://github.com/arch-inc/amazon-lightsail-containers-test/blob/master/.github/workflows/deploy.yml

name: deployApiServer

on:
  workflow_dispatch:
  push:
    branches:
      - main
      - dev
    paths:
      - server/src**

jobs:
  docker:
    runs-on: ubuntu-latest
    env:
      working-directory: ./server

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.API_DOCKER_HUB_USERNAME }}
          password: ${{ secrets.API_DOCKER_HUB_TOKEN }}

      - name: Set env for Docker versioning
        run: |
          GIT_HASH=$(git rev-parse --short "${{ GITHUB.SHA }}")
          echo "GIT_HASH=${GIT_HASH}" >> $GITHUB_ENV
      - name: Build and push Docker image
        uses: docker/build-push-action@v3
        with:
          context: ${{ env.working-directory }}
          file: ${{ env.working-directory }}/Dockerfile
          platforms: linux/amd64
          push: true
          tags: snowdelver/cdsapi:${{ env.GIT_HASH }}

      - name: Install Utilities # 필수 유틸리티 다운로드
        run: |
          sudo apt-get update
          sudo apt-get install -y jq unzip
      - name: Install AWS Client # AWS SDK 다운로드 (LightSail 이미지 푸시 및 배포를 위함)
        run: |
          curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
          unzip awscliv2.zip
          sudo ./aws/install || true
          aws --version
          curl "https://s3.us-west-2.amazonaws.com/lightsailctl/latest/linux-amd64/lightsailctl" -o "lightsailctl"
          sudo mv "lightsailctl" "/usr/local/bin/lightsailctl"
          sudo chmod +x /usr/local/bin/lightsailctl
      - name: Configure AWS credentials # 입력된 IAM 사용자 액세스키 & 시크릿키 검증
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: 'ap-northeast-2'
          aws-access-key-id: ${{ secrets.API_AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.API_AWS_SECRET_KEY }}

      - name: Deploy To LightSail # 이미지 푸시 및 배포
        run: |
          aws lightsail get-container-service-deployments --service-name nodeauction | jq '.deployments|.[0]' | jq 'del(.version) | del(.state) | del(.createdAt)' > temp.json
          jq '.containers.cdsapi.image="snowdelver/cdsapi:${{ env.GIT_HASH }}"' temp.json > containerConfig.json
          aws lightsail create-container-service-deployment --service-name nodeauction --cli-input-json file://./containerConfig.json &> /dev/null
profile
I'm going from failure to failure without losing enthusiasm

0개의 댓글