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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:37:27