AWSお勉強 CodeBuild/ECR

2023-11-04

サボり始めるとやる気が起きなくなる久々のパクリ12発目!

パクリ元

内容

CodeCommitにソース等を登録 → CodeBuildでコンテナ等作成してECRに登録(★今回ココ) → ECSで起動 の流れ。

ECR

ECRはDockerコンテナイメージを保存できるリポジトリ。CodeBuild にて作成したコンテナイメージを指定する箇所があるので先にリポジトリ(ecr-test)を作成しておく。

CodeBuild

CodeBuild は Docker Compose のようなもの。今回は CodeCommit に上げた Dockerfile に従ってコンテナを作成して ECR に登録するまでを行う。その手順は buildspec.yml に書いてある。ここでは CodeBuildTest というビルドプロジェクトを作成する。

ソースプロバイダには「AWS CodeCommit」、リポジトリは前回作成した「CodeCommitTest」、リファレンスタイプには「ブランチ」、ブランチには「master」を指定する。

環境イメージは「マネージド型イメージ」、オペレーティングシステムには「Ubuntu」、ランタイムは「Standard」、イメージやイメージのバージョンには最新っぽいのを選択、特権付与チェック、サービスロールは「新しいサービスロール」を選択、ロール名には「codebuild-CodeBuildTest-service-role」がすでに入っている。このロールには後で他のポリシーを追加することになる。

環境の追加設定で環境変数を4つ設定する。これは前回 CodeCommit に上げた buildspec.yml 内で使用しているため。
 AWS_DEFAULT_REGION: ap-northeast-1(アジアパシフィック (東京))
 IMAGE_REPO_NAME: ecr-test(ECRリポジトリ)
 IMAGE_TAG: latest(Dockerコンテナのタグ)
 AWS_ACCOUNT_ID: ************(AWSアカウントID)

AWSアカウントIDは画面右上の名前をクリックしてメニューからアカウントを指定した画面に表示されている。

ビルド仕様は「buildspecファイルを使用する」を選択。これで、このビルドプロジェクトが CodeCommit に上げた buildspec.yml ファイルを使用し、その buildspec.yml ファイル内で CodeCommit に上がっている Dockerfile をビルドする、という関連付けられる。

ロール

自動的に登録された「codebuild-CodeBuildTest-service-role」ロールだが、ECRに登録するポリシーが足りないようなので追加する。IAM>ロールから「codebuild-CodeBuildTest-service-role」を検索し、クリックする。

「許可を追加」ボタン押下、「ポリシーをアタッチ」を押下する。

「AmazonEC2ContainerRegistryPowerUser」でフィルタリングして、チェックをつけて「許可を追加」ボタンを押下する。

ビルド

CodeBuildTest ビルドプロジェクトに戻って「ビルドを開始」ボタンを押下する。

失敗。パクリ元2つ目を参考に buildspec.yml を書き換えてCommit、Pushしてビルド再試行。

さらに Too Many Requests みたいなエラーが出たりしてパクリ元3つ目を参考に、Docker Hub(https://hub.docker.com/)にてアカウントを登録して buildspec.yml 内でログインするように修正。

~/CodeCommitTest/buildspec.yml
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
      # Docker Hub へのログイン
      - echo Logging in to Docker Hub...
      - echo $DOCKER_HUB_PASS | docker login -u $DOCKER_HUB_USER --password-stdin
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...          
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - 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...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - printf '[{"name":"<container-definition>","imageUri":"%s"}]' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG > artifacts.json

artifacts:
  files: artifacts.json

環境変数を追加する。CodeBuidTest を選択して編集>環境>追加設定
 DOCKER_HUB_USER: ********(Docker Hub ユーザー名)
 DOCKER_HUB_PASS: ********(Docker Hub パスワード)

ビルドの再試行。成功。

ECR

登録されていることを確認する。

雑感

いろんな問題が出てくるもんだな。

AWS,CodeBuild,Docker,ECR

Posted by ak