MacでTypeScripのAWS CDKを試す

本記事では、AWSのGetting Started with the AWS CDKのチュートリアルを参考にAWS CDKを使ったTypeScriptを試してみた記録です。

  • AWS CDKのインストール
  • TypeScriptテンプレートのダウンロード
  • TypeScriptの作成
    • ライブラリファイルの作成
    • 実行ファイルの作成
  • TypeScriptのコンパイル
  • デプロイ環境の準備
  • AWSリソースのデプロイ

AWS CDKのインストール

以下のコマンドを利用してaws-cdkをグローバルインストールします。cdkコマンドをプロジェクトごとに管理したい場合は、-gオプションを外してローカルインストールする必要があります。

$ npm install -g aws-cdk
$ cdk --version
2.4.0 (build 993f14d)

TypeScriptテンプレートのダウンロード

利用できるTypeScriptのテンプレートは以下の通りで、app、lib、sample-appが選択できます。今回はappを選択します。

Available templates:
* app: Template for a CDK Application
   └─ cdk init app --language=typescript
* lib: Template for a CDK Construct Library
   └─ cdk init lib --language=typescript
* sample-app: Example CDK Application with some constructs
   └─ cdk init sample-app --language=typescript

プロジェクト用のディレクトリを作成し、appテンプレートをダウンロードします。ダウンロードが完了するとTypeScriptのコンパイルに必要なファイルが作成されます。

$ mkdir aws-cdk
$ cd aws-cdk/
$ cdk init app --language typescript
~~省略~~
✅ All done!

TypeScriptの作成

ライブラリファイルの作成

lib配下には、TypeScriptの雛形ファイルが作成されます。チュートリアルのS3サンプルコードを利用して以下のように編集します。これは、aws-cdk-test-bucketという名前のS3バケットを作成するだけのコードです。なお、クラス名であるTestS3StackはCloudFormationのスタック名になります。

import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { aws_s3 as s3 } from 'aws-cdk-lib';

export class TestS3Stack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    const bucket = new s3.Bucket(this, 'CdkTestBucket', {
        bucketName: 'aws-cdk-test-bucket',
        versioned: true,
        websiteRedirect: {hostName: 'aws.amazon.com'}});
  }
}

実行ファイルの作成

bin配下には、lib配下で作成したクラスのインスタンを生成して実行するためのTypeScriptコードがあります。以下のように編集してTestS3Stackを実行するように設定します。

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { TestS3Stack } from '../lib/aws-cdk-stack';

const app = new cdk.App();
new TestS3Stack(app, 'TestS3Stack', {});

TypeScriptのコンパイル

編集したTypeScriptをビルドします。ビルドが完了するとJavaScriptファイルが生成されます。

$ npm run build

> aws-cdk@0.1.0 build
> tsc

$ cdk ls
TestS3Stack

作成したTypeScriptをCloudFormationの形式に変換したい場合は以下のコマンドを利用します。

$ cdk synth
Resources:
  CdkTestBucket3821C40C:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: aws-cdk-test-bucket
      VersioningConfiguration:
        Status: Enabled
      WebsiteConfiguration:
        RedirectAllRequestsTo:
          HostName: aws.amazon.com
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Metadata:
      aws:cdk:path: TestS3Stack/CdkTestBucket/Resource
~~省略~~

デプロイ環境の準備

bootstrapコマンドを使用して、cdkを利用してデプロイできる環境を構築します。ここでは、CDKToolkitという名前のCloudFormationスタックが実行されます。

# aws cliの設定をしていない場合はあらかじめ設定しておきます。
$ aws configure
$ cdk bootstrap
~~省略~~
 ✅  Environment aws://[AWSのアカウントID]/[CLIで設定しているリージョン] bootstrapped.

実行が完了するとS3のバケットが作成されます。間違ってこのS3バケットを削除してしまうと、デプロイ時にエラーが発生します。その際は、CloudFormationのStackを削除して再度cdk bootstrapを実行してください。

$ aws s3 ls
2022-01-09 14:38:26 [バケット名]

#上記のバケットを削除してcdk deployを実行すると以下のエラーが発生します。
[100%] fail: No bucket named ‘バケット名’. Is account ‘アカウント名’ bootstrapped?

AWSリソースのデプロイ

deployコマンドを使用してTypeScriptに記述したバケットを作成します。一度CloudFormationの形式に変換された後、TestS3Stackという名前のスタックが作成されて実行されます。

$ cdk deploy

✨  Synthesis time: 8.98s

TestS3Stack: deploying...
[0%] start: Publishing ~~省略~~
[100%] success: Published ~~省略~~
TestS3Stack: creating CloudFormation changeset...

 ✅  TestS3Stack

✨  Deployment time: 50.63s

Stack ARN:
~~省略~~

✨  Total time: 59.6s

AWS上で確認すると、以下の通りバケットが作成されていました。

$ aws s3 ls | grep aws-cdk-test-bucket
2022-01-09 15:58:02 aws-cdk-test-bucket

以上です。