为什么我会在某些 AWS 区域收到 IAM 错误“AWS 无法验证提供的访问凭证”?

上次更新时间:2020 年 5 月 14 日

我假设一个 AWS Identity and Access Management (IAM) 角色并且我的 API 调用返回与以下类似的错误:

“调用 DescribeInstances 操作时发生错误 (AuthFailure):AWS 无法验证提供的访问凭证。”  

简短描述

AWS Security Token Service (AWS STS) 现在支持更新版本的会话令牌格式。默认未启用的新 AWS 区域(例如香港和巴林)将使用更新的 AWS STS 格式。默认情况下,全局 AWS STS 终端节点 (sts.amazonaws.com) 将会签发采用先前格式的令牌。如果会话令牌在默认未启用的 AWS 区域中尝试使用先前的格式,则会发生错误。有关更多信息,请参阅管理 AWS 区域中的 AWS STS

解决方法

从区域终端节点获得的令牌将使用新版本格式,并且在所有 AWS 区域中均有效。最好使用区域 STS 终端节点。这是因为,使用在地里位置上与您的应用程序靠近的终端节点意味着它可以在更低延迟和更短响应时间的情况下访问 STS 服务。

使用以下方法之一来解决此问题。

获取区域终端节点令牌

以下示例命令使用适用于 Python 的 AWS 开发工具包 (Boto3)

注意:

  • your-region 替换为您的 AWS 区域。
  • 需要设置 endpoint_url 才能配置区域终端节点的 STS 客户端。
# Replace existing code to create STS client with the following
sts_client = boto3.client('sts', region_name='your-region', endpoint_url='https://sts.REGION.amazonaws.com')

更改全局终端节点会话令牌的区域兼容性

您还可以将 STS 全局终端节点配置为签发使用更新格式的令牌,以允许在所有 AWS 区域均可使用令牌。

有关说明,请参阅更改全局终端节点会话令牌的区域兼容性

重要提示:与先前的版本相比,新令牌具有更多的字符。这可能会影响现有的、用于临时存储令牌的系统。