AWS CDK(v1)のworkshopをやってみた

  • AWS
  • CDK
  • TypeScript

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

AWS CDKのworkshopを試した。TypeScriptでSQSキューを作って、SNSトピックからサブスクリプションを張るだけの最小構成。

セットアップ

グローバルにCDK CLIを入れてcdk initで雛形を作る。

npm install -g aws-cdk
cdk init app --language typescript

生成されるのはbin/とlib/の2階層。bin/cdk-workshop.tsがエントリーポイントで、lib/cdk-workshop-stack.tsに実際のリソース定義を書く形になっている。

エントリーポイント

#!/usr/bin/env node
import cdk = require('@aws-cdk/core');
import { CdkWorkshopStack } from '../lib/cdk-workshop-stack';
const app = new cdk.App();
new CdkWorkshopStack(app, 'CdkWorkshopStack');

cdk.Appのインスタンスに対して、Stackをnewで生やしていくだけ。CloudFormationのスタックという単位が、そのままクラスのインスタンスに対応している。

リソース定義

SQSキューを1つ作って、SNSトピックからサブスクライブさせる。

import sns = require('@aws-cdk/aws-sns');
import subs = require('@aws-cdk/aws-sns-subscriptions');
import sqs = require('@aws-cdk/aws-sqs');
import cdk = require('@aws-cdk/core');
export class CdkWorkshopStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const queue = new sqs.Queue(this, 'CdkWorkshopQueue', {
visibilityTimeout: cdk.Duration.seconds(300)
});
const topic = new sns.Topic(this, 'CdkWorkshopTopic');
topic.addSubscription(new subs.SqsSubscription(queue));
}
}

v1系はパッケージがサービス単位で分かれているのが特徴。SNSを使うなら@aws-cdk/aws-sns、SQSなら@aws-cdk/aws-sqsと、都度installする必要がある。

cdk.jsonとtsconfig

cdk.jsonはアプリの起動コマンドを1行書くだけ。

{ "app": "npx ts-node bin/cdk-workshop.ts" }

tsconfig.jsonはstrict系のオプションを一通り有効にした構成だった。

{
"compilerOptions": {
"target": "ES2018",
"module": "commonjs",
"lib": ["es2016", "es2017.object", "es2017.string"],
"declaration": true,
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"noImplicitThis": true,
"alwaysStrict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": false,
"inlineSourceMap": true,
"inlineSources": true,
"experimentalDecorators": true,
"strictPropertyInitialization": false
},
"exclude": ["cdk.out"]
}

cdk synthの出力

cdk synthを叩くと、TypeScriptのコードからCloudFormationテンプレートが生成される。

Resources:
CdkWorkshopQueue50D9D426:
Type: AWS::SQS::Queue
Properties:
VisibilityTimeout: 300
Metadata:
aws:cdk:path: CdkWorkshopStack/CdkWorkshopQueue/Resource
CdkWorkshopQueuePolicyAF2494A5:
Type: AWS::SQS::QueuePolicy
Properties:
PolicyDocument: ...

new sqs.Queue(this, 'CdkWorkshopQueue', ...)のコンストラクトIDに、ハッシュ値が付与されて論理IDになっている。コード上のIDとCloudFormation上の論理IDが1対1で対応しているわけではなく、pathから生成される仕組みらしい(内部実装は未確認)。

QueuePolicyはコード上で明示的に書いていないのに、addSubscriptionした時点で自動生成されている。SNSからSQSへの送信を許可するポリシーが必要になるので、そのぶんが暗黙的に追加される形。

デプロイまでの流れ

cdk bootstrap
cdk deploy
cdk diff

bootstrapは初回のみ、CDKが使うS3バケットなどをアカウント内に用意するコマンド。deployは毎回、diffは変更確認用。

分かったのは、コードで書いているのはリソースの意図だけで、キューポリシーのような付随リソースはCDK側が構成から推測して足してくれるという点。手でCloudFormationを書くときは自分で書いていた部分が省略できる。