AWS CDK(Cloud Development Kit)は、使い慣れたプログラミング言語を使用してクラウドインフラストラクチャをコードとして定義するためのオープンソースのソフトウェア開発フレームワークです。CDKを使用すると、TypeScript、Python、Java、C#などのプログラミング言語を使用してAWSリソースを定義し、それらをCloudFormationテンプレートに変換してデプロイすることができます。
AWS CDKの基本的な仕組みは以下の通りです:
CDKアプリケーション作成 → コンストラクトの使用 → 合成(cdk synth) → デプロイ(cdk deploy)
AWS CDKでは、コンストラクトは3つの階層に分類されます:
レベル | 説明 | 例 |
---|---|---|
L1(CFNリソース) | CloudFormationリソースの直接的なラッパー | CfnBucket(S3バケット) |
L2(AWS構成済みコンストラクト) | ベストプラクティスを組み込んだ高レベルの抽象化 | Bucket(S3バケット) |
L3(パターン) | 複数のリソースを組み合わせた一般的なアーキテクチャパターン | LambdaRestApi(Lambda + API Gateway) |
AWS CDKを使用するには、以下の手順でインストールと設定を行います:
npm install -g aws-cdk
cdk --version
CDKを使用する前に、AWSアカウントとリージョンをブートストラップする必要があります。これにより、CDKが使用するリソース(S3バケット、IAMロールなど)が作成されます。
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
以下は、AWS CDKを使用してインフラストラクチャを定義するための基本的な手順です:
mkdir my-cdk-app
cd my-cdk-app
cdk init app --language typescript
mkdir my-cdk-app
cd my-cdk-app
cdk init app --language python
python -m venv .venv
source .venv/bin/activate # Windowsの場合: .venv\Scripts\activate
pip install -r requirements.txt
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class MyS3Stack 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
});
}
}
from aws_cdk import (
Stack,
aws_s3 as s3,
RemovalPolicy
)
from constructs import Construct
class MyS3Stack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
# S3バケットの作成
s3.Bucket(self, "MyFirstBucket",
versioned=True,
removal_policy=RemovalPolicy.DESTROY,
auto_delete_objects=True
)
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { MyS3Stack } from '../lib/my-s3-stack';
const app = new cdk.App();
new MyS3Stack(app, 'MyS3Stack');
#!/usr/bin/env python3
import aws_cdk as cdk
from my_s3_stack import MyS3Stack
app = cdk.App()
MyS3Stack(app, "MyS3Stack")
app.synth()
cdk synth
cdk diff
cdk deploy
cdk destroy
CDKでは、異なる環境(開発、テスト、本番など)に対して同じコードを使用し、環境ごとに異なる設定を適用することができます。
// TypeScript
new MyS3Stack(app, 'DevStack', {
env: { account: '123456789012', region: 'us-west-2' }
});
new MyS3Stack(app, 'ProdStack', {
env: { account: '987654321098', region: 'us-east-1' }
});
コンテキスト値を使用して、環境ごとに異なる設定を適用することができます。
// cdk.json
{
"context": {
"dev": {
"instanceType": "t2.micro",
"minCapacity": 1
},
"prod": {
"instanceType": "m5.large",
"minCapacity": 2
}
}
}
// TypeScript
const environment = this.node.tryGetContext('environment') || 'dev';
const envConfig = this.node.tryGetContext(environment);
new ec2.Instance(this, 'Instance', {
instanceType: new ec2.InstanceType(envConfig.instanceType),
// ...
});
CDKでは、Lambda関数のコードやDockerイメージなどのアセットを管理することができます。
// TypeScript
import * as lambda from 'aws-cdk-lib/aws-lambda';
new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'), // lambdaディレクトリ内のコードをデプロイ
});
再利用可能なカスタムコンストラクトを作成して、共通のパターンを抽象化することができます。
// TypeScript
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as s3n from 'aws-cdk-lib/aws-s3-notifications';
export interface S3LambdaTriggerProps {
bucketProps?: s3.BucketProps;
lambdaProps: lambda.FunctionProps;
}
export class S3LambdaTrigger extends Construct {
public readonly bucket: s3.Bucket;
public readonly function: lambda.Function;
constructor(scope: Construct, id: string, props: S3LambdaTriggerProps) {
super(scope, id);
// S3バケットの作成
this.bucket = new s3.Bucket(this, 'Bucket', props.bucketProps);
// Lambda関数の作成
this.function = new lambda.Function(this, 'Function', props.lambdaProps);
// S3イベント通知の設定
this.bucket.addEventNotification(
s3.EventType.OBJECT_CREATED,
new s3n.LambdaDestination(this.function)
);
}
}
AWS CDKとCloudFormationは密接に関連していますが、いくつかの重要な違いがあります。
特徴 | AWS CDK | CloudFormation |
---|---|---|
定義方法 | TypeScript、Python、Java、C#など(命令的) | YAML/JSON(宣言的) |
抽象化レベル | 高(コンストラクトレベル) | 低(リソースレベル) |
再利用性 | クラス、モジュール、ライブラリ | ネスト化されたスタック、カスタムリソース |
型安全性 | あり(言語による) | なし |
ロジックの実装 | プログラミング言語の機能を活用可能 | 制限あり |
学習曲線 | プログラミング知識が必要 | 比較的緩やか |
最終的な出力 | CloudFormationテンプレート | CloudFormationテンプレート |
AWS CDKとTerraformは、どちらもインフラストラクチャ as コード(IaC)ツールですが、いくつかの重要な違いがあります。
特徴 | AWS CDK | Terraform |
---|---|---|
プロバイダー | AWSのみ(CDK for Terraformを除く) | マルチクラウド(AWS、Azure、GCP、その他) |
言語 | TypeScript、Python、Java、C#など | HCL(HashiCorp Configuration Language) |
状態管理 | CloudFormationが管理 | 状態ファイルを管理する必要あり |
抽象化 | 高レベルのコンストラクト | リソースレベル(モジュールで抽象化可能) |
プログラミングモデル | オブジェクト指向 | 宣言的 |
コミュニティ | 成長中 | 大規模で成熟 |
学習曲線 | プログラミング言語の知識が必要 | HCLの学習が必要 |
CDK for Terraform(CDKTF)は、AWS CDKと同様のプログラミングモデルを使用して、Terraformプロバイダーを通じて任意のクラウドプロバイダーのリソースを定義できるようにするツールです。
import { Construct } from 'constructs';
import { App, TerraformStack } from 'cdktf';
import { AwsProvider } from '@cdktf/provider-aws';
import { Instance } from '@cdktf/provider-aws/lib/instance';
class MyStack extends TerraformStack {
constructor(scope: Construct, name: string) {
super(scope, name);
new AwsProvider(this, 'aws', {
region: 'us-west-2',
});
new Instance(this, 'compute', {
ami: 'ami-0c55b159cbfafe1f0',
instanceType: 't2.micro',
tags: {
Name: 'cdktf-instance',
},
});
}
}
const app = new App();
new MyStack(app, 'cdktf-example');
app.synth();
AWS CDK(Cloud Development Kit)は、使い慣れたプログラミング言語を使用してAWSインフラストラクチャをコードとして定義するための強力なフレームワークです。高レベルの抽象化、型安全性、再利用可能なコンポーネントなどの機能により、インフラストラクチャの定義と管理を効率化します。
AWS CDKの主な利点は以下の通りです:
AWS CDKを効果的に活用するには、適切な抽象化レベルの選択、カスタムコンストラクトの作成、環境の分離、テストの実装などのベストプラクティスを適用することが重要です。また、プロジェクトの要件に応じて、CloudFormationやTerraformなどの他のIaCツールと比較して、最適なツールを選択することも重要です。