aws

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 synthcdk diff で生成内容を確認する習慣が重要です。また、すべてのサービスにL2が用意されているわけではなく、その場合はL1で記述します。サーバーレス用途では、同じくCloudFormationをベースにした「AWS SAMとは?サーバーレスアプリケーション開発における役割とメリット」と比較検討するのもよいでしょう。

AWS CDKが向いているケース・向かないケース

ツールの優劣は用途で決まります。判断の目安は次のとおりです。

  • 向いているケース:構築対象がAWSに閉じている/開発チームがTypeScriptやPythonなどに慣れている/環境ごとに設定を変える、繰り返しリソースを生成するなど、条件分岐やループで表現したい構成が多い。アプリケーションコードと同じ言語・同じリポジトリでインフラも管理したい場合は特に効果が大きい。
  • 向かないケース:AWSとAzure・Google Cloudなどを横断するマルチクラウド構成が前提(この場合はTerraformが有力)/チームにプログラミングの素養がなくテンプレートをそのまま管理したい/既存のCloudFormationテンプレート資産が大量にあり、当面それを使い続けたい。

なお、既存のCloudFormationスタックをCDKへ段階的に取り込むこともできるため、「まず一部のスタックだけCDK化する」といった部分導入から始めるのも現実的な選択肢です。

導入時のポイント

最初から大規模に作り込まず、小さなスタックで initdeploy の流れを体験してから広げると失敗しにくくなります。共通のリソースや設定は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リソースの利用料です。

関連記事

資料請求

RELATED POSTS 関連記事