GitHub Actions 로 올린 Private registry 의 도커 이미지를 elastic beanstalk 으로 배포하는 방법
기존에 사용하고 있던 사이드 프로젝트는 친구의 서버를 빌려서 운영을 하고 있었기 때문에 따로 CI/CD 를 생각하지 않고 작업을 진행하고 있었습니다. 하지만 이번에 프로젝트 리뉴얼을 하면서 AWS 로 서버를 직접 올리는 방향으로 진행하게 되었습니다.
작업을 진행하려고 보니 제가 어떻게 설정 했었는지 기억이 안나서 이번에 작업을 하면서 그 내용을 적어보려고 합니다.
-
AWS 계정 권한 설정
-
Github Actions 를 통한 Docker 이미지 생성 및 Packages 에 Private 로 업로드
-
Github Actions 를 통한 AWS Elastic Beanstalk Deploy
-
deploy
디렉토리 살펴보기
AWS 계정 설정
AWS 에는 IAM 이라고 하는 접근 권한을 지정 할 수 있는 기능이 있습니다.
Github 으로 CI/CD 를 구성 하는 것뿐만 아니라 AWS CLI 로 접근하기 위해 프로그래밍 방식으로 계정을 하나 생성합니다.
권한은 저는 2개를 줬습니다.
AmazonS3FullAccess
AdministratorAccess-AWSElasticBeanstalk
이후 생성된 키는 어딘가에 잘 저장해두시기 바랍니다.
Github Actions 를 통한 Docker 이미지 생성 및 Packages 에 Private 로 업로드
제 프로젝트의 .github/workflows/published.yml
을 참고 하시면 사실 다 있긴 합니다.
name: Create and publish a Docker image
on:
push:
branches: [ main ]
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push-image:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Log in to the Container registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: ghcr.io/joungsik/linkcloud:latest
build-args: |
MASTER_KEY=${{ secrets.MASTER_KEY }}
- name: Deploy Docker image
uses: actions/setup-python@v3
with:
python-version: '3.7'
- run: |
mkdir -p ~/.aws
echo "[eb-cli]
aws_access_key_id = ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_access_key = ${{ secrets.AWS_SECRET_ACCESS_KEY }}" > ~/.aws/credentials
cd deploy
curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py --user
pip install awsebcli --upgrade --user
eb --version
eb deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
미리 설정 해줘야 하는 secrets 의 값들은 github repository 의 settings 에서 입력 가능합니다.
name 단위로 설명하겠습니다.
-
Checkout repository
-
Log in to the Container registry
-
Build and push Docker image
-
Deploy Docker image
Checkout repository
레포지스토리의 정보를 가져옵니다.
Log in to the Container registry
ghcr.io 라고 하는 github 에서 관리하는 도커 레지스토리에 로그인을 합니다.
이때 로그인 암호로 사용 되는 TOKEN 값은 링크 를 참고하셔서 생성하시면 됩니다. 위의 aws 키 값들과 같이 잊어버리면 다시 생성 해야 함으로 어딘가에 잘 보관하시기 바랍니다.
Build and push Docker image
도커를 빌드 해주고 푸쉬까지 해주는 github action 입니다.
저는 빌드 시 제가 사용하는 프레임워크에서 master.key
값이 필요하기 때문에 secrets 에 저장 해둔 값을 가져오도록 매개변수 값을 추가했고 레지스토리는 github 의 ghcr.io 로 지정했으며 빌드는 프로젝트의 Dockerfile 로 설정 했습니다.
Deploy Docker image
마지막으로 배포를 진행하는 단계입니다.
따로 배포 CLI 가 있지만 저는 설정이 좀 달라서 로컬에서 실제 배포하는 방식과 유사하게 배포하도록 설정했습니다.
먼저 Python 베이스 이미지를 가져왔습니다. (actions/setup-python@v3)
- AWS 에서 IAM 으로 생성 했던 키 값을
.aws
에 설정 파일로 생성해서 인증을 합니다. pip
를 설치 한 후awsebcli
라는 AWS 에서 제공하는 CLI 를 설치합니다.- 마지막으로 프로젝트의
deploy
디렉토리로 이동해 배포를 진행합니다.
여기서 deploy 디렉토리의 파일 설정이 Private 로 설정된 도커 이미지를 가져와 배포할 때 중요합니다.
위 과정을 거치게 되면 본인의 정보란에 Packages 에 생성된 도커 이미지를 확인 할 수 잇는데 보시면 Private 라서 인증이 필요합니다.
deploy
디렉토리 살펴보기
다른 부분은 이미 블로그에 설명을 했으니 참고하시면 되고 이번에 주의 깊게 봐야 하는 부분은 Dockerrun.aws.json
파일 입니다.
내용은 다음과 같습니다.
{
"AWSEBDockerrunVersion": "1",
"Authentication": {
"Bucket": "elasticbeanstalk-ap-northeast-2-아무튼 숫자임",
"Key": "dockercfg"
},
"Image": {
"Name": "ghcr.io/joungsik/linkcloud:latest",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "3000",
"HostPort": 80
}
],
"Logging": "/var/log/nginx"
}
Authentication
을 보시면 Bucket
과 Key
가 나오는데 이 부분에 인증 정보를 넣어주시면 됩니다.
저는 elasticbeanstalk 이 배포 되는 S3에 인증 파일을 추가했습니다.
dockercfg 파일의 구조가 저는 몇번을 헤맸는데 내용은 아래와 같습니다.
{
"auths": {
"ghcr.io": {
"auth": "key"
}
}
}
auth 옆의 키 값은 링크 를 통해 생성할 수 있습니다.
echo -n 'username:password' | base64
아래는 제가 참고 했던 링크들 입니다.