こんにちは、ゲームソリューショングループの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つのこと」について記載しました。
どなたかの参考になると幸いです。