×
採用サイトはこちら

AWS CDK (TypeScript) でインフラ構築【用語解説・ハンズオン】

はじめに

IaC (Infrastructure as Code)、CloudFormation、AWS CDK、Terraform。 こうした言葉に興味を持って調べてみたものの、「何から手をつければいいか分からない」「コードでインフラを作るイメージが湧かない」という方も多いのではないでしょうか?
本記事では、TypeScriptを使用してAWS CDKアプリケーションを作成し、S3バケットの構築から削除までの一連の流れを解説します。
この記事を通して、AWS CDKの基本的な仕組みや、コードベースでのインフラ構築に対する理解を深めていただければ幸いです。

目次

1. AWS CDK(Cloud Development Kit) とは?

AWS CDKは、TypeScriptやPythonなどのプログラミング言語を使ってインフラを定義できるフレームワークです。 CDKで記述したコードをビルド(合成)すると、裏側で自動的に「CloudFormationテンプレート」が生成(合成)され、それをもとにリソースが展開されます。
プログラミング言語の機能(変数、ループ、型補完など)を使えるため、効率よく、短いコードでインフラを記述できるのが特徴です。

CDKは TypeScript、Python、Java、C#、Goなど複数の言語をサポートしていますが、CDK自体がTypeScriptで開発されているため、構造的に最も親和性が高いのはTypeScriptと言えます。
また、公式ドキュメントや技術ブログなどの情報量もTypeScriptは豊富であるため、学習コストの低減やトラブルシューティングの容易さを踏まえると、TypeScriptによる開発が進めやすいと言えます。

2. ハンズオンの構成

今回のハンズオンでは、ローカル環境で作成したTypeScriptのコードをAWS CDKを使ってデプロイし、AWS上に「S3バケット」を1つ作成します。
本ハンズオンを通じて、以下のコマンドを使用したAWS CDK開発の一連の流れを学ぶことができます。

  1. cdk init でプロジェクトの雛形を作成
  2. TypeScriptコードでAWSリソースを定義
  3. cdk deploy でAWS上にリソースを作成(デプロイ)
  4. cdk destroy でリソースを削除(クリーンアップ)

3. ハンズオンStep1(環境構築)

CDKを実行するためには、以下のツールが必要です。
まだの方はインストールをお願いします。

3.1 CDKのインストールと作業用フォルダの作成

ターミナル(WindowsならPowerShellやコマンドプロンプト、MacならTerminal)を開き、以下のコマンドを実行してCDKをインストールします。

npm install -g aws-cdk

インストール後、以下のコマンドでバージョンが表示されればOKです。

cdk --version

続いて、作業用のフォルダを作成し、その中に移動しましょう。

mkdir cdk-s3-handson
cd cdk-s3-handson

3.2 AWS認証情報の設定

  • AWSへのアクセス権限設定
    今回は、既存の設定や他のプロジェクトと混ざらないように、名前付きプロファイルを指定して設定します。
    ご自身の環境に合わせて、以下のいずれかの手順を実行してください。

【パターンA:IAMユーザー(アクセスキー)を使用する場合】

aws configure --profile cdk-demo

※ コマンド実行後、AWS Access Key ID や Secret Access Key などを聞かれるので入力します。(この設定は cdk-demo という名前で保存されます)

【パターンB:SSO (IAM Identity Center) を使用する場合】

aws configure sso --profile cdk-demo

※ SSOを使用する場合、古い credentials ファイルの情報が残っていると認証エラーになることがあります。
CDKコマンド実行時にエラーが出る場合は .aws/credentials ファイルを確認してください。

3.3 CDKプロジェクトの初期化(init)と構成確認

以下のコマンドを実行すると、TypeScript用のCDKプロジェクトの雛形が自動生成されます。

cdk init app --language typescript --profile cdk-demo

※今回はプロファイルを指定したため、CDKコマンドを実行する際は、必ず末尾に --profile cdk-demo を付ける必要があります。

フォルダ構成の確認
初期化が終わると、いくつかのファイルが生成されます。 特に重要になるファイルは以下の2つです。

  • bin/cdk-s3-handson.ts: プログラムの実行開始地点(エントリポイント)
    ここで「どのStack(構成のまとまり)を作るか」を定義します。

  • lib/cdk-s3-handson-stack.ts: 使用するAWSリソースを記載する場所
    具体的に「S3バケットを作る」といったリソースの定義は、このファイルの中に記述していきます。

3.4 CDK用の環境準備(Bootstrap)

CDKをそのAWS環境(リージョン)で初めて使う場合、CDKが利用する管理用リソースを準備する必要があり、これを「Bootstrap」と呼びます。

cdk bootstrap --profile cdk-demo

※ 成功すると、CloudFormationコンソールに CDKToolkit というスタックが作成されます。

4. ハンズオンStep2(コードの作成)

それでは、実際にS3バケットを作成するコードを書いてみましょう。
今回は bin フォルダと lib フォルダ配下の2つのファイルを修正します。

