CDK(Python)でEventBridge構築時につまづいた2つのこと(入力トランスフォーマー/detail-type)

2023.03.23

こんにちは、ゲームソリューショングループのsoraです。

今回は、CDK(Python)でEventBridge構築しようとした際に、以下2点で少しつまづいたため、そのことを記載いたします。

  • 入力トランスフォーマーでJSONを使わない場合に手こずったこと
  • L1コンストラクトのdetail-typeが正しく変換されなかったこと

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

入力トランスフォーマーでJSONを使わない場合に手こずったこと

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が上手く通らず困っていました。(私の当時の書き方が悪かったのかも)

ダブルクォーテーションが多くてわかりづらいですが細かく見ていきます。
値がStringのため全体をダブルクォーテーションで囲み、文字列の各行がダブルクォーテーションで囲まれてる必要があるため、\"として"を入れる必要があります。

L1コンストラクトでdetail-typeが正しく変換されなかったこと

先ほど定義したEventBridgeのdetail_typeについて、本来であればdetail-typeと変換されてほしいところ、detailTypeとなってしまい正常に動作しませんでした。

以下は先ほどのCDKから生成されたEventBridgeのイベントパターン

{
    "detailType": ["Config Rules Compliance Change"],
    "detail": {
        "configRuleName": ["required-tags"],
        "messageType": ["ComplianceChangeNotification"],
        "newEvaluationResult": {
            "complianceType": ["NON_COMPLIANT"]
        }
    },
    "source": ["aws.config"]
}

detailTypeではなくdetail-typeになってほしいため、本来であれば以下のようになってほしい。

{
    "detail-type": ["Config Rules Compliance Change"],
    "detail": {
        "configRuleName": ["required-tags"],
        "messageType": ["ComplianceChangeNotification"],
        "newEvaluationResult": {
            "complianceType": ["NON_COMPLIANT"]
        }
    },
    "source": ["aws.config"]
}

これについては原因はわからず、CDK(Python)のコードを書き換えることでは改善できなかったため、以下で手動で対処しました。

  • CDKでdeployした後に、EventBridgeのイベントパターンを編集する
  • CDKでCloudFormationテンプレートを生成して、detailTypeをdetail-typeに修正した後にテンプレートからデプロイする

最後に

今回は、「CDK(Python)でEventBridge構築時につまづいた2つのこと」について記載しました。
どなたかの参考になると幸いです。