Setup
Setup (aws-vault)
- AdministratorAccessをアタッチしたロール role-cdk を作成。
- role-cdk にAssumeRoleするためのロール role-assumed をを作成。
- IAM ユーザー cli-user を作成。ロールに role-assumed をアタッチ。
- アクセスキーを作成
-
aws-vault で アクセスキーを登録。
# シークレットの登録 aws-vault add cli # セッション情報の確認 aws-vault exec cli -- env | grep AWS -
${HOME}/.aws/configにcdkのプロファイルを作成
# created by aws-vault
[profile cli]
# add
[profile cdk]
source_profile=cli
role_arn=arn:aws:iam::${AWS:AccountId}:role/role-cdk
role_session_name=cdk-session
- 確認
# 確認 aws-vault exec cli -- env | grep AWS # セッション開始 aws-vault exec cdk
Command
カスタムコンストラクタ
カスタムコンストラクタの作成
カスタムコンストラクタをローカルモジュールとしてインストールする。
npm install --save ../path/to/mymodule
-
環境新規作成
aws-vault exec atsuw0-cdk -
環境ごとで実行したい場合は、必ず Bootstrap コマンドを実行する。
# Get the account ID aws sts get-caller-identity # Bootstrap the account cdk bootstrap aws://ACCOUNT-NUMBER/REGION -
デプロイまで
# 差分確認
cdk diff
# テンプレート一覧
cdk list
# Cfnテンプレート生成
cdk synth --no-version-reporting
# Cfnテンプレート生成(スタック指定)
cdk synth [StackName] --no-version-reporting
# Cfnテンプレート生成(console.logの部分だけ出力)
cdk synth [StackName] --quiet
# Contextの指定(各環境ごと)
cdk synth [StackName] --context EnvName=prd
# デプロイ
cdk deploy
# 全スタックをデプロイ
cdk deploy --all
# スタックを指定してデプロイ
cdk deploy [StackName]
# デストロイ
cdk destroy
基本
CDK プロジェクトのアーキテクチャ
- App ... AppはCDKプロジェクト全体を総称。App内で複数StackのデプロイやStack間の依存関係を定義。
- Stack ... Cfnスタックと同義。Cfnスタック内で複数のConstructを定義。
- Construct ... 作成するリソース単位をconstructという。
コンストラクタ
-
L1 Construct (CloudFormation-only) ... Low Layer のコンストラクタ。Cfnのように、1つ1つのリソースを定義することが可能。Cfnというクラス名が付けられている。
-
L2 Construct (Curated)
-
L3 Construct (Patterns)
- L1, L2を組み合わせたコンストラクタ。ECSやサーバレス構成など一般的なパターンを定義。patternsというライブラリ名を指定。
コンストラクタ階層
カスタムコンストラクト
CDK deploy時の挙動
App lifecycleを参照。

Test
Test 基本
Assertionモジュール aws-cdk-lib.assertions を使用して実施。
- assert
- snapshot test ... 前回実施分のCfnテンプレートとの変更の差分を確認。
- Fine-grained Assertions ... 作成したリソースの設定値がただしく設定されているかを確認。
テストコマンド
-
package.jsonを確認。今回はjestが使用されている想定で話を展開する。"scripts": { : : "test": "jest", : : }, -
jest.config.jsを編集。./test/*.test.tsのファイルがテスト対象。module.exports = { testEnvironment: 'node', roots: ['<rootDir>/test'], testMatch: ['**/*.test.ts'], transform: { '^.+\\.tsx?$': 'ts-jest' } }; -
Modify
cdk-demo.test.ts - test command
npm test
# テンプレートをアップデート
npm test -- -u
役に立つ? Construct Library、カスタムパッケージ など
ConstructHubから、探す。
- コンテナ
- ecspresso v2 ... Terraform とかで ECSを利用するなら、入れたほうがいい。
- cdk-ecr-deployment
-
- ECRへコンテナのBuild〜Pushまでをワンストップで実施(切り戻し、タグ付も可)。 小規模だと開発とインフラが同じチームというのもあるので、小規模向けだとこれでもいい気が。
-
s3
-
[aws-s3-deployment] ... CDKプロジェクト内で、静的コンテンツなどをデプロイ。
-
Lambda
-
CDK Watch ... TypeScriptなどコンパイルが必要なソースに対しては、一々コンパイル → デプロイがじっしされるが、CDK Watch を導入することで、変更を検知して、デプロイしてくれる。
--hotswapをオプション指定することで、Cfnを介さず爆速でデプロイを実施することができる。 -
cdk-nag
- ベストプラクティスに則っているかなどリソースをスキャン。
- suppress ... スキャンによってルールに則らないリソースの作成を中止する。
メリット/デメリット
メリット
- CfnやTerraformと異なり、高階層やpackagesコンストラクタを定義することで、リソースを一つ一つ作成せずに、定義することが可能。
デメリット
- Terraform のignore_changesのように、リソース管理対象からコンストラクタを除外することができない。
リファレンス
-
https://aws.amazon.com/jp/getting-started/guides/setup-cdk/module-three/
-
ワークショップ一覧
-
続 LINE 社内用 NPMパッケージの管理戦略 ... カスタムコンストラクタなど各PJで管理する場合は参考に。
-
AWS Solutions Constructs ... CDK拡張機能一覧。1から作らなくとも、ここから参考に構築する。
- AWS Solutions Constructs
-
ConstructHub コンストラクトで「この機能はないか」といった際、要参照。
- cdk-nag ... デプロイ前におけるサプレス実施など。。