ステップ①:エントリポイントの記述 (bin/cdk-s3-handson.ts)
まずは、アプリの入り口となるファイルを修正します。
bin/ 配下の cdk-s3-handson.ts を以下のコードに修正してください。

#!/usr/bin/env node
import 'source-map-support/register'; // エラー時のスタックトレースを見やすくするユーティリティ
import * as cdk from 'aws-cdk-lib';   // AWS CDKの基本ライブラリをインポート
import { CdkS3HandsonStack } from '../lib/cdk-s3-handson-stack'; // libフォルダで定義したStackクラスを読み込み

const app = new cdk.App(); // CDKアプリケーション全体の初期化(ルートとなる要素)

// 定義したStack(S3リソースの定義)をアプリに追加して実体化する
new CdkS3HandsonStack(app, 'CdkS3HandsonStack', {

});


ステップ②:メインロジックの記述 (lib/cdk-s3-handson-stack.ts)
次に、S3バケットを定義するメインのコードを記述します。
lib/ 配下の cdk-s3-handson-stack.ts を以下のコードに修正してください。

import * as cdk from 'aws-cdk-lib'; // AWS CDKのコアライブラリ(StackやAppなど)をインポート
import { Construct } from 'constructs'; // Construct(リソース構成要素の基本クラス)をインポート
import * as s3 from 'aws-cdk-lib/aws-s3'; // S3モジュールをインポート

// Stackクラスを定義(CloudFormationの1つのスタックに相当)
export class CdkS3HandsonStack extends cdk.Stack {
  // コンストラクト:Stackが初期化される際に呼ばれる処理
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props); // 親クラス(cdk.Stack)のコンストラクタを呼び出し

    // S3バケットの作成
    const bucket = new s3.Bucket(this, 'MyBucket', {
      bucketName: 'my-cdk-handson-bucket0001', // バケット名は一意になるように設定する
      versioned: true, // バージョニングを有効化
      removalPolicy: cdk.RemovalPolicy.DESTROY, // スタック削除時にバケットも削除する
      autoDeleteObjects: true, // バケット削除時に中身のファイルも自動削除する
    });
    
    // 作成されたバケット名をコンソールに出力
    new cdk.CfnOutput(this, 'BucketNameOutput', { 
      value: bucket.bucketName,
      description: 'S3バケットが作成されました',
    });
  }
}

カスタムコードの解説

  1. S3バケットの定義で、デフォルトの状態からこちらで追記した設定オプション (Props)のコードについて解説します。
  • versioned: true
    バケットのバージョニング機能をONにします。

  • removalPolicy: cdk.RemovalPolicy.DESTROY
    通常、CloudFormationはデータ保護のため、スタック削除コマンドを実行してもバケットを残そうとします。
    しかし、今回はハンズオンなので、スタック削除時にバケットも削除されるように設定します。

  • autoDeleteObjects: true
    S3バケットは中身(ファイル)が入っていると削除エラーになります。
    この設定を入れることで、削除時に中身を自動で空にしてからバケットを消してくれます。
    エラーになりがちなポイントを回避する重要な設定です。

5. ハンズオンStep3(デプロイ〜削除)

ステップ①:CloudFormationテンプレートの確認
デプロイ前に、TypeScriptコードがどのようなCloudFormationテンプレートに変換されるか確認します。

cdk synth --profile cdk-demo

※想定していないリソースが記載されている場合はここで確認できます。

ステップ②: デプロイ
実際にAWSリソースを作成します。

cdk deploy --profile cdk-demo
  • 実行すると、「IAMポリシーの変更などが発生するけど大丈夫?」と聞かれるので、y(Yes)を入力してEnterを押します。
  • 数分待つと、Stack ARN や BucketNameOutput が表示され、完了します。

ステップ③:作成されたリソースの確認

  1. AWSマネジメントコンソールで「S3」にアクセスすると、my-cdk-handson-bucket... から始まるバケットができていることが確認できます。
  2. 同じように CloudFormation にアクセスすると、CdkS3HandsonStack というスタックができていることが確認できます。

ステップ④:リソースの削除
最後に、以下のコマンドで作成したリソースを削除します。

cdk destroy --profile cdk-demo
  • 確認メッセージが出るので y を入力します。
  • これでS3バケットも含め、今回作成したリソースがすべてきれいに削除されます。
    (コード内で removalPolicy と autoDeleteObjects を設定したため)

6. まとめ

本記事では、AWS CDK (TypeScript) を使用した環境構築の基本からデプロイ・削除までを解説しました。
インフラの規模が大きくなるほど、このコード管理による利便性が向上します。
今回はS3のみを作成しましたが、EC2やLambdaなどの他リソースも同様にTypeScriptのクラスとして定義可能です。
次回は、CDKを用いてVPCおよびEC2(Webサーバー)を構築し、実際にブラウザからアクセスする手順を解説します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

弊社FindConsulting在籍のエンジニアです。
エンジニアの皆様に向けて、最新技術のトレンドや実務で使えるノウハウ、キャリア形成のヒントなど、皆様の成長をサポートする情報をお届けしています。
長期的に、共に学び、成長していける皆様との繋がりを心よりお待ちしております。

目次