JoungSik/GitHub Actions 로 올린 Private registry 의 도커 이미지를 elastic beanstalk 으로 배포하는 방법

Created Sun, 15 May 2022 20:55:11 +0900 Modified Sat, 31 Dec 2022 01:31:35 +0900

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 로 접근하기 위해 프로그래밍 방식으로 계정을 하나 생성합니다.

1

권한은 저는 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)

  1. AWS 에서 IAM 으로 생성 했던 키 값을 .aws 에 설정 파일로 생성해서 인증을 합니다.
  2. pip 를 설치 한 후 awsebcli 라는 AWS 에서 제공하는 CLI 를 설치합니다.
  3. 마지막으로 프로젝트의 deploy 디렉토리로 이동해 배포를 진행합니다.

여기서 deploy 디렉토리의 파일 설정이 Private 로 설정된 도커 이미지를 가져와 배포할 때 중요합니다.

위 과정을 거치게 되면 본인의 정보란에 Packages 에 생성된 도커 이미지를 확인 할 수 잇는데 보시면 Private 라서 인증이 필요합니다.

2

deploy 디렉토리 살펴보기

3

다른 부분은 이미 블로그에 설명을 했으니 참고하시면 되고 이번에 주의 깊게 봐야 하는 부분은 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 을 보시면 BucketKey 가 나오는데 이 부분에 인증 정보를 넣어주시면 됩니다.

저는 elasticbeanstalk 이 배포 되는 S3에 인증 파일을 추가했습니다.

4

dockercfg 파일의 구조가 저는 몇번을 헤맸는데 내용은 아래와 같습니다.

{
	"auths": {
		"ghcr.io": {
			"auth": "key"
		}
	}
}

auth 옆의 키 값은 링크 를 통해 생성할 수 있습니다.

echo -n 'username:password' | base64

아래는 제가 참고 했던 링크들 입니다.