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