はじめに
この記事は Japan AWS Top Engineers Advent Calendar 2025 の 4 日目の記事です。
今回はIaCコードを書く際によく使われるAWS CDKについて記載します。
同じAWSのIaCツールであるloudFormationは何かしらのテキストエディタがあれば気軽に欠ける反面、コードが冗長になる課題があります。AWS CDKでは設定が少し難しいですが少ないコードで効率的にIaCコードを書くことができます。
今回の記事ではAWS CDKの環境構築とデプロイまでを解説しています。
↓ Japan AWS Top Engineers Advent Calendar 2025 はこちら
AWS CDK とは
インフラの構成をコード化したInfrastructure as Code (IaC) コードを作成するためのツールがAWS Cloud Development Kit (CDK)です。
IaCのメリット
手作業による設定ミスや繰り返し作業の工数削減
インフラ構成はAWSマネジメントコンソールを操作することでも定義可能です。しかし、同じ構成を繰り返し、すべて手作業で各サービスの設定を行うことは時間がかかり、設定ミスのリスクも毎回発生します。
インフラ構成をコード化することで、同じコードを繰り返し再利用でき、手作業による設定ミスや手間が省けます。
コード化による共有のしやすさ、バージョン管理
インフラ構成がコード化されることにより、コードのまとまりでチーム内で共有が可能になります。
また、バージョン管理ツールで管理することにより差分管理が容易になります。
さらに、コードに対して正しい定義がされているかのテストも可能になります。
↓ 大まかなイメージを絵にするとこんな感じになります

CloudFormationとCDKの違い
AWSのIaCツールと言えばCloudFormationもあります。
こちらは詳細な定義ができる反面、詳細であるがためにIaCコードが非常に長くなってしまいます。
それにより、コードを書く手間がかかり可読性が低下してしまう課題もあります。
CDKではコンストラクトによる抽象化を実現しています。抽象化により一部の定義を自動設定されることで、より少ない行数でIaCコードを作成することができます。
AWS CDK の初期設定
プロジェクトの作成
プロジェクト用のフォルダを作成してそのフォルダ階層に移動します
mkdir my-project
cd my-project
AWS CDK プロジェクトの初期化のため「cdk init app」を実行します
今回はプログラミング言語にtypescriptを指定するため、オプションに「--language typescript」を指定しています
cdk init app --language typescript
AWS CDK による実装例
今回の検証環境
WindowsのPCでKiro(IDE)を利用しています。
API Gateway、Lambda、S3を使ったAPIを実装してみる
実装はAmazonQDeveloperやKiroでVibeコーディング
今回はKiroを使用して「APIGatewayとLambdaを使ったAPIを定義してください。Lambda関数はTypeScriptで記載してください。Lambda関数はS3バケット内のファイル一覧を返すようにしてください」と依頼分を出して実装してもらいました。
その後、S3バケット名やLambda関数名をKiroとチャットで相談しながら修正しつつ実装を進めました。
実装内容
フォルダ構成
lambdaフォルダ内にLambda関数のプログラムが作成され、libフォルダ内にCDKのIaCコードが作成されます。

libフォルダ
スタックの定義はこのフォルダのファイルに行います。
インポート、クラス、コンストラクト
スタックに必要なモジュールをインポートしています。
クラス名とコンストラクタが定義され、これ以降の行から各リソースの定義がされています。

S3バケットの定義
S3バケットの定義は以下の3つの内容が定義されています。
- bucketName: 固定のバケット名
- バケット名を指定していない場合は「myprojectstack-mybucket<ランダム文字列>-<ランダム文字列>」という形で自動的に名前が付けられます。
- removalPolicy: DESTROY: スタック削除時にバケットも削除
- autoDeleteObjects: true: バケット内にファイルがあっても削除可能
Lambda関数の定義
Lambda関数の定義は以下の5つの内容が定義されています。
- functionName: 固定の関数名
- 関数名を指定していない場合は「MyProjectStack-ListFilesFunction<ランダム文字列>-<ランダム文字列>
」という形で自動的に名前が付けられます。
- 関数名を指定していない場合は「MyProjectStack-ListFilesFunction<ランダム文字列>-<ランダム文字列>
- runtime: Node.js 20.x を使用
- handler: index.jsのhandler関数を実行
- code: lambda/ディレクトリのコードを使用
- environment: バケット名を環境変数として渡す
今回のLambda関数はS3バケット内のファイル一覧を取得するため、S3バケットの読み取り権限を付与します

APIGatewayの定義
今回のAPI GatewayはLambda関数をGETメソッドで呼び出す定義をしています

その他、デプロイ完了時のアウトプット内容
デプロイ完了時にバケット名とAPIのURLを表示するようにしています

デプロイ準備
ビルド(TypeScriptのコンパイル)
今回はTypeScriptでCDKアプリケーションを作成しているので、以下のコマンドでコンパイルを行います。
npm run build
この時、以下の図のようにインポートの内容でエラーが出た場合は依存関係の解決がまだできていません

以下のコマンドを実行して依存関係を解決してから再度ビルドしてください。
cd lambda
npm install
CloudFormationテンプレート生成(推奨)
デプロイ時に自動で行われるため必須の手順ではありませんが、以下コマンドを実行することでCDKのコードからCloudFormationテンプレートを生成できます。
npx cdk synth
デフォルトではjson形式でコンソール上に結果が表示されますが、例えばyaml形式でファイルとして保存したい場合は以下のようなコマンドを実行してください
npx cdk synth --yaml > template.yaml
出力されたCloudFormationテンプレートは以下のように428行のファイルになっています。
libフォルダ内のCDKのコード(TypeScript)は58行だったのでかなりの行数が省略できており、可読性の高いコードだったことがわかります。

デプロイ
認証情報を設定
AWS環境にデプロイを行うために認証情報を設定します。
認証情報はアクセスポータルの画面から「AWS Access Key ID」「AWS Secret Access Key」を確認して、以下のコマンド実行後に求められる変数に設定します。
aws configure
Bootstrap(初回のみ)
npx cdk bootstrap
認証エラーになる場合
もしaws configureの設定でうまくいかない場合は、以下のパスのファイルに「AWS Access Key ID」「AWS Secret Access Key」「AWSセッショントークン」を設定して再度Bootstrapコマンドを実行してください
C:\Users\【ユーザー名】\.aws\credentials
BootStrapが成功すると、CDKの初期設定のS3バケットとCloudFormationスタックが作成されます。


デプロイ実行
以下のコマンドを実行します
npx cdk deploy
デプロイ内容の確認が表視されるので、内容に問題がなければ[y]を入力して承認します

AWSコンソールでデプロイ結果確認
デプロイが完了するとデプロイしたCloudFormationのコンソール画面でスタックが確認できます

CloudFormationテンプレートをInfrastructureComposerで確認しましたが、CDKで定義した内容が反映されていることが確認できます。

デプロイ内容の削除
デプロイした内容をAWS環境から削除したい場合はcdk destroyを実行します
npx cdk destroy
確認のメッセージに対して[y]を入力すると削除が行われます。
削除されるとでデプロイしたプロジェクトが削除されますが、Bootstrapによって生成されたS3バケットとスタックは削除されません。

参考
↓ AWS CDK の公式ドキュメント
↓ AWS CDK のBlackBelt資料(日本語)





