You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS EventBridge中保留JSON字符串形式的静态输入?

解决AWS EventBridge规则传递静态JSON字符串输入的问题

问题核心是:使用CDK的events.CfnRule.TargetProperty的input参数时,直接传入JSON字符串会被自动解析为JSON对象,而我们需要传递的是保留所有转义与引号的字符串形式JSON。

解决方案:双重序列化JSON

通过两次JSON序列化操作,将目标结构转换为转义后的字符串,确保CloudFormation将其作为静态字符串传递给Lambda,而非解析为JSON对象。

完整代码示例

import json
import aws_cdk as cdk
from aws_cdk import aws_events as events

class YourStack(cdk.Stack):
    def __init__(self, scope: cdk.App, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        # 假设以下资源已提前定义
        role = ... # EventBridge执行角色
        lambda_arn = "<lambda_arn>"
        dlq_arn = "<dlq_arn>"
        
        # 1. 构造原始输入结构为Python字典
        original_input = {
            "resource": "/{proxy+}",
            "path": "/jobs/sendRepoJob",
            "httpMethod": "POST",
            "requestContext": "{}",
            "queryStringParameters": None,
            "multiValueQueryStringParameters": None,
            "pathParameters": None,
            "stageVariables": None,
            "body": "{\"Configs\":{\"_url\":\"<some_url>\",\"name\":\"<some_name>\"},\"Configs2\":{\"_url\":\"<some_url>\",\"name\":\"<some_name>\"}}",
            "isBase64Encoded": None
        }
        
        # 2. 双重序列化得到符合要求的静态输入字符串
        tmp_input = json.dumps(json.dumps(original_input))
        
        # 3. 创建EventBridge规则
        rule = events.CfnRule(self,
            "InvokeApiRule",
            description="test",
            schedule_expression="rate(2 minutes)",
            state="ENABLED",
            role_arn=role.role_arn,
            targets=[events.CfnRule.TargetProperty(
                arn=lambda_arn,
                id="<someID>",
                dead_letter_config=events.CfnRule.DeadLetterConfigProperty(
                    arn=dlq_arn
                ),
                input=tmp_input
            )]
        )

原理说明

  • 第一次json.dumps()将Python字典转换为标准JSON字符串,例如{"resource": "/{proxy+}", ...}
  • 第二次json.dumps()将该JSON字符串再次序列化,生成转义后的字符串,结果类似"{\"resource\": \"/{proxy+}\", ...}"
  • 传递给input参数后,EventBridge会完整传递这个转义后的静态字符串,Lambda收到的就是你需要的原始JSON字符串格式。

内容的提问来源于stack exchange,提问作者A Simple Programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:44:55