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

上次更新日期:2022 年 6 月 27 日

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

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

简短描述

AWS Security Token Service (AWS STS) 支持更新版本的会话令牌(版本 2)。默认情况下,不会启用新的 AWS 区域(例如巴林),只接受更新版本的会话令牌。如果使用版本 1 会话令牌向默认情况下未启用的 AWS 区域中的服务端点发出请求,则会发生此错误。有关更多信息,请参阅管理 AWS 区域中的 AWS STS

解决方法

从区域 AWS STS 端点获得的会话令牌为版本 2,在所有 AWS 区域中有效。作为最佳实践,建议使用区域 STS 端点。使用地理位置更靠近应用程序的端点可以减少延迟并提供更短的响应时间。

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

获取区域终端节点令牌

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

注意:

  • 根据您的环境替换 your-regionAccountIDRoleName
  • 需要设置 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.your-region.amazonaws.com')

在现有 bash 脚本/命令中包含区域和端点 url 选项,以使用区域端点。

aws sts assume-role --role-arn arn:aws:iam::AccountID:role/RoleName --role-session-name RoleName --region your-region --endpoint-url https://sts.your-region.amazonaws.com

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

默认情况下,AWS STS 对全局端点的调用会发出版本 1 的会话令牌。版本 1 令牌仅在默认启用的 AWS 区域中有效。但是,您还可以将 STS 全局端点配置为签发版本 2 的令牌,以便在所有 AWS 区域均可使用。

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

重要提示:版本 2 令牌包含的字符比版本 1 多。这可能会影响现有的、用于临时存储令牌的系统。