为什么我在某些 AWS 区域收到 IAM 错误“AWS was not able to validate the provided access credentials”?

1 分钟阅读
0

我代入了 AWS Identity and Access Management (IAM) 角色,我的 API 调用返回了与以下内容类似的错误: "An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials."

简短描述

AWS Security Token Service (AWS STS) 支持会话令牌的更新版本 2。默认情况下,新的 AWS 区域未激活,仅接受会话令牌的更新版本。如果版本 1 会话令牌向默认未激活的 AWS 区域中的服务端点发出请求,则会出现此错误。有关详细信息,请参阅管理 AWS 区域中的 AWS STS

解决方法

从区域 AWS STS 端点获取的会话令牌为版本 2,在所有 AWS 区域都有效。最佳做法是使用区域 AWS STS 端点。

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

从区域端点获取令牌

以下示例命令使用适用于 Python 的 AWS SDK (Boto3)

# 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')

注意:

  • 根据您的环境替换 your-regionAccountIDRoleName
  • 需要设置 endpoint_url 才能为区域端点配置 STS 客户端。

要使用区域端点,请确保在现有 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

**重要事项:**对于默认激活的区域,您必须在生成临时凭证的账户中激活区域 STS 端点。用户在提出请求时登录的是同一个账户还是不同的账户都没关系。对于手动激活的区域,请在发出请求的账户和生成凭证的账户中同时激活该区域。如果您不这样做,则可能会收到 InvalidClientTokenId 错误。有关详细信息,请参阅在 AWS 区域中激活和停用 AWS STS

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

默认情况下,对全球端点的 AWS STS 调用会颁发使用版本 1 的会话令牌。版本 1 令牌仅在默认激活的 AWS 区域有效。但是,您也可以配置 STS 全球端点以颁发版本 2 中的令牌,这些令牌可用于所有 AWS 区域。

有关详细信息,请参阅管理全球端点会话令牌

**重要事项:**版本 2 令牌比版本 1 包含更多的字符。这可能会影响您临时存储令牌的现有系统。

相关信息

管理 AWS 区域中的 AWS STS

区域和端点

AWS 官方
AWS 官方已更新 9 个月前