

AWS CDK(v1)のworkshopをやってみた
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
AWS CDKのworkshopを試した。TypeScriptでSQSキューを作って、SNSトピックからサブスクリプションを張るだけの最小構成。
セットアップ
グローバルにCDK CLIを入れてcdk initで雛形を作る。
npm install -g aws-cdkcdk init app --language typescript生成されるのはbin/とlib/の2階層。bin/cdk-workshop.tsがエントリーポイントで、lib/cdk-workshop-stack.tsに実際のリソース定義を書く形になっている。
エントリーポイント
#!/usr/bin/env nodeimport 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 bootstrapcdk deploycdk diffbootstrapは初回のみ、CDKが使うS3バケットなどをアカウント内に用意するコマンド。deployは毎回、diffは変更確認用。
分かったのは、コードで書いているのはリソースの意図だけで、キューポリシーのような付随リソースはCDK側が構成から推測して足してくれるという点。手でCloudFormationを書くときは自分で書いていた部分が省略できる。