AWS AppSync通过EventBridge触发嵌套对象输入的订阅失败排查
排查方案与调试方法
一、修复EventBridge输入转换器的嵌套对象序列化逻辑
问题核心是输入转换器未正确处理嵌套对象,导致EventBridge将其转为字符串[object Object],不符合AppSync的Schema要求。
- 若使用EventBridge的输入模板(VTL语法),必须用
$util.toJson()将嵌套对象序列化为合法JSON结构,而非直接引用。例如:{ "query": "mutation simpleMut($input: simpleMutInput!) { simpleMut(input: $input) { id service { name version } } }", "variables": { "input": { "service": $util.toJson($.detail.service) } } } - 避免直接拼接对象变量(如
"service": "$.detail.service"),这种写法会把对象强制转为字符串。
二、验证EventBridge输出的请求体格式
使用EventBridge的测试事件功能,检查最终生成的请求体是否完全匹配AppSync Mutation的参数要求。正确格式示例:
{ "query": "mutation simpleMut($input: simpleMutInput!) { simpleMut(input: $input) { id service { name version } } }", "variables": { "input": { "service": { "name": "demo-service", "version": "v1.0.0" } } } }
若输出中service字段为[object Object],说明输入转换器的序列化逻辑有误,需调整模板。
三、检查API Destination的请求配置
- 确认API Destination的HTTP方法为
POST,且请求头包含Content-Type: application/json,确保AppSync能正确解析请求体。 - 若API Destination也配置了模板,需保证其与EventBridge输入转换器的逻辑一致,避免重复序列化或转义嵌套对象。
四、开启日志定位问题
- AppSync日志:在控制台开启CloudWatch日志,设置日志级别为
ALL,查看是否收到EventBridge的请求,以及是否存在参数类型不匹配的Validation error。 - EventBridge日志:开启规则的CloudWatch日志,查看触发时的输入转换过程、目标请求的状态码与响应内容。若出现400 Bad Request,说明请求体格式不符合要求。
五、手动模拟请求验证
用Postman或curl直接向AppSync API端点发送请求,使用EventBridge测试输出的请求体内容:
curl -X POST https://your-appsync-api-id.appsync-api.region.amazonaws.com/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your-auth-token" \ -d '{ "query": "mutation simpleMut($input: simpleMutInput!) { simpleMut(input: $input) { id service { name version } } }", "variables": { "input": { "service": { "name": "test-service", "version": "v1" } } } }'
- 若手动请求能触发订阅,说明问题出在EventBridge的输入转换或配置上;若手动请求也失败,需检查GraphQL Schema的输入类型定义。
六、确认GraphQL Schema的正确性
验证simpleMutInput是否正确引用nestedObjectInput,示例正确定义:
input nestedObjectInput { name: String! version: String! } input simpleMutInput { service: nestedObjectInput! } type simpleReturn { id: ID! service: nestedObjectInput! } type Mutation { simpleMut(input: simpleMutInput!): simpleReturn! } type Subscription { onSimpleMut: simpleReturn! @aws_subscribe(mutations: ["simpleMut"]) }
若simpleMutInput中的service类型与nestedObjectInput不匹配,会导致参数校验失败,订阅无法触发。
内容的提问来源于stack exchange,提问作者Tristan Müller
相关产品推荐
相关产品推荐

