概要
下記でやってみたことを、今度は AWS CodeBuildを使い、
Githubのソースコードを取得し、ビルドしたコンテナイメージを自動的に Amazon ECRにPushするところまでやってみたいと思います。
Code Buildの設定
今回はコンソール画面上からやってみました。
プロジェクト
ビルドの対象
対象は、作成済みのGithubリポジトリを指定。
下記の画面は、Githubと連携後の画面で、Githubとの連携が必要です。

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

buildspecは サンプル をそのまま引用してみました。
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などに保存しておく場合は利用しても良さそう。

キャッシュ
今回は設定なし。
ログ
試してみる用のロググループを適当に作成&設定。
ビルドログなどをS3に保管する必要がある場合は、チェックボックスにチェックして設定する。

サービスロール
「アカウントでサービスロールを作成」で新しいロールを作成する。
既存のサービスロールがある場合は、そちらを利用するでも可能。
VPC
今回は設定なし。
詳細な設定
buildspec.yaml で設定した環境変数をこちらで設定しておく※

※本来は、アカウントIDなどを直接書くべきではないと思うので、
実務で運用する場合は、AWS Key Management Serviceなどを使うのが良いかもしれません。
確認
ここまで設定し、「続行」で確認画面に遷移したら、「保存してビルド」ボタンでビルドしてみる。

そもそもロールの設定などを一切していないので、その辺を見直してみる
ロールの設定
ECRの設定
Amazon ECRの対象リポジトリで「アクセス許可」を実施する。

- ステートメント識別子: 適当に設定。
- 効果: 許可
- プリンシパル: 自分のアカウント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で作成されたサービスロールにアタッチし、
再度ビルドを実行してみます。

そうすると、無事に全ての項目が完了していることを確認できました。
Amazon ECRの対象リポジトリも更新されていることが確認できるはずです。
GithubへのPush時の動作確認
CodeBuild設定時に、GithubのWebhookをONにしていたのでそちらの確認をしてみます。
masterブランチに適当な変更を加えてPushしてみたところ、下記のようにBuildが走っていることを確認できました。


追加でやりたかったところ
ここまでの内容はあくまで build して ECRにPush するところにフォーカスしましたが、
テストコードの実行ができていないので、テストが完了したらビルドするというのがあると良さそうですね。
ちなみに単純に buildspec.yml にテスト実行を埋め込んでも、
今回選択した環境がDockerの環境で、Javaの環境ではないのでテスト実行ができませんでした。
テスト用の buildspecファイル を用意して実施するのが良い?等は別で検証してみたいと思いますmm




