• ホーム
  • dx
  • AWS CDKとは?初心者でもわかる基礎知識からメリット・始め方まで徹底解説
dxdx

AWS CDKとは?初心者でもわかる基礎知識からメリット・始め方まで徹底解説

AWS CDKとは?初心者でもわかる基礎知識からメリット・始め方まで徹底解説
「AWSのインフラ構築を効率化したいけれど、CloudFormationのYAMLやJSONを書くのは大変…」「プログラミング言語でインフラを管理できると聞いたけれど、AWS CDKって実際どうなの?」そんな疑問をお持ちではないでしょうか。DX推進を任された担当者にとって、クラウドインフラの効率的な管理は避けて通れない課題です。 本記事では、AWS CDKの基礎知識から実際の導入手順、そしてベストプラクティスまでを徹底解説します。初心者の方でも理解できるよう、コード例や比較表を交えながら、明日から実践できる具体的なノウハウをお伝えします。

目次

AWS CDKとは何か

AWS CDKは、クラウドインフラの構築・管理方法を根本から変える可能性を持つツールです。ここでは、AWS CDKの基本的な概念と、なぜ今注目を集めているのかを解説します。

AWS CDKの基本概念

AWS CDK(Cloud Development Kit)は、AWSが提供するオープンソースのInfrastructure as Code(IaC)フレームワークです。IaCとは、サーバーやネットワークなどのインフラ環境を、手作業ではなくコードで定義・管理する手法を指します。従来、インフラ構築はAWSマネジメントコンソールで手動設定したり、CloudFormationのテンプレートファイルを記述したりする方法が主流でした。

AWS CDKの最大の特徴は、TypeScriptやPythonなど、普段使い慣れたプログラミング言語でAWSリソースを定義できる点にあります。これにより、条件分岐やループ処理といったプログラミングの強力な機能を活用しながら、インフラを構築できるようになりました。

AWS CDKで記述したコードは、最終的にCloudFormationテンプレートに変換されてデプロイされます。つまり、AWS CDKはCloudFormationの上位レイヤーとして機能し、より直感的かつ効率的なインフラ管理を実現するツールなのです。

AWS CDKが従来のCloudFormationと異なる点

CloudFormationは長年にわたりAWSのIaCツールとして利用されてきましたが、YAMLやJSONで記述する必要があり、学習コストや記述量の多さが課題でした。AWS CDKは、この課題を解決するために生まれました。

両者の違いを具体的なコード例で見てみましょう。S3バケットをバージョニング有効で作成する場合、CloudFormationでは以下のように記述します。

# CloudFormation(YAML)の場合
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: my-versioned-bucket
      VersioningConfiguration:
        Status: Enabled
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true

一方、AWS CDKでは同じリソースを以下のように簡潔に記述できます。

// AWS CDK(TypeScript)の場合
import * as s3 from 'aws-cdk-lib/aws-s3';

new s3.Bucket(this, 'MyBucket', {
  versioned: true,
  blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
});

AWS CDKでは、セキュリティ設定などがデフォルトで適用されるため、記述量が大幅に削減されます。また、IDEの補完機能やエラーチェックが使えるため、タイプミスによるデプロイ失敗も防げます。

AWS CDKで使用できるプログラミング言語

AWS CDKは複数のプログラミング言語に対応しており、開発チームの技術スタックに合わせて選択できます。2025年現在、公式にサポートされている言語は以下の通りです。

言語特徴推奨される利用シーン
TypeScriptAWS CDKの開発言語であり、最新機能が最初に実装される型安全性を重視するプロジェクト、フロントエンド開発チーム
JavaScriptTypeScriptの知識不要で手軽に始められる小規模プロジェクト、プロトタイピング
Pythonデータサイエンス系チームに馴染みやすい機械学習基盤の構築、Lambda関数との親和性
Javaエンタープライズ開発で実績がある既存のJavaアプリケーションとの統合
C#.NETエコシステムと簡単に統合できるWindows環境での開発、Azure経験者の移行
Goビルドが高速で文法がシンプルであるマイクロサービス基盤の構築

言語選択に迷った場合は、TypeScriptを選ぶことをお勧めします。AWS CDK自体がTypeScriptで開発されているため、ドキュメントやサンプルコードが最も充実しており、新機能も最初にTypeScriptで利用可能になります。

AWS CDKの導入方法

AWS CDKを実際に使い始めるには、いくつかのツールをインストールし、初期設定を行う必要があります。ここでは、初めての方でも迷わないよう、一つ一つ丁寧に解説します。

AWS CDKのインストール手順

AWS CDKを使用するには、事前にいくつかのツールが必要です。以下の順序でインストールを進めてください。

