CDK
TypeScript や Python などのプログラミング言語で AWS インフラを定義する IaC フレームワーク
AWSIaC
CDK とは
AWS CDK (Cloud Development Kit) は、TypeScript、Python、Java などのプログラミング言語で AWS インフラを定義する IaC フレームワークである。YAML ではなくコードで記述するため、条件分岐、ループ、型チェック、IDE の補完が使える。
SAM / Terraform との比較
| 観点 | CDK | SAM | Terraform |
|---|---|---|---|
| 言語 | TypeScript, Python 等 | YAML | HCL |
| 対象 | AWS 全般 | サーバーレス | マルチクラウド |
| 抽象度 | 高い (L2/L3 Construct) | 中程度 | 低い |
| 学習コスト | 中程度 | 低い | 中程度 |
| 出力 | CloudFormation | CloudFormation | tfstate |
基本的な使い方
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
export class MyStack extends cdk.Stack {
constructor(scope: cdk.App, id: string) {
super(scope, id);
const table = new dynamodb.Table(this, 'Users', {
partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
});
const fn = new lambda.Function(this, 'GetUser', {
runtime: lambda.Runtime.NODEJS_22_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
environment: { TABLE_NAME: table.tableName },
});
table.grantReadData(fn); // IAM ポリシーを自動生成
new apigateway.LambdaRestApi(this, 'Api', { handler: fn });
}
}
Construct のレベル
| レベル | 説明 | 例 |
|---|---|---|
| L1 | CloudFormation リソースの 1:1 マッピング | CfnBucket |
| L2 | ベストプラクティスが組み込まれた抽象化 | Bucket, Function |
| L3 | 複数リソースのパターン | LambdaRestApi |
コマンド
cdk init app --language typescript
cdk synth # CloudFormation テンプレートを生成
cdk diff # 変更の差分を表示
cdk deploy # デプロイ
cdk destroy # 削除
CDK を使うべきケース
| ✅ 適する | ❌ 適さない |
|---|---|
| 複雑なインフラ (条件分岐、ループ) | シンプルな Lambda + API |
| TypeScript チーム | YAML に慣れたチーム |
| 再利用可能な Construct を作りたい | 小規模プロジェクト |
CDK の背景や設計思想は関連書籍に詳しい。