はじめに
AWS CDK(Cloud Development Kit)とは、AWSのインフラをコードで管理・定義できるフレームワークです。
CloudFormationと連携して動作し、インフラ構築をプログラミング言語で記述できます🤗
先日、実務で初めてCDKコードの改修をしたので色々とメモしておきます。
目次
🧷 AWS CDKの特徴
1. インフラをコードで管理(IaC)
- 従来は、AWSのインフラを構築するためにコンソールで手動設定したり、CloudFormationでYAML/JSONのテンプレートを書いていました。
- CDKでは、TypeScript, Python, Java, C#, Goなどのプログラミング言語でインフラを定義できるため、コードの再利用性や可読性が高まります。
2. CloudFormationと連携
- CDKは内部的にCloudFormationテンプレートを生成し、それをデプロイします。
- そのため、CDKで記述したコードはCloudFormationで実行される形になります。
3. 高レベルコンストラクト
- CDKではインフラを「コンストラクト」という単位で定義します。
- 例えば、EC2インスタンスやS3バケットを1行のコードで作成できます。
- 高レベルのコンストラクトはベストプラクティスを内包しているため、安全かつ効率的にリソースを定義できます。
🧷 CDKの基本構成
CDKのプロジェクトは以下のような構成になります。
my-cdk-app/
├── bin/ → エントリーポイント
│ └── my-cdk-app.ts
├── lib/ → インフラを定義するコード
│ └── my-cdk-app-stack.ts
├── cdk.json → CDKの設定ファイル
├── package.json → Node.jsの依存関係管理
├── README.md
└── .gitignore
💡 主要なファイル
bin/my-cdk-app.ts
- CDKアプリケーションのエントリーポイント
- ここでスタックを作成してアプリを実行します。
lib/my-cdk-app-stack.ts
- インフラ構成を記述する場所
cdk.json
- CDKコマンドが使う設定ファイル
🧷 CDKの簡単な例
たとえば、S3バケットを作成するCDKコード(TypeScript)を見てみましょう!
① CDKプロジェクトの作成
# CDKのインストール
npm install -g aws-cdk
# 新規プロジェクト作成
cdk init app --language typescript
② インフラを定義
lib/my-cdk-app-stack.ts
を編集します
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class MyCdkAppStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// S3バケットの作成
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true, // バージョニング有効
removalPolicy: cdk.RemovalPolicy.DESTROY, // 削除時にリソースも削除
autoDeleteObjects: true
});
}
}
③ デプロイ
# デプロイ前にビルド(TypeScriptの場合)
npm run build
# CDKデプロイ
cdk deploy
これでAWS上にS3バケットが作成されます!✨
🧷 CDKのメリット
✅ コードでインフラ管理
TypeScriptやPythonなど、慣れた言語でインフラ構築できる
条件分岐やループなど、コードの柔軟性を活かせる
✅ 再利用性とモジュール化
コンストラクトを再利用できるので、コードの重複が減る
カスタムコンストラクトを作成してモジュール化も可能
✅ CI/CDと連携しやすい
GitHub ActionsやCodePipelineと連携することで、自動デプロイが容易
🧷 CDKとCloudFormationの違い
項目 | AWS CDK | CloudFormation |
---|---|---|
言語 | TypeScript, Python, etc. | YAML / JSON |
開発速度 | 高速(プログラム的に記述) | やや遅い(静的テンプレート) |
メンテナンス性 | 高い(コードの再利用可) | 低い |
ベストプラクティス | 組み込みコンストラクト有り | 手動で対応が必要 |
🧷 npx cdk synth と cdk diff
AWS CDK(Cloud Development Kit)を使っていると、 npx cdk synth
と cdk diff
はよく使うコマンドなので、それぞれの役割についてもついでに記載しておきます😊
1. npx cdk synth(CDKのテンプレートを生成する)
🔹 役割
cdk synth
(synthesize の略)は、CDKのコード(TypeScript, Python, Javaなど)をCloudFormationテンプレートに変換する コマンドです。
🔹 実行方法
npx cdk synth
または
cdk synth
(npxをつけると、ローカルにCDKがインストールされてなくても実行できる)
🔹 実行結果
コマンドを実行すると、CDKのコードからCloudFormationのYAMLまたはJSONテンプレートが生成され、ターミナルに表示されます。
例えば、TypeScriptで以下のようなCDKコードがあるとします。
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const app = new cdk.App();
const stack = new cdk.Stack(app, "MyStack");
new ec2.Instance(stack, "MyInstance", {
instanceType: new ec2.InstanceType("t2.micro"),
machineImage: ec2.MachineImage.latestAmazonLinux(),
}); // npx cdk synthを実行すると、CloudFormationのテンプレートが出力されます。
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: ami-12345678
🔹 使う場面
- デプロイ前にCloudFormationテンプレートを確認したい時
- 生成されたテンプレートを手動で修正・利用したい時
⇨ Infrastructure Composerでインフラ構成をGUI的に見たい時等に利用。 - CDKのコードが正しく変換されているかチェックしたい時
2. cdk diff(CDKの変更点を確認する)
🔹 役割
cdk diff
は、現在のスタックとデプロイ予定の変更点を比較する コマンドです。
CloudFormationの change set
に似ています。
🔹 実行方法
npx cdk diff
🔹 実行結果
例えば、以下のような変更を加えたとします。
- 変更前:
t2.micro
のEC2インスタンス - 変更後:
t3.micro
へ変更
この状態で cdk diff
を実行すると、以下のように変更点が表示されます。
Resources
[~] AWS::EC2::Instance MyInstance MyInstance
├─ [~] InstanceType
│ ├─ [-] t2.micro
│ └─ [+] t3.micro
🔹 使う場面
- 本番環境の変更前に影響を確認したい時
- デプロイ前に予期しない変更がないかチェックしたい時
- 複数人でCDKを開発していて、変更の差分を共有したい時
3. cdk synth と cdk diff の違い
-
cdk synth
:CDKコードをCloudFormationテンプレート(YAML/JSON)に変換 -
cdk diff
:変更前後の差分に関する比較変更点をリスト化(追加・変更・削除)
4. cdk deploy の流れの中での役割
- CDKコードを書く
-
cdk synth
でCloudFormationテンプレートを確認 -
cdk diff
で変更点を確認 -
cdk deploy
で実際にデプロイ
CDKの開発フローをスムーズに進めるために、ぜひ活用してください! 🚀
🎉 まとめ
✅ AWS CDKは、従来のCloudFormationよりもシンプルかつ効率的にインフラを構築できるツール。
✅ コードの再利用やCI/CD連携にも強く、クラウド開発を高速化できる。
✅ npx cdk synth
:CDKコードをCloudFormationテンプレートに変換
✅ cdk diff
:変更前後の差分を比較
✅ デプロイ前に synth
でテンプレートを確認し、diff
で影響をチェックするのがベストプラクティス!
✨ 次のステップ
- 実際にLambdaやAPI Gatewayを組み合わせた構成に挑戦する
- CDK PipelinesでCI/CDを自動化する
使いこなせるとめちゃくちゃ便利っす!😎