まず、Node.jsをインストールします。AWS CDKはNode.js上で動作するため、バージョン18以上のNode.jsが必要です。公式サイト(nodejs.org)からダウンロードするか、お使いのOSのパッケージマネージャーを使用してインストールしてください。インストール後、以下のコマンドでバージョンを確認します。

node --version
# v18.0.0 以上が表示されればOK

次に、AWS CLIをインストールし、認証情報を設定します。AWS CLIは、コマンドラインからAWSサービスを操作するためのツールです。インストール後、以下のコマンドで認証情報を設定します。

aws configure
# AWS Access Key ID: [アクセスキーを入力]
# AWS Secret Access Key: [シークレットキーを入力]
# Default region name: ap-northeast-1
# Default output format: json

最後に、AWS CDK CLIをグローバルインストールします。

npm install -g aws-cdk

# インストール確認
cdk --version
# 2.x.x が表示されればOK

これらの3つのツール(Node.js、AWS CLI、AWS CDK CLI)が揃えば、AWS CDKを使う準備は完了です。

初めてのプロジェクト作成とディレクトリ構成

AWS CDKの環境が整ったら、早速プロジェクトを作成してみましょう。ここではTypeScriptを使用した例を紹介します。

まず、プロジェクト用のディレクトリを作成し、そこでCDKの初期化コマンドを実行します。

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

このコマンドを実行すると、以下のようなディレクトリ構成が自動生成されます。

my-first-cdk-app/
├── bin/
│   └── my-first-cdk-app.ts    # Appの定義(エントリーポイント)
├── lib/
│   └── my-first-cdk-app-stack.ts  # Stackの定義(リソース定義)
├── test/
│   └── my-first-cdk-app.test.ts   # テストコード
├── cdk.json                    # CDK設定ファイル
├── package.json                # npm依存関係
└── tsconfig.json               # TypeScript設定

AWS CDKの構造は、App、Stack、Constructという3つの階層で構成されています。この階層構造を理解することが、AWS CDKを使いこなす第一歩です。

Appは最上位の要素で、複数のStackを管理します。Stackはデプロイの最小単位であり、CloudFormationスタックに対応します。Constructは個々のAWSリソース(S3バケットやLambda関数など)を表す基本単位です。

AWS CDKでデプロイするための初期設定

プロジェクトを作成したら、最初のデプロイを行う前にブートストラップという初期設定が必要です。ブートストラップとは、AWS CDKがデプロイ時に使用するS3バケットやIAMロールなどのリソースを、対象のAWSアカウント・リージョンに作成する処理です。

cdk bootstrap aws://[アカウントID]/ap-northeast-1

アカウントIDがわからない場合は、以下のコマンドで確認できます。

aws sts get-caller-identity --query Account --output text

ブートストラップは、各AWSアカウント・リージョンの組み合わせごとに1回だけ実行すれば十分です。複数のプロジェクトで同じアカウント・リージョンを使用する場合、再度実行する必要はありません。

これで、AWS CDKを使ってAWSリソースをデプロイする準備が整いました。ブートストラップが完了したら、いよいよ実際のリソース定義とデプロイに進みましょう。

AWS CDKの基本的な使い方

環境構築が完了したら、実際にAWSリソースを定義してデプロイしてみましょう。ここでは、AWS CDKの核となる概念であるスタックとコンストラクトの書き方から、具体的なデプロイ方法まで解説します。

スタックとコンストラクトの書き方

AWS CDKでは、Constructという単位でAWSリソースを定義します。Constructには3つのレベル(L1、L2、L3)があり、それぞれ抽象度が異なります。

レベル名称特徴使用例
L1CFN ResourcesCloudFormationリソースと1対1対応。全プロパティを明示的に指定new CfnBucket(this, 'Bucket', {...})
L2Curated ConstructsL1をラップし、デフォルト値やヘルパーメソッドを提供new s3.Bucket(this, 'Bucket', {...})
L3Patterns複数のL2を組み合わせた高レベルの抽象化new LambdaRestApi(this, 'Api', {...})

通常の開発では、ベストプラクティスが組み込まれたL2 Constructsを使用することをお勧めします。L1は細かな制御が必要な場合に、L3は定型的なアーキテクチャパターンを素早く構築したい場合に使用します。

以下は、L2 Constructを使用してS3バケットとLambda関数を定義する例です。

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { Construct } from 'constructs';

export class MyFirstCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // S3バケットの作成(L2 Construct)
    const bucket = new s3.Bucket(this, 'MyBucket', {
      versioned: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    });

    // Lambda関数の作成(L2 Construct)
    const fn = new lambda.Function(this, 'MyFunction', {
      runtime: lambda.Runtime.NODEJS_18_X,
      handler: 'index.handler',
      code: lambda.Code.fromInline(`
        exports.handler = async () => {
          return { statusCode: 200, body: 'Hello from CDK!' };
        };
      `),
    });

    // バケットへの読み取り権限を付与
    bucket.grantRead(fn);
  }
}

