我在 Terraform 中有现有的基础设施,并且已经使用了一段时间。最近,我交换了本地笔记本电脑的 AWS 凭证(存储在 中的凭证~/.aws/credentials
),它停止工作,直到我重新设置这些凭证。
问题是我在 Terraform 源本身中声明了信誉,但它似乎根本没有使用它们。
terraform {
backend "s3" {
bucket = "example_tf_states"
key = "global/vpc/us_east_1/example_state.tfstate"
encrypt = true
region = "us-east-1"
}
}
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}
variable "access_key" {
default = "<hidden_for_stack_exchange_post>"
}
variable "secret_key" {
default = "<hidden_for_stack_exchange_post>"
}
variable "region" {
default = "us-east-1"
}
访问 ID 权限是 100% 好的。我在上述 Terraform 变量声明中的aws configure
设置中使用相同的帐户 ID 和密钥。~/.aws/credentials
只要有凭据,一切就可以正常工作~/.aws/credentials
,但是一旦操作系统级别的凭据消失(即rm ~/.aws/credentials
),我在尝试运行 Terraform 操作时会得到以下信息,例如terraform plan
:
Failed to load backend:
Error configuring the backend "s3": No valid credential sources found for AWS Provider.
Please see https://terraform.io/docs/providers/aws/index.html for more information on
providing credentials for the AWS Provider
Please update the configuration in your Terraform files to fix this error.
If you'd like to update the configuration interactively without storing
the values in your configuration, run "terraform init".
~/.aws/credentials
如果我通过运行重新填充aws configure
它,它将再次正常工作。
我不明白——如果我的provider
设置明确声明要在 Terraform 源代码中使用的凭证,为什么我的操作系统级 AWS 配置很重要?
如何使 Terraform 仅使用我的 Terraform 配置中定义的凭据,而忽略我的操作系统用户配置文件中的内容?
编辑,是Terraform v0.11.7
编辑:请注意,我正在尝试解决为什么在提供者声明中没有使用静态声明的凭据的问题。不寻找替代方法或解决方法。谢谢。
你的第一个问题
错误消息“无法加载后端:配置后端“s3”时出错”是指您的后端 S3 配置。
查看文件
./.terraform/terraform.tfstate
,您将看到 S3 后端配置。Terraform S3 后端不同于 Terraform AWS Provider。错误消息“未找到 AWS Provider 的有效凭证源”。具有误导性。这意味着使用了 AWS Provider 配置,这是错误的。S3 后端凭证单独配置并存储在
terraform.tfstate
文件中。您的操作系统级 AWS 配置很重要,因为如果没有指定 S3 后端凭证,如此处所述https://www.terraform.io/docs/backends/types/s3.html,则 Terraform 默认使用以下顺序:
您没有在 S3 后端配置中指定任何凭证,因此 terraform 默认为 AWS 共享凭证文件。
您的 S3 后端配置不包含凭据。
你的第二个问题,
首先,后端不能包含插值,请参阅https://www.terraform.io/docs/backends/config.html。因此,您不能在后端配置中使用任何变量。例如此配置无效
如果您想在运行时指定 AWS 凭证,
terraform init
请将后端配置指定为选项。terraform init --backend-config="access_key=your_access_key" --backend-config="secret_key=your_secret_key"
这会生成一个如下所示的 S3 后端配置,存储在
./.terraform/terraform.tfstate
文件中:同样,S3 后端凭证与您的 AWS Provider 凭证分开配置。
重新运行
terraform init
并在命令行上指定凭据作为--backend-config
修复错误的选项。您遇到的错误专门指的是配置 S3 后端,AFAIK 不会从 AWS 提供商配置中继承设置;它也有
access_key
&secret_key
配置选项,如果您不使用~/.aws/credentials
,则需要明确配置。您最好在文件中设置配置
~/.aws/credentials
文件,例如然后在您的提供商中,您可以告诉它使用哪个配置文件
它会将密钥保留在您的 terraform 文件之外,如果您想将它们放入源代码管理中,这是一件好事。
我也有同样的问题,解决这个问题的最简单和安全的方法之一是配置 AWS 配置文件。即使您在项目中正确提及了 AWS_PROFILE,您也必须在 backend.tf 中再次提及它。
我的问题是,我已经在项目中设置了 AWS 提供商,如下所示,它工作正常。
但项目结束时我试图配置 S3 后端配置文件。因此我运行了命令
terraform init
,我也得到了同样的错误信息。请注意,这对于 terraform 后端配置是不够的。您还必须在后端文件中提及AWS_PROFILE。
我现在正在使用 terraform 最新版本。它是 v0.13.5。请注意,您也不能在后端文件中使用变量。
请看
provider.tf
例如,您的 AWS_PROFILE 是我的个人资料 ,那么您
backend.tf
应该如下所示。然后运行
terraform init