AWSに戻る

AWS CDK (Cloud Development Kit)

AWS CDKとは

AWS CDK(Cloud Development Kit)は、使い慣れたプログラミング言語を使用してクラウドインフラストラクチャをコードとして定義するためのオープンソースのソフトウェア開発フレームワークです。CDKを使用すると、TypeScript、Python、Java、C#などのプログラミング言語を使用してAWSリソースを定義し、それらをCloudFormationテンプレートに変換してデプロイすることができます。

AWS CDKの主な特徴

AWS CDKの仕組み

AWS CDKの基本的な仕組みは以下の通りです:

  1. CDKアプリケーションの作成: プログラミング言語を使用してAWSリソースを定義します。
  2. コンストラクトの使用: 再利用可能なコンポーネント(コンストラクト)を使用してリソースを定義します。
  3. 合成: CDKアプリケーションをCloudFormationテンプレートに変換します。
  4. デプロイ: 生成されたCloudFormationテンプレートをAWSにデプロイします。

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のインストールと設定

AWS CDKを使用するには、以下の手順でインストールと設定を行います:

前提条件

CDKのインストール

グローバルインストール

npm install -g aws-cdk

インストールの確認

cdk --version

AWS環境のブートストラップ

CDKを使用する前に、AWSアカウントとリージョンをブートストラップする必要があります。これにより、CDKが使用するリソース(S3バケット、IAMロールなど)が作成されます。

ブートストラップコマンド

cdk bootstrap aws://ACCOUNT-NUMBER/REGION

AWS CDKの基本的な使用方法

以下は、AWS CDKを使用してインフラストラクチャを定義するための基本的な手順です:

1. CDKプロジェクトの初期化

TypeScriptプロジェクトの作成

mkdir my-cdk-app
cd my-cdk-app
cdk init app --language typescript

Pythonプロジェクトの作成

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

2. スタックの定義

TypeScriptでのS3バケットの定義

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
    });
  }
}

Pythonでのs3バケットの定義

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
        )

3. CDKアプリケーションの定義

TypeScriptでのアプリケーション定義

#!/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');

Pythonでのアプリケーション定義

#!/usr/bin/env python3
import aws_cdk as cdk
from my_s3_stack import MyS3Stack

app = cdk.App()
MyS3Stack(app, "MyS3Stack")
app.synth()

4. CDKコマンドの実行

CloudFormationテンプレートの合成

cdk synth

変更の差分確認

cdk diff

スタックのデプロイ

cdk deploy

スタックの削除

cdk destroy

AWS CDKの高度な機能

環境の分離

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イメージなどのアセットを管理することができます。

Lambda関数のデプロイ

// 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は密接に関連していますが、いくつかの重要な違いがあります。

特徴 AWS CDK CloudFormation
定義方法 TypeScript、Python、Java、C#など(命令的) YAML/JSON(宣言的)
抽象化レベル 高(コンストラクトレベル) 低(リソースレベル)
再利用性 クラス、モジュール、ライブラリ ネスト化されたスタック、カスタムリソース
型安全性 あり(言語による) なし
ロジックの実装 プログラミング言語の機能を活用可能 制限あり
学習曲線 プログラミング知識が必要 比較的緩やか
最終的な出力 CloudFormationテンプレート CloudFormationテンプレート

AWS CDKとTerraformの比較

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の学習が必要

AWS CDKのベストプラクティス

AWS CDKの制限事項

CDK for Terraform

CDK for Terraform(CDKTF)は、AWS CDKと同様のプログラミングモデルを使用して、Terraformプロバイダーを通じて任意のクラウドプロバイダーのリソースを定義できるようにするツールです。

CDKTFの基本的な使用例(TypeScript)

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ツールと比較して、最適なツールを選択することも重要です。