よく使うAWSリソースの定義方法

実際のプロジェクトでよく使用されるAWSリソースの定義方法を紹介します。これらのパターンを押さえておくことで、多くのユースケースに対応できるようになります。

VPCとサブネットの作成は、多くのAWSアーキテクチャの基盤となります。AWS CDKでは、以下のように簡潔に定義できます。

import * as ec2 from 'aws-cdk-lib/aws-ec2';

const vpc = new ec2.Vpc(this, 'MyVpc', {
  maxAzs: 2,  // 2つのアベイラビリティゾーンを使用
  subnetConfiguration: [
    {
      name: 'Public',
      subnetType: ec2.SubnetType.PUBLIC,
    },
    {
      name: 'Private',
      subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
    },
  ],
});

DynamoDBテーブルの作成も頻繁に行われる操作です。オンデマンドキャパシティモードでテーブルを作成する例を示します。

import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';

const table = new dynamodb.Table(this, 'MyTable', {
  partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
  billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
  removalPolicy: cdk.RemovalPolicy.DESTROY,
});

AWS CDKの強みは、リソース間の関連付けをメソッドチェーンで直感的に記述できる点です。例えば、Lambda関数にDynamoDBへの読み書き権限を付与するには、table.grantReadWriteData(fn)と1行書くだけで、必要なIAMポリシーが自動的に生成されます。

AWS CDKコマンドによるデプロイと削除

リソース定義が完了したら、AWS CDKのコマンドを使ってデプロイを行います。主要なコマンドとその用途を以下にまとめます。

コマンド説明実行タイミング
cdk listプロジェクト内のスタック一覧を表示スタック構成の確認時
cdk synthCloudFormationテンプレートを生成・表示コード変更後の確認時
cdk diff現在のスタックとの差分を表示デプロイ前の影響確認時
cdk deployスタックをAWSにデプロイ本番反映時
cdk destroyスタックを削除リソースの完全削除時

安全なデプロイのためのワークフローとして、以下の順序でコマンドを実行することをお勧めします。

# 1. テンプレートの生成と確認
cdk synth

# 2. 現在の環境との差分確認
cdk diff

# 3. 問題なければデプロイ実行
cdk deploy

# 4. 不要になったらリソース削除
cdk destroy

特に本番環境へのデプロイ前には、必ずcdk diffで変更内容を確認する習慣をつけましょう。意図しないリソースの削除や変更を事前に検知できます。


関連記事はこちら: AWS Amplify超入門|React対応のフルスタック開発を1人で実現する方法

AWS CDKを活用するためのベストプラクティス

AWS CDKを本格的に活用するには、再利用性を高める設計やテスト手法、本番運用時の注意点を押さえておく必要があります。ここでは、実務で役立つベストプラクティスを紹介します。

再利用可能なコンストラクトの設計方法

AWS CDKの真価は、カスタムConstructを作成してインフラパターンを再利用できる点にあります。チーム内で共通のセキュリティ設定やネーミング規則を持つリソースを、何度も同じコードを書くことなく展開できるようになります。

以下は、セキュアなS3バケットを作成するカスタムConstructの例です。

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import { Construct } from 'constructs';

export interface SecureBucketProps {
  bucketName?: string;
  enableVersioning?: boolean;
}

export class SecureBucket extends Construct {
  public readonly bucket: s3.Bucket;

  constructor(scope: Construct, id: string, props: SecureBucketProps = {}) {
    super(scope, id);

    this.bucket = new s3.Bucket(this, 'Bucket', {
      bucketName: props.bucketName,
      versioned: props.enableVersioning ?? true,
      encryption: s3.BucketEncryption.S3_MANAGED,
      blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
      enforceSSL: true,
      removalPolicy: cdk.RemovalPolicy.RETAIN,
    });
  }
}

このカスタムConstructを使えば、以下のように簡潔にセキュアなバケットを作成できます。

// スタック内での使用例
const secureBucket = new SecureBucket(this, 'MySecureBucket', {
  bucketName: 'my-secure-data-bucket',
});

カスタムConstructを活用することで、セキュリティ設定の漏れを防ぎ、組織全体で一貫したインフラ構成を維持できます。

AWS CDKでのテスト手法

インフラをコードで管理するメリットの一つは、アプリケーションコードと同様にテストを書けることです。AWS CDKは、スナップショットテストとファインアサーションテストという2つのテスト手法をサポートしています。

スナップショットテストは、生成されるCloudFormationテンプレートの変更を検知します。意図しない変更が入っていないかを確認するのに有効です。

