AWS CDK(cdk)とは?仕組み・使い方とCloudFormation・Terraformとの違い
「cdk」と検索したとき、開発の文脈でまず指すのは AWS CDK(AWS Cloud Development Kit)です。AWS CDKは、TypeScriptやPythonなど使い慣れたプログラミング言語でAWSのインフラを「コード」として定義し、AWS CloudFormation を通じてデプロイできるオープンソースのフレームワークです。なお、医療分野の「CKD(慢性腎臓病)」とは綴りが似ているだけの別物で、本記事はインフラ構築ツールのAWS CDKを扱います。この記事では、CDKの基本概念・仕組み・使い方と、CloudFormation や Terraform との違いまでをまとめて解説します。
目次
まとめ(先に結論)
- AWS CDKは、プログラミング言語でAWSインフラを定義するIaC(Infrastructure as Code)フレームワーク。裏側ではCloudFormationが動く。
- 対応言語はTypeScript / JavaScript / Python / Java / C#(.NET) / Go。実務ではTypeScriptが主流。
- 現行はv2。v1は2023年6月1日にサポート終了済みのため、これから始めるならv2一択。
- 基本フローは
cdk init→(合成)cdk synth→(初回のみ)cdk bootstrap→(デプロイ)cdk deploy。 - CloudFormationの生のYAML/JSONより少ないコードで書け、Terraformと違いAWS特化でCloudFormationの自動ロールバック等を活用できる。
以下で、それぞれを順に見ていきます。
AWS CDKとは何か
AWS CDKは、AWSが提供するオープンソースのソフトウェア開発フレームワークです。従来のように管理コンソールを手作業で操作したり、CloudFormationのテンプレートを直接書いたりする代わりに、プログラミング言語でクラウドインフラを定義します。書いたコードは最終的にAWS CloudFormationのテンプレートへ変換され、CloudFormationがリソースを構築します。
IaCには、ChefやAnsibleのように手順を記述する「手続き型」と、必要なリソースの最終形を宣言する「宣言型」があります。AWS CDKはTerraformと同じ宣言型に分類され、「どうなっていてほしいか」を定義するとCDKとCloudFormationが差分を計算してプロビジョニングします。
AWS CDKを構成する2つの要素
AWS CDKは大きく次の2つで構成されます。
- コンストラクトライブラリ(aws-cdk-lib):AWSリソースを表す部品(コンストラクト)の集合。各言語のパッケージとして提供される。
- CDK Toolkit(CDK CLI):
cdkコマンド本体。合成・デプロイ・差分確認などを実行する。
v2ではライブラリが aws-cdk-lib 1つに統合され、サービスごとに別パッケージを入れていたv1より依存管理がシンプルになりました。
対応言語とバージョン
AWS CDKはTypeScript、JavaScript、Python、Java、C#(.NET)、Goに対応しています。実務ではエコシステムが最も充実したTypeScriptが選ばれることが多いです。バージョンは現行のv2を使います。v1は2022年6月1日にメンテナンスモードへ移行し、2023年6月1日にサポートが終了しているため、新規採用の選択肢にはなりません。CLIの実行にはNode.jsが必要で、サポート対象はLTSの20.x・22.x・24.x系です(16.x・18.x系は既にサポートが終了しているため、これから始めるなら22.x以上を推奨します)。
AWS CDKの仕組み(App / Stack / Construct)
CDKのコードは App → Stack → Construct という階層で構成されます。
- App:最上位の要素。複数のStackをまとめ、その依存関係を定義する。
- Stack:CloudFormationの「スタック」に対応する、デプロイの最小単位。
- Construct:1つ以上のAWSリソースを表す再利用可能な部品。
コンストラクトには抽象度の異なる3つのレベルがあります。L1はCloudFormationのリソースと1対1で対応する低レベル部品(クラス名に Cfn 接頭辞が付く)、L2は適切なデフォルト値や便利なメソッドを備えた高レベル部品、L3(Patterns)は複数のリソースを束ねた構成パターンです。通常はL2を中心に書き、細かく制御したい箇所だけL1を使い分けます。
実行面では、cdk synth でコードがCloudFormationテンプレート(YAML/JSON)へ合成され、cdk deploy でそのテンプレートをCloudFormationが構築します。つまりCDKは「言語で書く層」、実際の構築は使い慣れたCloudFormationが担う構図です。CloudFormationそのものについては「CloudFormationとは?基本的な概要と特徴について解説」も参照してください。
CloudFormation・Terraformとの違い
AWS CDK・CloudFormation・TerraformはいずれもIaCを実現しますが、記述方法と守備範囲が異なります。
| 項目 | AWS CDK | CloudFormation | Terraform |
|---|---|---|---|
| 記述方法 | プログラミング言語 | YAML / JSON | HCL |
| 対応範囲 | AWS中心 | AWS専用 | マルチクラウド |
| 抽象化 | 高(L2/L3) | 低 | 中 |
| 実行基盤 | CloudFormation | 自身 | プロバイダAPI直接 |
| 自動ロールバック | あり | あり | 基本なし |
| 学習対象 | 言語+CDK | テンプレート記法 | HCL |
CDKは内部でCloudFormationを使うため、CloudFormationの自動ロールバックやドリフト検出といった機能をそのまま享受できます。一方Terraformは各クラウドのAPIを直接呼ぶため、AWS以外も含むマルチクラウドに強く、デプロイ速度の面でも有利になりやすい反面、自動ロールバックは基本的に持たず、適用に失敗した場合は処理が止まって部分的な変更が残るため、手動での修正や破棄が必要になります。AWSに閉じた構成ならCDK、複数クラウドを統一管理したいならTerraform、という整理が目安です。Terraformのマネージド版については「HCP Terraformとは何か?基礎から理解するクラウドインフラ管理ツール」で解説しています。
AWS CDKの使い方(入門)
インストールと前提
事前にNode.js(推奨はLTSの22.x以上。20.x・24.xも可)とAWS CLI/認証情報の設定が必要です。CDK CLIはnpmで導入します。
npm install -g aws-cdk
cdk --version
プロジェクト作成からデプロイまで
基本的な流れは次のとおりです。
# プロジェクト作成(TypeScript)
cdk init sample-app --language typescript
# コードをCloudFormationテンプレートに合成して確認
cdk synth
# 初回のみ:CDK用のリソース(S3バケット等)を準備
cdk bootstrap
# デプロイ(内部で synth も実行される)
cdk deploy
# 不要になったら削除
cdk destroy
cdk bootstrap はAWSアカウント・リージョンごとに最初の一度だけ実行します。cdk deploy を実行すると裏で cdk synth が走り、生成されたテンプレートをCloudFormationが構築します。なお cdk init のテンプレートは、最小構成の app とサンプルリソース付きの sample-app から選べます。初めて触る場合は、生成物がシンプルで挙動を追いやすい app から始めるのも分かりやすい方法です。
最小のスタック例(TypeScript)
L2コンストラクトでS3バケットを定義する例です(AWS公式ドキュメントに準拠した記述例)。バージョニングを有効にしたバケットを数行で定義できます。
import { App, Stack, StackProps } from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
class HelloCdkStack extends Stack {
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props);
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true,
});
}
}
const app = new App();
new HelloCdkStack(app, 'HelloCdkStack');
同じバケットをCloudFormationのYAMLで書くより記述量が少なく、IDEの補完や型チェックが効く点がCDKの利点です。なお実際のデプロイにはAWSアカウントと認証情報の設定が必要です。
AWS CDKのメリットと注意点
主なメリットは次のとおりです。
- 少ないコードでインフラを定義でき、条件分岐・ループ・継承などプログラミングの機能をそのまま使える。
- インフラもコードレビュー・ユニットテスト・バージョン管理の対象にできる。
- IDEの補完や型チェックが効き、記述ミスを減らせる。
- 裏でCloudFormationが動くため、自動ロールバックやドリフト検出などの資産を活用できる。
一方で注意点もあります。CloudFormation経由でデプロイするため、APIを直接呼ぶツールよりデプロイがやや遅く、CloudFormationの制約も受けます。抽象化が進む分だけ実際に作られるリソースが見えにくくなるため、cdk synth や cdk diff で生成内容を確認する習慣が重要です。また、すべてのサービスにL2が用意されているわけではなく、その場合はL1で記述します。サーバーレス用途では、同じくCloudFormationをベースにした「AWS SAMとは?サーバーレスアプリケーション開発における役割とメリット」と比較検討するのもよいでしょう。
AWS CDKが向いているケース・向かないケース
ツールの優劣は用途で決まります。判断の目安は次のとおりです。
- 向いているケース:構築対象がAWSに閉じている/開発チームがTypeScriptやPythonなどに慣れている/環境ごとに設定を変える、繰り返しリソースを生成するなど、条件分岐やループで表現したい構成が多い。アプリケーションコードと同じ言語・同じリポジトリでインフラも管理したい場合は特に効果が大きい。
- 向かないケース:AWSとAzure・Google Cloudなどを横断するマルチクラウド構成が前提(この場合はTerraformが有力)/チームにプログラミングの素養がなくテンプレートをそのまま管理したい/既存のCloudFormationテンプレート資産が大量にあり、当面それを使い続けたい。
なお、既存のCloudFormationスタックをCDKへ段階的に取り込むこともできるため、「まず一部のスタックだけCDK化する」といった部分導入から始めるのも現実的な選択肢です。
導入時のポイント
最初から大規模に作り込まず、小さなスタックで init〜deploy の流れを体験してから広げると失敗しにくくなります。共通のリソースや設定はConstruct単位でモジュール化して再利用し、変更前には必ず cdk diff で差分を確認します。IAMは最小権限を基本とし、テストコード(スナップショットテストやアサーション)を併用すると、デプロイ前に設定ミスを検出できます。複数アカウント・リージョンへ横展開する段階になったら、CloudFormation側の「CloudFormation StackSetsとは何か」もあわせて検討するとよいでしょう。
よくある質問(FAQ)
Q. CDKとCKDは違いますか?
A. 本記事のCDKはAWSのインフラ構築ツール「AWS CDK」です。医療分野の「CKD(慢性腎臓病)」とは無関係で、綴りが似ているだけの別物です。
Q. 学習にはどの言語が必要ですか?
A. TypeScriptが主流で情報量も豊富です。Python・Java・C#・Goでも利用でき、普段使っている言語を選べます。
Q. cdk bootstrapは毎回必要ですか?
A. いいえ。cdk bootstrap はAWSアカウントとリージョンの組み合わせごとに最初の一度だけ実行すれば十分です。CDKがデプロイ時に使うS3バケットなどの土台リソースを準備するコマンドで、同じアカウント・リージョンに2回目以降デプロイするときは再実行不要です。新しいリージョンを使い始めるときだけ、そのリージョンで改めて実行します。
Q. CloudFormationの知識は必須ですか?
A. 宣言型IaCの概念が分かっていれば、深い知識がなくても始められます。ただし裏でCloudFormationが動くため、スタックやテンプレートの基礎を理解しておくとトラブル対応が楽になります。
Q. v1とv2のどちらを使うべきですか?
A. v2を使ってください。v1は2023年6月1日にサポートが終了しています。
Q. AWS CDKの利用に料金はかかりますか?
A. CDK自体は無料のオープンソースです。課金対象はCDKで作成したAWSリソースの利用料です。