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は最高ですね!
Author And Source
この問題について(CircleCIでDockerイメージをbuildしてECRにpushする方法), 我々は、より多くの情報をここで見つけました https://zenn.dev/takamin55/articles/6900fa8b2ac21c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol