CircleCIでDockerイメージをbuildしてECRにpushする方法


CircleCIを使ってAWS ECRにDockerイメージをpushする方法です。
Githubのmainブランチにpushすることで自動実行してくれます。

AWS側の準備

まずECRとIAMを準備します。

1. ECRの作成

ECRに行き、任意のリポジトリを作成します。

2. IAMユーザの作成

IAMユーザを作成してアクセスキーとシークレットキーを発行します。

この時に必要な権限はこちらです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ecr:CompleteLayerUpload",
                "ecr:GetAuthorizationToken",
                "ecr:UploadLayerPart",
                "ecr:BatchCheckLayerAvailability",
		"ecr:InitiateLayerUpload",
                "ecr:PutImage"
            ],
            "Resource": "*"
        }
    ]
}

CircleCI側の準備

1. config.ymlの作成と配置

CircleCIはリポジトリの中にある.circleci/config.ymlを読みに行くので、ディレクトリとファイルを用意してあげます。

中身はこちらです。※環境変数が1つありますがそのままで大丈夫です。

version: 2.1
orbs:
  aws-cli: circleci/[email protected]

jobs:
  deploy:
    working_directory: ~/app
    docker: 
      - image: cimg/python:3.9
    steps:
      - checkout
      - setup_remote_docker
      - aws-cli/install
      - aws-cli/setup
      - run:
          name: docker build
          command: |
            docker build -t ${ECR_IMAGE_NAME}:latest .
      - run: 
          name: push
          command: |
            aws ecr get-login-password --region ${AWS_DEFAULT_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com
            docker tag ${LAMBDA_NAME}:latest ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_IMAGE_NAME}:latest
            docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_IMAGE_NAME}:latest
workflows:
  version: 2.1
  build_and_deploy:
    jobs:
      - deploy:
        filters:
          branches:
            only: 
              - main

circleci/aws-cliではaws-cliをインストールするにとどまりますが、circleci/aws-ecrを使えばもっと簡単にECRにpushできるかもしれません!

中身の処理の意味はこちらに閉じておきます。

config.yml解説
orbs:
  aws-cli: circleci/[email protected]

aws-cliを簡単に用意してくれるorbです。
これを使うとaws-cli/installと書くだけでcliをインストールしてくれて、aws-cli/setupと書くだけで認証情報をセット(aws configureでやるアレ)してくれます。

他にもいろいろ機能があるようです。

詳細:https://circleci.com/developer/ja/orbs/orb/circleci/aws-cli

次に以下のコマンドですが、

setup_remote_docker

これを書かないとdocker buildがうまくいきません。
docker in dockerを行うのに必要なのだとか。

その次のawsコマンドが大量に書かれている箇所は、ECRのイメージプッシュ手順をそのまま持ってきただけです。ECRに行き、「プッシュコマンドを表示」を押せば同じものが見れます。

最後のこの部分ですが、

workflows:
  version: 2.1
  build_and_deploy:
    jobs:
      - deploy:
        filters:
          branches:
            only: 
              - main

ここはmainブランチに変更があったときだけ処理をスタートさせる記述です。

2. 環境変数の作成

アクセスキーをハードコードしてGithubにpushするのは絶対ダメ。
よって、CircleCI側で環境変数を設定してあげます。

変数名
AWS_ACCOUNT_ID AWSアカウントのID12桁
AWS_ACCESS_KEY_ID 発行したアクセスキー
AWS_SECRET_ACCESS_KEY 発行したシークレットキー
AWS_DEFAULT_REGION ECRを作成したリージョン。東京ならap-northeast-1
ECR_IMAGE_NAME 作成したECRリポジトリの名前

実行

mainブランチに対してpushやmergeを行うと自動で動作します。
やっぱりCI/CDは最高ですね!