AmazonECR
CodeBuild

AWS CodeBuild+Amazon ECRを試してみる


概要

下記でやってみたことを、今度は AWS CodeBuildを使い、

Githubのソースコードを取得し、ビルドしたコンテナイメージを自動的に Amazon ECRにPushするところまでやってみたいと思います。


Code Buildの設定

今回はコンソール画面上からやってみました。


プロジェクト

プロジェクト名や説明を入力。

codebuild1.png


ビルドの対象

対象は、作成済みのGithubリポジトリを指定。

下記の画面は、Githubと連携後の画面で、Githubとの連携が必要です。

codebuild2.png


ビルド方法

環境は、CodeBuildで管理されているDockerのランタイム環境を利用。

codebuild11.png

buildspecは サンプル をそのまま引用してみました。


buildspec.yml

version: 0.2

phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build --no-cache -t $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...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG



アーティファクト

今回は設定なし。ビルドしたイメージをS3などに保存しておく場合は利用しても良さそう。

codebuild4.png


キャッシュ

今回は設定なし。


ログ

試してみる用のロググループを適当に作成&設定。

ビルドログなどをS3に保管する必要がある場合は、チェックボックスにチェックして設定する。

codebuild5.png


サービスロール

「アカウントでサービスロールを作成」で新しいロールを作成する。

既存のサービスロールがある場合は、そちらを利用するでも可能。


VPC

今回は設定なし。


詳細な設定

buildspec.yaml で設定した環境変数をこちらで設定しておく※

codebuild6.png

※本来は、アカウントIDなどを直接書くべきではないと思うので、

実務で運用する場合は、AWS Key Management Serviceなどを使うのが良いかもしれません。


確認

ここまで設定し、「続行」で確認画面に遷移したら、「保存してビルド」ボタンでビルドしてみる。

codebuild7.png

「ビルドの開始を押す」と、ビルドが始まる。

codebuild8.png

そして、、、失敗すると下記のような画面が表示されます><

codebuild9.png

内容を確認すると、 pre-build でこけていました。

codebuild10.png

そもそもロールの設定などを一切していないので、その辺を見直してみる


ロールの設定


ECRの設定

Amazon ECRの対象リポジトリで「アクセス許可」を実施する。

ecr1.png

設定内容は下記のようなイメージ。

ecr2.png


  • ステートメント識別子: 適当に設定。

  • 効果: 許可

  • プリンシパル: 自分のアカウントIDを入力しておく

  • IAMエンティティ: CodeBuildで作成されたサービスロールにチェックして選択

  • アクション: プッシュ/プルアクション


IAMの設定


  • ロール → CodeBuildで作成されたサービスロールを選択

  • 「ポリシーをアタッチします」で選択画面へ遷移


  • AmazonECSTaskExecutionRolePolicy というポリシーをアタッチ

上記で再度実行したところ、下記のようなエラーが、、、

AWSCodeBuild-c7551cb9-bc40-416b-8361-0909b267a041 is not authorized to perform:

ecr:InitiateLayerUpload on resource:
arn:aws:ecr:ap-northeast-1:<<ID>>:repository/<<対象リポジトリ>>

確かにアタッチしたポリシーでは ecr:InitiateLayerUpload がない。。。

ECR側の設定だけでは足らなそうなので、新しく作成してしまうことに。

{

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

上記に適当なポリシー名をつけて、再度CodeBuildで作成されたサービスロールにアタッチし、

再度ビルドを実行してみます。

codebuild12.png

そうすると、無事に全ての項目が完了していることを確認できました。

Amazon ECRの対象リポジトリも更新されていることが確認できるはずです。


GithubへのPush時の動作確認

CodeBuild設定時に、GithubのWebhookをONにしていたのでそちらの確認をしてみます。

masterブランチに適当な変更を加えてPushしてみたところ、下記のようにBuildが走っていることを確認できました。

codebuild13.png

codebuild14.png


追加でやりたかったところ

ここまでの内容はあくまで build して ECRにPush するところにフォーカスしましたが、

テストコードの実行ができていないので、テストが完了したらビルドするというのがあると良さそうですね。

ちなみに単純に buildspec.yml にテスト実行を埋め込んでも、

今回選択した環境がDockerの環境で、Javaの環境ではないのでテスト実行ができませんでした。

テスト用の buildspecファイル を用意して実施するのが良い?等は別で検証してみたいと思いますmm


参考