本記事では、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
以上です。