如何将完整AWS SES事件从EventBridge传递至ECS Fargate任务?
解决方案:无需映射字段传递完整SES事件到ECS Fargate任务
你遇到的INVALID_JSON错误,核心原因是ECS的containerOverrides要求环境变量的value必须是字符串类型,而你直接把完整的JSON事件对象赋值给了环境变量,导致嵌套JSON结构不符合API格式要求。
要不用逐个映射字段传递完整事件,只需要在EventBridge的InputTransformer里把整个事件序列化为JSON字符串即可,具体配置如下:
CloudFormation中EventBridge规则的InputTransformer配置示例
EventsRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.ses # 配置你需要监听的SES事件类型,比如发送成功/失败等 Targets: - Arn: !Sub arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:cluster/你的ECS集群名称 Id: ECSFargateTaskTarget RoleArn: !GetAtt ECSExecutionRole.Arn InputTransformer: InputTemplate: | { "containerOverrides": [ { "name": "你的容器名称", "environment": [ { "name": "SES_EVENT", "value": "<ToString($.)>" } ] } ], "taskDefinitionArn": "你的ECS任务定义ARN" }
关键说明
ToString($.)是EventBridge内置函数,作用是把整个事件($代表根节点)序列化为JSON格式的字符串,这样环境变量SES_EVENT的值就是合法的字符串类型,不会触发JSON格式错误。- 无需配置
InputPathsMap,直接通过内置函数完成转换即可。 - 在ECS任务容器内,读取环境变量
SES_EVENT后反序列化为JSON对象,就能获取完整的SES事件数据。
额外注意事项
- 确保EventBridge规则关联的IAM角色(
ECSExecutionRole)拥有ecs:RunTask权限,且能访问目标ECS集群和任务定义。 - 如果事件内容过大(超过环境变量大小限制),可先将事件写入S3,再在ECS任务中读取S3对象,但SES事件通常不会触发该限制。
内容的提问来源于stack exchange,提问作者Alessandro
相关产品推荐
相关产品推荐

