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

启用HttpApi的IamAuthorizer后AppSync HTTP解析器调用失败

问题

配置了一个带IAM授权器的API Gateway HttpApi端点,并将其作为AppSync的数据源,出现以下现象:

  • 通过Postman签名调用该端点时成功
  • 调用AppSync时返回403错误
  • 移除IAM授权器后,AppSync的调用成功

数据源配置(CDK L1构造)

const dataSource = new aws_appsync.CfnDataSource(this, 'DataSource', {
      apiId: props.api.apiId,
      type: 'HTTP',
      name: typeName,
      serviceRoleArn,

      httpConfig: {
        endpoint: `${endpoint}/${props.path}`,
        authorizationConfig: {
          authorizationType: 'AWS_IAM',
          awsIamConfig: {
            signingRegion: 'eu-central-1',
            signingServiceName: 'execute-api'
          }
        }
      }
    });

请求映射模板

{
        "version": "2018-05-29",
        "method": "GET",
        "resourcePath": "/status",
        "params": {
          "query": $util.toJson($context.arguments),
        }
}

AppSync使用的角色权限策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "execute-api:*",
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

角色信任策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "appsync.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

注:使用L1构造创建DataSource是因为无法通过其他方式传递serviceRoleArn,UI中已确认选择了正确的角色。目前为排查问题设置了全资源权限,希望找出签名失败(或未执行签名)的原因。


排查与解决

核心原因:请求映射模板的resourcePath与签名逻辑冲突

AppSync通过IAM签名调用HttpApi时,签名会包含resourcePath字段指定的路径,而HttpApi的IAM授权器会验证该路径是否与实际请求路径完全匹配。

你的数据源配置中,endpoint已经拼接了${props.path}(比如最终是https://xxx.execute-api.eu-central-1.amazonaws.com/v1/status),但请求映射模板又额外设置了resourcePath: "/status",这会导致签名时的路径变为/status/status,与实际请求的路径不符,直接触发403权限验证失败。

解决方案

根据endpoint的实际内容调整resourcePath:

  • 如果endpoint已经包含完整的目标路径(比如已经到/status),将resourcePath改为空字符串""或根路径"/"
  • 如果endpoint仅为基础域名(比如https://xxx.execute-api.eu-central-1.amazonaws.com/v1),props.path是status,则保留resourcePath: "/status",同时将数据源的endpoint改为基础域名即可

修正后的请求映射模板示例(适配已包含完整路径的endpoint):

{
        "version": "2018-05-29",
        "method": "GET",
        "resourcePath": "",
        "params": {
          "query": $util.toJson($context.arguments)
        }
}

补充验证点

  1. 确认signingRegion与HttpApi所在区域完全一致(当前配置的eu-central-1没问题)
  2. 确认signingServiceName为execute-api(对应HttpApi,配置正确)
  3. 查看HttpApi的CloudWatch访问日志,对比签名中的路径与实际请求路径,可快速定位路径不匹配问题

内容的提问来源于stack exchange,提问作者Yacine Ait Yaiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:40:08