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