はじめに
AWS CDKでインフラ構成をデプロイする際に、手動でコマンドを実行するパターンが大半だと思います。しかし、パイプラインを活用してデプロイすることで得られるメリットがあります。
例えば、手動作業が減ることによって、運用負荷を削減でき、人的ミスを減らすことができます。また、実行環境が固定化できるので、再現性を担保することができます。
こういったメリットを享受するために、AWS CDKをCodePipelineを使ってデプロイする方法を紹介します。
パイプラインについては一例のため、デプロイのやり方やインフラ構成に合わせてカスタマイズ可能です。
前提
- CDKコードはPythonの場合のパイプラインになります
- AWS CDK v2を使用します
- ソースコードはGitHubリポジトリから取得します
パイプラインの構成
- Sourceステージ: GitHubからソースコードを取得
- Buildステージ: CodeBuild。CloudFormationテンプレートをビルド
- Changesetステージ: CodeBuild。CDK Deployの変更セット作成(実行はなし)
- Approvalステージ:手動承認
- Deployステージ: CodeBuild。CDK Deploy実行
パイプライン設定
パイプラインは以下の設定をします。
- 出力アーティファクト:S3バケット
- Sourceステージ
- プロバイダー:Github
- 出力アーティファクト:SourceArtifact
- Buildステージ
- プロバイダー:CodeBuild
- 入力アーティファクト:SourceArtifact
- 出力アーティファクト:BuildArtifact
- ChangeSetステージ
- プロバイダー:CodeBuild
- 入力アーティファクト:BuildArtifact
- Approvalステージ
- プロバイダー:手動承認
- Deployステージ
- プロバイダー:CodeBuild
- 入力アーティファクト:BuildArtifact
権限設定
パイプライン用のIAMロールとCodeBuildプロジェクト用のIAMロールを設定する必要があります。
パイプライン用のIAMロール
パイプラインを実行するうえで必要な権限を追加します。パイプラインを実行する際に必要な一般的な権限と大きな違いはありません。
マネージドポリシーを使用しているところは、必要に応じて最小限の構成にすることをおすすめします。
- マネージドポリシー
- AWSCodePipeline_FullAccess:CodePipelineの管理をする権限
- AWSCodeBuildAdminAccess:CodeBuildの管理をする権限
- AmazonS3FullAccess:S3 artifactsを管理するための権限
- カスタムポリシー
- GitHubと連携した接続情報のUseConnection権限
- CodeBuildのロールを引き渡すiamPassRole権限
CodeBuildプロジェクト用のIAMロール
CodeBuildに付与する一般的な権限に加えて、CodeBuild上でCDKを実行するために必要な権限も付与する必要があります。
-
マネージドポリシー
- AmazonS3FullAccess:S3 artifactsを管理するための権限
- AWSCodeBuildAdminAccess:CodeBuildの管理をする権限
- CloudWatchLogsFullAccess:ログをCloudWatch Logsに出力するための権限
-
カスタムポリシー
- GitHubと連携した接続情報のUseConnection権限
- CDKデプロイ時に必要な権限
- CDK環境をセットアップするための、cdk bootstrap実行時に自動作成される4つのロールに対するAssumeRole権限を付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Condition": {
"ForAnyValue:StringEquals": {
"iam:ResourceTag/aws-cdk:bootstrap-role": [
"image-publishing",
"file-publishing",
"deploy",
"lookup"
]
}
},
"Action": [
"sts:AssumeRole"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
こちらのポリシーは、以下の記事を参考にさせていただきました。ロールの仕組みについても詳しく記載されていますので、ご確認ください。
Sourceステージ
CodePipeline作成時のソースステージにて、CDKのコードを管理しているリポジトリを設定します。
GitHubなど、外部のツールを利用する場合は、あらかじめ、code connectionを作成しておく必要があります。
Buildステージ
このステージでは、CodeBuild上でcdk synthを実行し、デプロイで使用するCloudFormationテンプレートを作成します。こちらで使用したファイルを出力アーティファクトとして、S3に出力します。
(cdk synthは、後続のcdk deployでも実行される処理であるため、省略は可能です。ただし、今回はテンプレート作成段階でのエラーを検知するためにBuildステージで分けて実行しています。)
以下はbuidspecの一例です。
CDKを実行するには、aws cdkのインストールが必要ですが、CDKはNode.js上で動作するため、Node.js環境も必要になります。そのため、インストール時のランタイムはPythonとNode.jsを指定します。
version: 0.2
phases:
install:
runtime-versions:
python: 3.12
nodejs: 22
commands:
- node -v
- npm -v
- pip install --upgrade pip
- npm install -g aws-cdk
- cdk --version
- pip install -r requirements.txt
pre_build:
commands:
- echo Starting pre-build phase...
build:
commands:
- echo Creating Template
- cdk synth
post_build:
commands:
- echo Template created
artifacts:
files:
- '**/*'
Changesetステージ
このステージでは、CodeBuild上でcdk deployを実行しますが、後続の手動承認を通してから実際の設定適用としたいため、--method=prepare-change-setオプションを使用して、変更セットの作成のみを実施します。
また、変更内容がCodePipeline上で確認できるように、cdk diffを使って差分確認を行います。
以下はbuidspecの一例です。
version: 0.2
phases:
install:
runtime-versions:
python: 3.12
nodejs: 22
commands:
- node -v
- npm -v
- pip install --upgrade pip
- npm install -g aws-cdk
- pip install -r requirements.txt
pre_build:
commands:
- echo Starting pre-build phase...
build:
commands:
- cdk diff
- echo Creating changeset for each stack in dependency order
- cdk deploy --all --method=prepare-change-set --require-approval never
post_build:
commands:
- echo Changeset created for all stacks
Approvalステージ
このステージでは、後続のデプロイ実施前に、手動承認を行うステージです。このステージで承認をしないと、次のデプロイが実施されません。変更内容を確認し、デプロイしても問題ないと判断してからデプロイを実行することができます。
Deployステージ
このステージでは、CodeBuild上でcdk deployを実行します。Changesetステージと異なり、--method=prepare-change-setオプションを使用せずデプロイを実施します。このステージで実設定の変更が実施されます。
version: 0.2
phases:
install:
runtime-versions:
python: 3.12
nodejs: 22
commands:
- node -v
- npm -v
- pip install --upgrade pip
- npm install -g aws-cdk
- pip install -r requirements.txt
pre_build:
commands:
- echo Starting pre-build phase...
build:
commands:
- echo Executing deploy changesets for all stacks
- cdk deploy --all --require-approval never
post_build:
commands:
- echo All deploy changesets executed successfully
-
まとめ
CDK(Python)は CodePipeline で問題なくデプロイが可能です。
今回紹介したパイプラインはあくまで一例です。CDKの構成やプロジェクトの環境に合わせてカスタマイズすることができます。
普段アプリ開発をしないので、CodeBuildはあまり使ってきていなかったのですが、かなり柔軟にいろいろなことができることが分かり、インフラのデプロイにも活用していきたいと思いました。