📑

【ハンズオン】AWS CDKの基本操作を学ぶ in TypeScript

2023/06/26に公開

本ブログではAWS Cloud Development Kit (CDK v2) の基礎操作をハンズオン形式で紹介します。

No. 基本コマンド 目的・用途
1 cdk init CDKプロジェクトの作成
2 cdk bootstrap cdk deployに必要なリソース(KMS, S3, IAMロール等)を事前準備
3 cdk synth Stack定義されたCDKアプリのコンパイルとCFnテンプレートの生成
4 cdk deploy Stack定義されたAWSリソースの作成
5 cdk destroy Stack定義されたAWSリソースの削除

公式 - AWS CDKv2 cdkコマンド集

■ ハンズオン

1. 環境設定

AWS CDKはNode.js上で実行されるため、Node.jsのランタイムが必要です。本ブログではnvmを使用していますが、Node.jsの公式からパッケージをインストールしてもOKです。

# LTS版のNode.js をインストールする
> nvm install --lts

# 現在設定された Node.jsのバージョン を確認する
> node --version
v20.9.0

AWS CDKはAWSリソースを作成・管理するためにAWS CLIv2が必要です。AWSの公式からパッケージをインストールします。

# 現在設定された AWS CLIv2のバージョン を確認する
> aws --version
aws-cli/2.13.29

AWSの資格情報を登録します。credentials と configファイルを作成して、登録してもOKです。
※ 本ブログでは、 defaultプロファイルに資格情報を設定します。

# 資格情報を設定する
> aws configure
AWS Access Key ID []: (アクセスキー)
AWS Secret Access Key []: (シークレットキー)
Default region name []: (リージョンコード、`ap-northeast-1` を設定)
Default output format []: (コンソール出力のフォーマット、`json` を設定)

AWS CDKを利用するためにCDK Toolkitをインストールします。cdkコマンドが使えるようになります。

# aws-cdk@2 をインストールする
> npm install -g aws-cdk@2

# 現在設定された AWS CDKのバージョン を確認する
> cdk --version
2.103.0 (build d0d7547)

TypeScript で AWS CDK を操作するために、Microsoft の TypeScript コンパイラをインストールします。cf. Working with the AWS CDK in TypeScript

# typescript をインストールする
> npm install -g typescript

# 現在設定された TypeScript を確認する
> tsc --version
Version 5.2.2

2. CDKプロジェクトの作成(cdk init)

フォルダを作成します。ディレクトリに移動します。

> mkdir hands-on-cdk-project && cd hands-on-cdk-project

CDKのプロジェクトをcdk initコマンドを実行して生成します。

hands-on-cdk-project> cdk init app --language typescript

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

CDKの構成は、他のIaCツールとほぼ変わりません。
1つのAppファイルにAWSリソースを定義した1つ以上のStackファイルを書きます。

下記の2ファイルをそれぞれのディレクトリに配置してください!

hands-on-cdk-project/lib/fargate-service-stack.ts
import { Construct } from 'constructs';
import * as cdk from 'aws-cdk-lib';
import { aws_ec2 as ec2 } from 'aws-cdk-lib';
import { aws_ecs as ecs } from 'aws-cdk-lib';
import { aws_ecs_patterns as ecs_patterns } from 'aws-cdk-lib';

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

    // VPCの作成
    const vpc = new ec2.Vpc(this, 'HandsOnCdkVpc', {
      ipAddresses: ec2.IpAddresses.cidr('192.168.0.0/24'),
    })

    // ECSクラスターの作成
    const cluster = new ecs.Cluster(this, 'HandsOnCdkCluster', { vpc });

    // Fargateタスクの定義
    const taskDefinition = new ecs.FargateTaskDefinition(this, 'HandsOnCdkFargateTaskDef');
    const container = taskDefinition.addContainer('HandsOnAppContainer', {
      // https://hub.docker.com/_/nginx アプリを設定
      image: ecs.ContainerImage.fromRegistry('nginx'),
    });
    container.addPortMappings({ containerPort: 80 });

    // Fargateサービスの作成
    new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'HandsOnCdkFargateService', {
      cluster,
      taskDefinition,
      publicLoadBalancer: true,  // 公開ロードバランサーを有効化
    });
  }
}
hands-on-cdk-project/bin/hands-on-cdk-project.ts
import * as cdk from 'aws-cdk-lib';
import { FargateServiceStack } from '../lib/fargate-service-stack';

const app = new cdk.App();
new FargateServiceStack(app, 'FargateServiceStack');

4. CDKデプロイメントの事前準備(cdk bootstrap)

CDKを使用して、リソース作成を行う前に事前準備が必要です。

hands-on-cdk-project> cdk bootstrap

5. テスト(cdk synth)とデプロイ(cdk deploy)

まずは、作成されたCDKコードが正しいかどうかを調べます。
CDKは CloudFormationテンプレートを生成するツール なので、cdk synthコマンドを実行して構築計画のリソース情報を確認します。

hands-on-cdk-project> cdk synth

とりわけ、AWSリソースの設定値やメタデータなどに不備がないことを確認し、cdk deployコマンドを実行してAWSリソースを構築します。

hands-on-cdk-project> cdk deploy

コマンド実行後、最終確認の案内がコンソール上に出力されるので、yを入力して、エンターを押下します。

Do you wish to deploy these changes (y/n)? y

FargateServiceStack: deploying... [1/1]
FargateServiceStack: creating CloudFormation changeset...

「3. CDKアプリケーションの定義」のサンプルコードでdeployした場合、5分ほどで完了します。

完了後の画面はこのようなイメージです。

AWS FargateのサービスエンドポイントURLをブラウザでアクセスしてみます(赤枠の部分)。みなさんも見慣れたNginxのクイックスタート画面が表示さればAWSリソースの構築は成功です。

6. 環境削除(cdk destroy)

「5. テスト(cdk synth)とデプロイ(cdk deploy)」で、CDKはCloudFormationテンプレートを生成するツール(再掲)と紹介しました。実際にAWSコンソールを確認してみます。FargateServiceStackを削除することでAWSリソースを削除することが可能です。

今回はcdk destroyコマンドを使用してAWSリソースを削除します。ただし、DBやストレージ系のサービスはリソースの削除保護を設定可能であり、もしその設定をcdk deployで構築した場合、destroyコマンドでは削除できないので注意ください(AWSコンソール上で手動削除する必要あり)。

hands-on-cdk-project> cdk destroy

コマンド実行後、最終確認の案内がコンソール上に出力されるので、yを入力して、エンターを押下します。

Are you sure you want to delete: FargateServiceStack (y/n)? y

AWSコンソール上でFargateServiceStackを確認するとDELETE_IN_PROGRESSステータスになっていますね。

さらに待つと、削除処理が完了します(体感 5分ぐらい?)。

■ さいごに

CDKは、AWSのリソースを構築するためのフレームワークであり、TypeScript/JavaScript、Python、Java、C#、Goのプログラミング言語でインフラストラクチャを定義します。今まで、サーバーサイドやフロントエンドで活躍していた開発者を考慮したIaCツールになっています。

TerraformやAnsibleのような宣言型プログラム言語とは違い、CDKは条件分岐や反復処理が容易に定義できる利点がある反面、IaC自体はシンプルisベストを主として運用されるため、インフラエンジニアから見ると苦手意識がある反面も。

最終的な選択はプロジェクトの要件や個人の好みに依存しますが、AWSではCloudFormationを利用する場面が多いのでCDKを採用するチームが増えてもいいかなと感じました。

Discussion