概要
下記でやってみたことを、今度は 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