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

AWS STS区域终端节点跨区域调用API Gateway时令牌无效问题咨询

AWS STS区域终端节点跨区域调用API Gateway时令牌无效问题咨询

我来帮你拆解下这个问题的原因和可行的解决思路~

首先,虽然AWS官方文档提到区域STS端点生成的临时凭证在所有区域都有效,但在API Gateway(execute-api服务)的IAM授权场景下,确实可能遇到你这种跨区域STS凭证签名失败的情况。这大概率是因为API Gateway的IAM签名验证逻辑中,隐性要求了临时凭证的STS来源区域要和API所在区域保持一致——哪怕凭证本身是全局有效的,但签名验证环节会做这个关联检查。

接下来给你几个可以尝试的解决方向:

1. 保持STS区域与API Gateway区域一致

这是你已经验证有效的方案,也就是获取临时凭证时,STS客户端的区域直接设置为API所在的eu-south-2,这样生成的凭证签名调用API就能成功。这种方式最稳妥,也是目前最直接的解决办法。

2. 使用全局STS端点获取凭证

如果你有跨区域获取凭证的需求,可以尝试使用AWS的全局STS端点(sts.amazonaws.com)来生成临时凭证,再去调用目标区域的API Gateway。全局端点生成的凭证是完全全局有效的,不会和特定区域绑定,大概率能绕过这个区域验证的问题。修改你的assume_role函数如下:

def assume_role(role_arn, session_name):
    # 使用全局STS端点,无需指定区域(或指定us-east-1,因为全局端点实际部署在us-east-1)
    sts_client = boto3.client('sts', endpoint_url='https://sts.amazonaws.com')
    response = sts_client.assume_role(RoleArn=role_arn, RoleSessionName=session_name)
    credentials = response['Credentials']
    return credentials

然后在main函数里直接调用这个无区域参数的版本即可。

3. 检查权限策略是否存在区域限制

排查下两个关键策略是否有区域相关的限制:

  • 角色的权限策略:确保允许在eu-south-2区域调用execute-api:Invoke动作,比如:
    {
        "Effect": "Allow",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:eu-south-2:你的账号ID:你的API ID/*/*/*"
    }
    
  • API Gateway的资源策略:确认策略没有限制请求来源的STS区域,只要允许目标角色的访问即可,比如:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::你的账号ID:role/你的角色名称"
                },
                "Action": "execute-api:Invoke",
                "Resource": "arn:aws:execute-api:eu-south-2:你的账号ID:你的API ID/*/*/*"
            }
        ]
    }
    

如果以上都排查过,还是出现问题,那基本可以确定是API Gateway的IAM签名验证对STS凭证区域的隐性要求,这时候采用第一种同区域STS的方案就最可靠了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 08:38:08