CDK(Python)でEventBridge構築時に入力トランスフォーマーの記載に手こずったこと

2023.10.03

こんにちは、ゲームソリューション部のsoraです。
今回は、CDK(Python)でEventBridge構築時に入力トランスフォーマーの記載に手こずったことについて書いていきます。

EventBridgeとは何かについては、ここでは記載しません。

EventBridgeの入力トランスフォーマーとは

EventBridgeの入力トランスフォーマーとは、ターゲットへの出力時のメッセージを変換できる仕組みです。

例えば、以下のようなものを

{
    "version": "0",
    "source": "aws.config",
    "account": "<アカウントID>",
    "region": "ap-northeast-1",
    "detail-type": "Config Rules Compliance Change",
    "time": "2023-03-20T05:48:47Z",
    "resources": [
        "<リソース>"
    ]
}

以下のような読みやすい形に変換することができます。

"タグが付与されていないリソースを検知しました。"
"<ルール違反のリソース情報>"
"リソースタイプ: AWS::EC2::RouteTable"
"リソースID  : <リソースID>"
"非準拠判定日時: 2023-03-20T05:59:22.954Z"


JSONを使わない場合に手こずったこと

CDK(Python)でEventBridgeを構築する際に、L2コンストラクトでは細かい設定ができなかったため、L1コンストラクトで定義しました。
以下は上手くいったコードの抜粋です。

events.CfnRule(self, "tag-required-eventbridge",
    name="tag-required-rule",
    event_pattern=events.EventPattern(
        source=["aws.config"],
        detail_type = ["Config Rules Compliance Change"],
        detail = {
            "messageType": ["ComplianceChangeNotification"],
            "configRuleName": ["required-tags"],
            "newEvaluationResult": {
                "complianceType": ["NON_COMPLIANT"]
            }
        }
    ),
    targets=[events.CfnRule.TargetProperty(
        arn = topic.topic_arn,
        id = "tag-required-target",
        input_transformer=events.CfnRule.InputTransformerProperty(
            input_template="\"タグが付与されていないリソースを検知しました。\"\n\"<ルール違反のリソース情報>\"\n\"リソースタイプ: <resourceType>\"\n\"リソースID  : <resourceId> \"",
            input_paths_map={
                "resourceId": "$.detail.resourceId",
                "resourceType": "$.detail.resourceType"
            }
        )
    )]
)

つまづいたのはinput_templateの部分です。
公式ページのExamplesのTransform input into a stringを参考にしたものの、input_templateが上手く通らず困っていました。(私の当時の書き方が悪かった可能性もなくはないです)

ダブルクォーテーションが多くてわかりづらいですが細かく見ていきます。
input_template="\"タグが付与されていないリソースを検知しました。\"\n\"<ルール違反のリソース情報>\"\n\"リソースタイプ: \"\n\"リソースID : \""
値がStringのため全体をダブルクォーテーションで囲み、文字列の各行がダブルクォーテーションで囲まれてる必要があるため、\"として"を入れる必要があります。

最後に

今回は、CDK(Python)でEventBridge構築時に入力トランスフォーマーの記載に手こずったことについて記載しました。
どなたかの参考になると幸いです。