CodePipeline(+CodeBuild) で fargate に自動デプロイを設定した時のメモ

2022年8月26日

参考

前提

  • GitHub を使用するので GitHub リポジトリが作成されている事。
  • ECR のリポジトリが作成されている事。
  • ECS 上にコンテナが作成されている事。

手順

  • ビルドプロジェクトを作成する
  • CodeBuild で作成された ロールに ECR の権限のポリシーを付与する
  • buildspec.yml を作成する
  • CodePipeline を作成する

CodeBuild を作成する

  • プロジェクト作成を開始
    • 「CodeBuild」の「開始方法」をクリックする。
    • 「プロジェクトの作成」をクリックする。
  • プロジェクトの設定
    • 「プロジェクト名」に「hoge-project」と入力する。
  • ソース
    • 「ソースプロバイダ」で「GitHub」を選択する。
    • 「リポジトリ」で「OAuth を使用して接続する」を選択する。
    • 「GitHub に接続」をクリックする。
    • 「リポジトリの URL」に https://github.com/user-name/repository-name と入力する。
  • 環境
    • 「環境イメージ」で「マネージド型イメージ」を選択する。
    • 「オペレーティングシステム」で「Amazon Linux 2」を選択する。
    • 「ランタイム」で「Standard」を選択する。
    • 「イメージ」で最新のバージョンを選択する。
    • 「イメージのバージョン」で最新のバージョンを選択する。
    • 「環境タイプ」で「Linux」を選択する。
    • 「特権付与」にチェックを付ける。
    • サービスロール未作成の場合は「サービスロール」で「新しいサービスロール」を選択する。
    • 追加設定 > 環境変数
      • AWS_DEFAULT_REGION → ap-northeast-1(aws のリージョン)
      • IMAGE_REPO_NAME → repository_name(ECR で設定済みのもの)
      • CONTAINER_NAME → container_name(ECS で設定済みのもの)
      • IMAGE_TAG → latest
      • AWS_ACCOUNT_ID → 12345678
  • Buildspec
    • 「ビルド仕様」で「buildspec ファイルを使用する」を選択する。
  • アーティファクト
    • 「タイプ」で「アーティファクトなし」を選択する。
  • 「ビルドプロジェクトを作成する」をクリックする。

CodeBuild で作成された ロールに ECR の権限のポリシーを付与する

  • IAM
    • IAM の「ロール」をクリックする。
    • 検索欄に「codebuild」と入力する。
    • 上記手順で作成したサービスロールの名前が表示されるのでロール名をクリックする。
    • 「許可を追加」をクリックし「ポリシーをアタッチ」をクリックする。
    • 「その他の許可ポリシー」の検索欄に「ContainerRegistryPowerUser」と入力して検索する。
    • 「AmazonEC2ContainerRegistryPowerUser」にチェックをつけ「ポリシーをアタッチ」をクリックする。

buildspec.yml を作成する

  • リポジトリ最上位の階層 buildspec.yml ファイルを作成し次のコードを記載する。
version: 0.2

phases:
  pre_build:
    commands:
      - 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
  build:
    commands:
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG -f dockerfile.production .
      - 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:
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - printf '[{"name":"%s","imageUri":"%s"}]' $CONTAINER_NAME $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG  > imagedefinitions.json

artifacts:
  files:
    - imagedefinitions.json
  • artifacts の箇所以外基本は ECR の「プッシュコマンドの表示」と同じです。
  • artifacts.json が吐き出され、これを元に「新しいリビジョンの作成」が行われるようです。
  • 上記は自分用にカスタマイズして「-f dockerfile.production」と dockerfile を指定してしまっているので参考にする方は要注意です。

CodePipeline を作成する

  • パイプラインの作成開始
    • 「パイプラインの作成」をクリックする。
  • パイプラインの設定
    • 「パイプライン名」に「hoge-pipeline」と入力する。
    • 「サービスロール」で「新しいサービスロール」を選択する。
    • 「次に」をクリックする。
  • ソース
    • GitHub に接続する
      • 「ソースプロバイダー」で「GitHub(バージョン 2)」を選択する。
      • 「GitHub に接続する」をクリックする。
      • 接続名にリポジトリ名を入力する。
      • 「新しいアプリをインストールする」をクリックする。
      • 「Only select repositories」を選択し、対象のリポジトリを選択する。
      • 「install」をクリックする。
      • 「接続」をクリックする。
    • 「リポジトリ名」に accountname/repositoryname の入力する。
    • 「ブランチ名」で対象のブランチを選択する。
    • 「検出オプションを変更する」はチェックが付いたままにする。
    • 「出力アーティファクト形式」は「CodePipeline のデフォルト」が選択されたままにする。
    • 「次に」をクリックする。
  • 構築する - オプショナル
    • 「プロバイダーを構築する」で「AWS CodeBuild」を選択する。
    • 「プロジェクト名」に「hoge-project」と入力する。
    • 「ビルドタイプ」で「単一ビルド」を選択する。
    • 「次に」をクリックする。
  • デプロイステージを追加する
    • 「デプロイプロバイダー」で「Amazon ECS」を選択する。
    • 「クラスター名」で対象のクラスターを選択する。
    • 「サービス名」で対象のサービス名を選択する。
    • 「イメージ定義ファイル - オプショナル」は CodeBuild 時に作成されるので空欄のままにしておく。
    • 「次に」をクリックして「パイプラインを作成する」をクリックする。

2022年8月26日