无法通过API Gateway代理调用带AWS_IAM认证的Lambda端点
问题原因
- IAM认证的签名是基于请求的目标URL生成的:客户端直接调用后端REST API时,签名针对后端API的域名和路径生成;通过代理调用时,客户端签名是针对代理API的URL生成的,后端API收到请求后会验证请求URL对应的签名,自然无法匹配,返回
Missing Authentication Token。 - 代理默认不会转换客户端的IAM签名,后端API无法识别针对代理URL的签名,导致认证失败。
解决方案
方案1:让代理使用IAM角色转发请求(推荐)
这是最标准的实现方式,由代理API Gateway承担访问后端API的身份:
- 创建一个IAM角色,信任关系配置为允许
apigateway.amazonaws.com调用sts:AssumeRole。 - 给该角色添加权限策略,允许执行
execute-api:Invoke操作,资源指定为后端REST API的完整ARN(格式:arn:aws:execute-api:<区域>:<账号ID>:<后端API ID>/*/*/*)。 - 在代理API的集成请求设置中:
- 选择AWS Service类型,服务选
API Gateway,填写后端API所在区域。 - 路径填写后端API的部署阶段+资源路径(比如
/prod/my-protected-endpoint)。 - 在Credentials选项中选择刚才创建的IAM角色。
- 选择AWS Service类型,服务选
- 代理API的方法请求无需启用AWS_IAM认证(按需调整),由代理负责用自身角色完成后端API的认证。
方案2:调整客户端签名逻辑(不推荐)
如果必须传递客户端身份到后端,需要让客户端针对后端API的URL生成签名,但请求发送到代理API。同时要确保代理转发所有IAM签名相关的请求头(如Authorization、X-Amz-Date、X-Amz-Security-Token等)。但这种方式存在签名验证不通过的风险,因为实际请求URL和签名目标URL不一致,仅适用于特定场景。
方案3:给后端API添加资源策略
通过资源策略允许代理API访问后端受保护的端点:
- 编辑后端REST API的资源策略,添加以下允许语句:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "代理API Gateway的执行角色ARN" }, "Action": "execute-api:Invoke", "Resource": "后端API的资源ARN" } ] } - 同时在代理API的集成请求中配置使用自身执行角色转发请求,确保身份信息正确传递。
内容的提问来源于stack exchange,提问作者Real World
相关产品推荐
相关产品推荐

