InvalidClientTokenId:请求中包含的安全令牌无效。状态码:403

Posted

技术标签:

【中文标题】InvalidClientTokenId:请求中包含的安全令牌无效。状态码:403【英文标题】:InvalidClientTokenId: The security token included in the request is invalid. status code: 403 【发布时间】:2020-01-11 22:01:55 【问题描述】:

我正在使用 terraform 和 kubectl 来部署基础架构和应用程序。

自从我更改了 aws configure :

terraform init

terraform apply

我总是得到:

terraform apply

Error: error validating provider credentials: error calling sts:GetCallerIdentity: InvalidClientTokenId: The security token included in the request is invalid.
    status code: 403, request id: 5ba38c31-d39a-11e9-a642-21e0b5cf5c0e

  on providers.tf line 1, in provider "aws":
   1: provider "aws" 

你能建议吗?欣赏 !

【问题讨论】:

你应该分享你的 terraform 配置,或者至少是一个最小的例子,否则很难判断到底哪里出了问题。 【参考方案1】:

来自here。

这是一个一般性错误,可能由多种原因引起。

一些例子:

1) 作为环境变量或~/.aws/credentials 传递的凭据无效。

解决方案:删除旧的配置文件/凭据并清理所有环境变量

for var in AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_SECURITY_TOKEN ; do eval unset $var ; done

2) 当您的aws_secret_access_key 包含加号+ 或多个正斜杠/ 等字符时。在here 中查看更多信息。 解决方案:删除凭据并生成新凭据。

3) 当您尝试在必须显式启用(但未启用)的区域内执行 Terraform 时。 (在我的例子中是me-south-1 (Bahrain) - 在here 中查看更多信息)。解决方案:启用区域或移动到启用的区域。

4) 如果您使用诸如 Vault 之类的第三方工具并且未提供有效的 AWS 凭证进行通信 - 请在 here 中查看更多信息。

都会导致 aws sts:GetCallerIdentity API 失败。

【讨论】:

对于我的问题...解决方案 2 是问题所在。既然这么麻烦,为什么还要生成 + 符号?! 2) 几乎总是有 + 或 / 添加到 1),我的经验是拥有 ~/.aws/credentials 会干扰通过 aws sso 进行身份验证。所以删除文件解决了错误。 在我的情况下发生的事情是我正在使用保险库动态创建凭据并尝试立即使用它。创建凭据后,我必须等待至少 5 秒钟才能使用它们。【参考方案2】:

在我的例子中,结果证明我设置了环境变量 AWS_ACCESS_KEY_IDAWS_DEFAULT_REGIONAWS_SECRET_ACCESS_KEY。这绕过了我的~/.aws/credentials 文件。简单地取消设置这些环境变量对我有用!

【讨论】:

【参考方案3】:

我的问题与 VS Code 调试控制台有关:未加载 AWS_PROFILEAWS_REGION 环境变量。为了解决这个问题,我使用命令 code <project-folder> 关闭了 vscode 并通过 CLI 重新打开。

【讨论】:

【参考方案4】:

添加 S3 Terraform 后端后,我遇到了同样的无效令牌错误。

这是因为我在新后端缺少profile 属性。

这是我收到无效令牌错误时的设置:

# ~/.aws/credentials

[default]
aws_access_key_id = OJA6...
aws_secret_access_key = r2a7...

[my_profile_name]
aws_access_key_id=RX9T...
aws_secret_access_key=oaQy...
// main.tf

terraform 
  backend "s3" 
    bucket         = "terraform-state"
    encrypt        = true
    key            = "terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-state-locks"

  

这是有效的修复(显示差异,我在开头添加了带有“+”的行):

  // main.tf

  terraform 
    backend "s3" 
      bucket         = "terraform-state"
      // ...
+     profile        = "my_profile_name"
    
  

我阅读或观看的指南或视频均未包含profile 属性。但它在 Terraform 文档中进行了解释,这里:

https://www.terraform.io/language/settings/backends/s3

【讨论】:

以上是关于InvalidClientTokenId:请求中包含的安全令牌无效。状态码:403的主要内容,如果未能解决你的问题,请参考以下文章

在http请求中包含了哪些信息

如何在 GraphQL 中包含突变请求元数据?

在 python 请求中包含多个标头

AuthorizationException: 请求中包含的安全令牌已过期

强制 Safari 在 jQuery GET 请求中包含 Origin 标头

Localstack 抛出请求中包含的安全令牌无效