import * as cdk from 'aws-cdk-lib';
import { Template } from 'aws-cdk-lib/assertions';
import { MyFirstCdkAppStack } from '../lib/my-first-cdk-app-stack';

test('Snapshot test', () => {
  const app = new cdk.App();
  const stack = new MyFirstCdkAppStack(app, 'TestStack');
  const template = Template.fromStack(stack);
  
  expect(template.toJSON()).toMatchSnapshot();
});

ファインアサーションテストは、特定のリソースが期待通りに定義されているかを検証します。

test('S3 bucket is created with versioning', () => {
  const app = new cdk.App();
  const stack = new MyFirstCdkAppStack(app, 'TestStack');
  const template = Template.fromStack(stack);

  template.hasResourceProperties('AWS::S3::Bucket', {
    VersioningConfiguration: {
      Status: 'Enabled',
    },
  });
});

CI/CDパイプラインにこれらのテストを組み込むことで、インフラ変更の品質を継続的に担保できます。GitHub ActionsやAWS CodePipelineと連携し、プルリクエスト時に自動テストを実行する構成が一般的です。

本番環境で運用する際の注意点

開発環境では問題なく動作していても、本番環境では予期しない問題が発生することがあります。以下のポイントに注意して、安全な運用を心がけましょう。

環境ごとの設定分離は、本番運用で最も重要な考慮事項です。開発、ステージング、本番で異なる設定を使い分けるには、CDK Contextや環境変数を活用します。

// 環境ごとに異なるスタック設定
const envConfig = {
  dev: { instanceType: 't3.micro', minCapacity: 1 },
  staging: { instanceType: 't3.small', minCapacity: 2 },
  prod: { instanceType: 't3.medium', minCapacity: 3 },
};

const env = app.node.tryGetContext('env') || 'dev';
const config = envConfig[env];

既存リソースの管理も重要です。AWS CDKで管理されていない既存のリソースを参照するには、fromLookupメソッドを使用します。

// 既存のVPCを参照
const existingVpc = ec2.Vpc.fromLookup(this, 'ExistingVpc', {
  vpcId: 'vpc-xxxxxxxx',
});

// 既存のS3バケットを参照
const existingBucket = s3.Bucket.fromBucketName(this, 'ExistingBucket', 'my-existing-bucket');

削除保護の設定も忘れずに行いましょう。本番環境のデータベースやS3バケットには、removalPolicy: cdk.RemovalPolicy.RETAINを設定し、スタック削除時にリソースが誤って削除されないようにします。

AWS CDKは強力なツールですが、大規模なインフラ構築や複雑な要件に対応するには、専門的な知識と経験が必要です。特に、既存システムとの統合やセキュリティ要件の厳しい環境では、経験豊富なエンジニアのサポートがあると安心です。

DX推進においてクラウドインフラの効率化は重要なテーマですが、ツールの導入だけでなく、ビジネス目標に沿った設計と運用体制の構築が成功の鍵を握ります。自社だけでの対応に不安がある場合は、上流工程から運用まで一貫してサポートできるパートナーに相談することで、より確実にDXを推進できるでしょう。

まとめ

本記事では、AWS CDKの基本概念から導入手順、実践的な使い方、そして本番運用のベストプラクティスまで解説してきました。AWS CDKは、TypeScriptやPythonといった馴染みのあるプログラミング言語でAWSインフラを定義できるIaCフレームワークであり、CloudFormationと比較して記述量の削減やIDEサポートによる生産性向上が期待できます。

AWS CDKを活用することで、インフラ構築の再現性が高まり、開発・ステージング・本番といった複数環境の一貫した管理が可能になります。また、Constructの3層構造(L1、L2、L3)を理解し、カスタムConstructを設計することで、組織全体で再利用可能なインフラパターンを構築できます。テストやCI/CDとの連携により、インフラ変更の品質を継続的に担保できる点も大きなメリットです。

AWS CDKの導入は、DX推進における重要な一歩ですが、ツールの習得だけでなく、自社のビジネス要件に合わせた設計と運用体制の整備が成功への鍵となります。クラウドインフラの効率化やDX推進について、より具体的な相談をしたい場合は、ビジネス理解から開発、運用まで一貫してサポートできる専門パートナーへの相談をご検討ください。



プロフィール画像
記事を書いた人
泉川 学

小売業界でブランド品のバイヤーなどを経験したのちIT業界に転身。 株式会社ライブドアのインフラ事業の営業責任者を担当。 ベンチャー企業の運営に関わった後、2016年にデザインワン・ジャパン(現GMOデザインワン株式会社)へ入社。 「エキテン」事業の営業・サポート部門責任者を務めたのち受託開発事業の立ち上げを担当し、 現在は執行役員兼エキテン事業、受託開発事業とその所管グループ会社を統括。

contact お気軽にご連絡下さい。