
AWS CDK で L2 Constructs を使いつつ,L2 Constructs 未サポートのプロパティを L1 Constructs にキャストして設定するテクニックを「エスケープハッチ」と言う.ドキュメントに詳しく載っている📝
「エスケープハッチ」というテクニック自体は知っていたけど,今まで必要になる場面にほとんど遭遇してなく,実は使ったことがなかった😅せっかくなら試してみよう〜ということで試したログを簡単にまとめておこうと思う \( 'ω')/
Amazon SNS トピックの「データ保護ポリシー」
今回は Amazon SNS トピックの「データ保護ポリシー」をテーマにする❗️
「データ保護ポリシー」は現状だと L2 Constructs の sns.Topic には実装されてなく,L1 Constructs の sns.CfnTopic では dataProtectionPolicy プロパティとして設定できる.
ちなみに L2 Constructs に dataProtectionPolicy を追加してくれ〜という issue は既にあって,様子を見てると近々サポートされそうな気配がある👀
👾 lib/sns-escape-hatches.ts
以下のように実装した👌ポイントは Amazon SNS トピックを L2 Constructs で実装しつつ,L1 Constructs にキャストしているところ.すると cfnTopic.dataProtectionPolicy で L2 Constructs では未サポートの「データ保護ポリシー」を設定できるようになる.ちなみに今回はサンプルとして「拒否」を設定している🙅
import { Stack, StackProps, aws_sns, } from 'aws-cdk-lib' import { Construct } from 'constructs' export class SnsEscapeHatchesStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props) const topic = new aws_sns.Topic(this, 'Sandbox', { topicName: 'sandbox-topic', }) const cfnTopic = topic.node.defaultChild as aws_sns.CfnTopic cfnTopic.dataProtectionPolicy = { 'Name': 'SandboxDataProtectionPolicy', 'Description': 'Sandbox Data Protection Policy', 'Version': '2021-06-01', 'Statement': [ { 'Sid': 'SandboxDataProtectionPolicyStatementInbound', 'DataDirection': 'Inbound', 'Principal': [ '*' ], 'DataIdentifier': [ 'arn:aws:dataprotection::aws:data-identifier/Address', 'arn:aws:dataprotection::aws:data-identifier/AwsSecretKey', ], 'Operation': { 'Deny': {} } } ], } } }
デプロイ確認
cdk deploy を実行して Amazon SNS トピックを確認すると期待通りに「データ保護ポリシー」を設定できていた👏
