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
相关产品推荐
相关产品推荐

