如何在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
相关产品推荐
相关产品推荐

