Terraform在配置S3后端时出现错误。

6

我试图将状态文件存储在S3存储桶中,但在尝试执行'Terraform init'时出现以下错误:

  • 确保我的AWS凭据不包含“/ # $ ..”等特殊字符
error configuring S3 Backend: error validating provider credentials: 
error calling sts:GetCallerIdentity: 
InvalidClientTokenId: The security token included in the request is invalid.

main.tf:

provider "aws" {
  region     = var.region
  access_key = var.acc_key
  secret_key = var.sec_key
}

terraform {
  backend "s3" {
    bucket         = "mybucket-terra-prac"
    key            = "terraform.tfstate"
    region         = "eu-central-1"
  }
}
resource "aws_instance" "web" {
  ami           = var.ami
  instance_type = "t2.large"
  associate_public_ip_address=true
  key_name = var.public_key
  tags = {
    Name = var.ec2_name
  }
}

我在variables.tf文件中定义的变量(包括类型和默认值):

variable "acc_key" {}
variable "sec_key" {}
variable "public_key" {}
variable "ami" {}
10个回答

4
尝试执行aws sts get-caller-identity命令,查看您是否使用了正确的凭据。

如果你能确认aws sts get-caller-identity的相同错误,你可以进行更新。export AWS_ACCESS_KEY_ID=xxxx export AWS_SECRET_ACCESS_KEY=xxxxx export AWS_DEFAULT_REGION=xxxxx 链接 看起来terraform tf正在使用这些环境变量。 - WINGLEUNG CHOI

1
我不是完全确定,但我认为在指定aws provider部分的region时不能使用变量。 我认为您需要将其硬编码到您的区域中。 同样,我不是完全确定,但应该硬编码secretaccess密钥中的变量,而不是指向变量(这些参数旨在在terraform文件内直接指定值时使用)。

terraform部分应该放在aws provider部分之前文件的开头。


嘿,谢谢你的回答,但我尝试了所有方法都没有成功...(在提供程序之前使用terraform块,硬编码区域+帐户+密钥) - Eyal Solomon
好的,那真的很奇怪。如果您能够,请删除现有的状态文件并重新启动terraform(再次强调,仅在非生产环境或您可以承担删除tfstate文件的情况下执行此操作)。但我认为更可能的是您的访问令牌存在问题,或者您没有正确的IAM权限来访问存储桶。您可以在这里检查需要哪些IAM策略,但我相信您已经看过了这个页面。 - Johnny9
您也可以尝试生成新的访问密钥,看看是否可以通过这种方式解决问题。 - Johnny9
你有查看这个问题吗? - Johnny9

1
在我的情况下,我能够通过删除 .terraform/ 文件夹然后再次运行 terraform init 来解决问题。

0

我遇到了类似的错误:

Error: error configuring Terraform AWS Provider: error validating provider credentials: error calling sts:GetCallerIdentity: InvalidClientTokenId: The security token included in the request is invalid.
      status code: 403, request id: f07a9a38-ef21-44ee-a122-71800b865fea

  with provider["registry.terraform.io/hashicorp/aws"],
  on main.tf line 1, in provider "aws":
   1: provider "aws" {

事实证明,我正在工作的区域未启用。顺便说一下,启用一个区域需要几分钟时间。


0

在您的控制台中使用 "aws configure",然后添加新/旧凭据,这样就可以了,因为我在那之后成功地运行了。


0
对我来说,问题出在我在~/.aws/config中定义了一个现有的AWS令牌。
如果你正在使用多个配置文件,请尝试检查一下。

0
在我的情况下,首先我需要在我的AWS CLI上配置MFA(公司政策),然后我编辑了~/.aws/credentials (vim ~/.aws/credentials)以添加正确的配置文件。
在我的情况下,它显示为[default]。编辑后,我仍然在vs code上遇到错误。我在本地终端上尝试了一下,它可以工作。

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0

默认构造函数客户端通过使用系统环境变量中的默认凭据:AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 来搜索凭据。

因此,解除设置它们。

然后执行 aws sts get-caller-identity 命令,看看是否使用了正确的凭据。


-1

看起来你的AWS提供程序缺少“token”字段。 尝试将此字段添加到AWS提供程序部分。 你的AWS提供程序块应该像这样:

provider "aws" {
  region     = var.region
  access_key = var.acc_key
  secret_key = var.sec_key
  token      = var.token
}

还要别忘了在你的文件variables.tf中添加这一行:

variable "token" {}


-2
terraform init
-backend-config="access_key=${{ secrets.AWS_ACCESS_KEY }}"
-backend-config="secret_key=${{ secrets.AWS_SECRET_ACCESS_KEY}}"

从Reddit复制


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接