启用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) } }
补充验证点
- 确认
signingRegion与HttpApi所在区域完全一致(当前配置的eu-central-1没问题) - 确认
signingServiceName为execute-api(对应HttpApi,配置正确) - 查看HttpApi的CloudWatch访问日志,对比签名中的路径与实际请求路径,可快速定位路径不匹配问题
内容的提问来源于stack exchange,提问作者Yacine Ait Yaiz
相关产品推荐
相关产品推荐

