飽き性の頭の中

今は福岡でWeb開発をしている26歳。単なる文字の記録。

【AWS】CodeBuildでECRへDockerイメージを自動プッシュする方法を解説します

f:id:tawachan39:20191211160731j:plain

こんにちは、たわです。今回は技術メモです。

今、Kubernetesを使った環境を構築するためにまずDockerイメージが自動でビルドされてPrivate Registryにプッシュされる状態を整えています。

今回は、AWSを使うのでAWS CodeBuildとAmazon ECRを使ってDockerイメージの自動ビルドをできるようにしたので、その過程・使い方を書き記します。

いろんな記事を参考にさせていただきましたが、結局公式が一番でした。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-docker.html

Amazon ECRの設定

Amazon ECRのリポジトリを作る

まずはAmazon ECRでリポジトリを作ります。

f:id:tawachan39:20191211151431j:plain
ECRリポジトリ作成画面

リポジトリ作成ボタンを押下して下さい。

リポジトリ名を決める

後でこのリポジトリを参照するために使うので覚えておきましょう。

f:id:tawachan39:20191211151602j:plain
リポジトリ名を決める

AWS CodeBuildを設定

次はAWS CodeBuild側の設定です。

Amazon CodeBuildのプロジェクトを作成

プロジェクトを作成します。

f:id:tawachan39:20191211154248j:plain
作成ボタンを押下

ソースはGitHubのリポジトリを指定

今回はGitHubから自動でビルドされていくようにします。AWSのCodeCommitなど他のGit管理サービスからもできます。

f:id:tawachan39:20191211151948j:plain
GitHubを指定

ソースバージョンとしてDockerを指定していますが、これは僕の場合はdockerというブランチを指定したかったからで、masterブランチで良い場合は指定する必要はありません。

プライマリソースのウェブフックイベント

これを設定するとGitHub上のどのイベントにフックさせてビルドを実行するかを決められます。ご自身の用途に合わせて設定しましょう。

f:id:tawachan39:20191211152641j:plain
フックさせるイベントを指定

環境を指定

以下のように設定しました。

  • 環境イメージ:マネージド型イメージ
  • オペレーティングシステム:Amazon Linux 2
  • ランタイム:Standard
  • イメージ:aws/codebuild/amazonlinux2-x8664-standard:2.0
  • イメージのバージョン:このランタイムバージョンには常に最新のイメージを使用してください
  • 環境タイプ:Linux
  • 特権付与:checked

f:id:tawachan39:20191211152904j:plain
設定値

特にBuildタスク内でDockerのイメージビルドする場合は最後の特権付与が必要なようなので忘れずにチェックしましょう。

サービスロールを指定

ここではサービスロールをおまかせで新規作成しました。後でこのサービスロールに対して変更をするので名前を覚えておきましょう。

f:id:tawachan39:20191211153015j:plain
サービスロールを指定

環境変数を設定

CodeBuild実行時に使用する環境変数を設定します。この環境変数はビルド時に実行する内容を記述するbuildspec.ymlにて使用されます(後で設定)。

IMAGE_REPO_NAMEには先程作成したECRのリポジトリ名を指定します。

f:id:tawachan39:20191211153126j:plain
環境変数を設定

ロールの権限を更新

次にCodeBuildに付与しているロールを更新します。現状だとECRにアクセスする権限がないのでそれを付与します。

f:id:tawachan39:20191211153435j:plain
IAMのロールの画面

ポリシーをアタッチ

上の画像のように、CodeBuildに与えられているロールを探しクリックします。

f:id:tawachan39:20191211153645j:plain
ポリシーをアタッチ

そして、上記画像のようにAmazonEC2ContainerRegistryPowerUserを付与します。

buildspec.ymlを用意

ビルドしたいリポジトリに設定ファイルを用意します。

version: 0.2

phases:
  install:
    runtime-versions:
      docker: 18
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
      - AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
      - REPOSITORY_URI=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - echo $IMAGE_REPO_NAME:$IMAGE_TAG
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG -f $DOCKERFILE .
      - echo docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image to $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG ...
      - DOCKER_URL=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - docker push $DOCKER_URL

Dockerイメージのタグには以下を参考にしてGitのコミットIDを付与することにしています。

CodeBuild で Docker イメージに Git のコミットIDをタグ付けてバージョン管理する | Developers.IO

一部環境変数はCodeBuildのGUI側で設定されている点に注意しましょう。

ビルドを実行

先程既にGitHub上で変更を検知して自動ビルドが走るようになっているので、buildspec.ymlをプッシュすれば自動でビルドが始まるはずです。

そうでない場合は、CodeBuildの画面上でビルドを実行しましょう。うまく行けば、ECR上にイメージが置かれているはずです。

f:id:tawachan39:20191211154612j:plain
コミットIDがtagになったイメージがあるはず

まとめ

これでとりあえずGitHubへのプッシュをトリガーにDockerイメージが自動でビルドされるフローは整うはずです。引き続きやった作業の備忘録的にメモをしていこうと思います。

ちなみに、セキュリティ等は適当なので、そのあたりは別途検討したほうがいいかもしれません。