⌛
No.5【AWS】ECS Fargate+CodePipeline - CI/CD環境構築編
はじめに
この記事は以下の続きとなる。
つまづきポイント
構築する環境
- 今回はリポジトリに更新があったらECSのタスクを
ローリングアップデートをするCI/CD環境を構築する。
構築手順
SecretManager設定
-
Secrets Manager→新しいシークレットを保存するをクリックし新規作成画面に遷移する。 -
その他のシークレットのタイプを選択する。

-
キー/値のペアにdockerHubのログインユーザー名とパスワードを設定する。
- dockerHubユーザー名設定
キー:username
値:<dockerHubログインユーザー名> - dockerHubパスワード設定
キー:password
値:<dockerHubログインパスワード>
-
シークレットキーの名前は任意のものを設定する。
-
今回はローテーション設定はしない。必要な場合は状況に応じて設定する。

コンテンツの準備
CodePipelineを動かすためのファイルを用意してCodeCommitにpushする。
ファイル構成一覧
リポジトリ
- buildspec.yml
- Dockerfile (※)
- server.js (※)
buildspec.yml
version: 0.2
env:
secrets-manager:
DOCKERHUB_USER: <SecretManagerのarn>:username
DOCKERHUB_PASS: <SecretManagerのarn>:password
phases:
pre_build:
commands:
- $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
- REPOSITORY_URI=<ECRリポジトリURL/イメージ名>
- IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- echo Logging in to Docker Hub...
- echo $DOCKERHUB_PASS | docker login -u $DOCKERHUB_USER --password-stdin
build:
commands:
- docker build -t $REPOSITORY_URI:latest .
- docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- docker push $REPOSITORY_URI:latest
- docker push $REPOSITORY_URI:$IMAGE_TAG
- printf '[{"name":"node-sample","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
files:
- imagedefinitions.json
パイプライン作成
パイプライン設定
パイプライン名やロールなどの基本設定をする。
-
CodePipeline→パイプラインを作成するからCodePipeline新規作成画面に遷移する。 -
パイプライン名は任意の名前を設定する。 -
サービスロールは新しいサービスロールを選択する。
ロール名はパイプライン名から自動的に命名される。
ソースステージ設定
pullしてくるソースの指定する。
- ソースプロバイダーは
AWS CodeCommitを選択する。 - リポジトリ名は
コンテンツ準備で準備したリポジトリを指定する。 - ブランチ名はCodePipeline実行時にビルド環境にCloneする対象のブランチを選択する。
ビルドステージ設定
CodeBuildの設定をする。
-
プロバイダーを構築するでAWS CodeBuildを選択する。 - リージョンを選択する。
-
プロジェクトを作成するをクリックする。
CodeBuildの設定する画面が別ウィンドウで表示される。
- プロジェクト名は任意の名前を設定する。
- 環境イメージは
マネージド型イメージを選択する。
- オペレーティングシステムはCodeBuild上でDockerイメージをビルドする環境を選択する。

今回、Cloud9環境にあわせてAmazon Linux 2を指定した。 - 環境タイプやイメージはECSを実行するときに選択した環境にあわせる。
-
特権付与にチェックを入れる。
デプロイステージ設定
-
デプロイプロバイダーは
Amazon ECSを選択する。 -
リージョンを選択する。

-
ECSクラスターおよびサービス名を選択する。

エラー
一通り、設定が完了すると自動でCodePipelineのジョブが動いてしまう。
CodeBuildで以下エラーによりジョブ実行に失敗する。
これは付与するべき権限をCodeBuildに付与していないためである。

ロール権限付与
CodePipelineを設定する行程で新規作成されたCodeBuild実行用ロールに対し以下ポリシーを付与する。
SecretsManagerReadWriteAmazonEC2ContainerRegistryPowerUser
動作確認
- 上記、設定の場合、masterブランチにコミットされた場合自動でジョブが動く。
- ジョブを手動で動かす時は
CodePipeline→対象のpipelineを選択→変更をリリースするをクリックする。 - ジョブがうまく動いた場合ECSのタスクリビジョンが上書きされ、
新たなタスクがECS上で動く。
Discussion