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

AWS API Gateway跨账号访问403错误问题求助

跨账号API Gateway IAM认证403问题排查指南

我完全理解你遇到的这个跨账号调用的头疼问题——我之前帮团队排查过几乎一模一样的场景,咱们一步步来拆解:

1. 先确认资源策略的Principal和Resource匹配度

你当前的资源策略里用了arn:aws:iam::accountB:role/invoke_api_iam_role作为Principal,理论上这应该允许该角色的所有会话(也就是EC2实例扮演角色后的STS ARN)访问,但有几个细节要核对:

  • 检查角色ARN是否完全正确:比如accountB的ID有没有输错?角色名是不是和EC2实例附加的角色完全一致?有时候复制粘贴会多了空格或者少了字符。
  • 确认Resource字段是否覆盖了你实际调用的API路径:你的策略用了arn:aws:execute-api:us-east-1:accountA:myAPIID/*,但如果你的API有特定阶段(比如prod)和资源路径(比如/data),可以尝试把Resource写得更具体试试,比如arn:aws:execute-api:us-east-1:accountA:myAPIID/prod/GET/data,排除通配符可能带来的匹配问题。

2. 检查IAM角色的信任关系和有效权限

虽然你的EC2实例已经附加了角色,但要确认:

  • 该角色的信任策略是否允许ec2.amazonaws.com扮演它?(不过accountB的EC2能拿到角色凭证,这一步大概率没问题,但还是确认下更稳妥)
  • 有没有隐性的拒绝策略?比如账号级别的IAM边界(Permission Boundary)或者SCP(Service Control Policy)限制了execute-api:Invoke动作?可以用IAM Access Analyzer或者模拟该角色的权限,看看是否真的允许调用目标API。

3. 验证签名的正确性

用aws-requests-auth做v4签名时,几个很容易踩坑的点:

  • 确保签名时指定的service参数是execute-api,而不是其他(比如ec2或者sts)。
  • region要和API Gateway部署的region完全一致(你这里是us-east-1,别写错成us-east-2之类的)。
  • 请求URL要包含API的阶段(比如https://myAPIID.execute-api.us-east-1.amazonaws.com/prod/your-path),如果漏了阶段,签名会不匹配,直接返回403。
  • 可以尝试用AWS CLI模拟调用,比如:
aws apigateway test-invoke-method --rest-api-id myAPIID --resource-id yourResourceID --http-method GET --stage-name prod

如果CLI调用也失败,那问题大概率在权限策略;如果CLI成功,那就是脚本里的签名逻辑有问题。

4. 尝试在资源策略中添加STS Assume Role的ARN

有时候即使允许了角色ARN,API Gateway的资源策略可能需要显式允许STS会话的ARN。你可以把报错里的arn:aws:sts::accountB:assumed-role/invoke_api_iam_role/i-xxxxxxxxx添加到Principal里试试,比如:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::accountB:role/invoke_api_iam_role",
          "arn:aws:sts::accountB:assumed-role/invoke_api_iam_role/i-xxxxxxxxx"
        ]
      },
      "Action": "execute-api:Invoke",
      "Resource": "arn:aws:execute-api:us-east-1:accountA:myAPIID/*"
    }
  ]
}

如果这样能解决,那可能是角色的会话没有被正确识别,不过这是个临时排查手段,长期来看还是用角色ARN更合适,你可以再检查角色的ARN是否有拼写错误。

5. 检查API Gateway的认证配置

最后确认下:

  • API Gateway的每个方法都启用了AWS_IAM认证吗?有时候可能根资源启用了,但子方法没启用,或者配置错成了其他认证方式。
  • 有没有启用WAF或者其他防护规则,不小心拦截了accountB的请求?

内容的提问来源于stack exchange,提问作者heyadityak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:12:29