APPENDIX: docker_buildspec.yaml の詳細

CodeBuild に ECR でイメージをビルドして公開するように指示した方法が不思議ですか?

前のセクションで説明したように、CodeBuild プロジェクトに、Web アプリケーションのソースコードとともに提供される docker_buildspec.yaml という名前のファイルから指示を受け取るように指示しました。

組織によっては、ビルドスペックの修正をデベロッパーに制限する場合があります。ビルドスペックをソースディレクトリから定義するのではなく、CodeBuild または S3 に直接プロビジョニングするかを選択できます (https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html を参照)。

それを確認するには、flask-app フォルダーに移動し、直下にある docker_buildspec.yaml という名前のファイルを開きます。 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`
      - docker build -t $ECR_REPO_URI:latest .
      - docker tag $ECR_REPO_URI:latest $ECR_REPO_URI:$CODEBUILD_RESOLVED_SOURCE_VERSION
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $ECR_REPO_URI:latest
      - docker push $ECR_REPO_URI:$CODEBUILD_RESOLVED_SOURCE_VERSION
      - echo Writing image definitions file...
      - printf '[{"name":"flask-app","imageUri":"%s"}]' $ECR_REPO_URI:latest > imagedefinitions.json
      - cat imagedefinitions.json
artifacts:
  files: imagedefinitions.json

Buildspecs は、ビルドの実行に CodeBuild が使用するビルドコマンドと関連設定の集合です。各セクションを順を追ってみましょう。

  • pre_build コマンドは、基本的にビルドの準備を実行します。この場合、Amazon ECR にログインするように CodeBuild に指示しました。デフォルトの CodeBuild イメージには AWS CLI がプリインストールされており、get-login コマンドを使用して ECR に認証できます。これは、CodeBuild が後で Docker イメージを ECR にプッシュするために必要です。
  • build コマンドは、Dockerfile で指定されたイメージを構築するための docker コマンドを定義します。
  • post_build コマンドは、組み込みイメージを ECR のプライベートコンテナリポジトリにプッシュするための docker コマンドを定義します。
  • artifacts セクションは、CodePipeline の ECS Deployment Provider に必要な imagedefinitions.json という名前のビルドプロジェクトの出力アーティファクトを定義します。

$ プレフィックスで示される環境変数がいくつかあります。これは、ビルドプロジェクトが実行されるたびに AWS CodeBuild によって定義され、提供されます。これには、codebuild-docker-project[ビルドの詳細] ページの [環境変数] セクションに表示されるもの、および CodeBuild のビルトイン環境変数 から使用できる組み込み環境変数があります。(例: $AWS_DEFAULT_REGION)