18
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
18
Help us understand the problem. What are the problem?