kakakakakku blog

Weekly Tech Blog: Keep on Learning!

エスケープハッチ: CDK の L2 Constructs "sns.Topic" で未サポートのデータ保護ポリシーを設定する

AWS CDK で L2 Constructs を使いつつ,L2 Constructs 未サポートのプロパティを L1 Constructs にキャストして設定するテクニックを「エスケープハッチ」と言う.ドキュメントに詳しく載っている📝

docs.aws.amazon.com

「エスケープハッチ」というテクニック自体は知っていたけど,今まで必要になる場面にほとんど遭遇してなく,実は使ったことがなかった😅せっかくなら試してみよう〜ということで試したログを簡単にまとめておこうと思う \( 'ω')/

Amazon SNS トピックの「データ保護ポリシー」

今回は Amazon SNS トピックの「データ保護ポリシー」をテーマにする❗️

docs.aws.amazon.com

「データ保護ポリシー」は現状だと L2 Constructs の sns.Topic には実装されてなく,L1 Constructs の sns.CfnTopic では dataProtectionPolicy プロパティとして設定できる.

docs.aws.amazon.com

docs.aws.amazon.com

ちなみに L2 Constructs に dataProtectionPolicy を追加してくれ〜という issue は既にあって,様子を見てると近々サポートされそうな気配がある👀

github.com

👾 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 トピックを確認すると期待通りに「データ保護ポリシー」を設定できていた👏