Terraform:为远程状态文件选择凭据


10

我在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源代码中使用的凭据,为什么OS级别的AWS配置根本不重要?

如何使Terraform仅使用Terraform配置中定义的凭据,而忽略OS用户配置文件中的内容?

编辑,是 Terraform v0.11.7

编辑:请注意,我正在尝试解决有关在提供程序声明中未使用静态声明的凭据的问题。不寻找替代方法或解决方法。谢谢。


嗯...只是预感。确保未设置AWS_PROFILEAWS_DEFAULT_PROFILE环境变量,因为这是对AWS SDK的提示,它应在凭证文件中查找。
埃里克·奥斯特曼

谢谢。回复较晚,但我正在重新讨论。不幸的是,我检查了环境变量。如果它可以像其他不使用远程后端的计划那样在运行时提示信用,那真的很好。不管怎么说,多谢拉。
emmdee

Answers:


10

你的第一个问题

如果我的提供程序设置明确声明要在Terraform源代码中使用的凭据,为什么我的OS级AWS配置根本不重要?

错误消息“无法加载后端:配置后端“ s3”时出错”是指您的后端S3配置。

查看文件./.terraform/terraform.tfstate,您将看到S3后端配置。

Terraform S3后端与Terraform AWS Provider不同。错误消息“找不到适用于AWS Provider的有效凭证来源”。有误导性。这意味着使用了AWS Provider配置,这是错误的。S3后端凭据是单独配置的,并存储在terraform.tfstate文件中。

您的操作系统级AWS配置很重要,因为如果未指定https://www.terraform.io/docs/backends/types/s3.html中指定的S3后端凭据,则Terraform默认使用以下命令:

  1. 环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY
  2. AWS Shared凭证文件,默认值为“〜/ .aws / credentials”。

您未在S3后端配置中指定任何凭证,因此terraform默认为AWS Shared Credentials文件。

您的S3后端配置不包含任何凭据。

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
  }
}

你的第二个问题

如何使Terraform仅使用Terraform配置中定义的凭据,而忽略OS用户配置文件中的内容?

首先,后端不能包含插值,请参阅https://www.terraform.io/docs/backends/config.html。因此,您不能在后端配置中使用任何变量。例如,此配置无效

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
    access_key = ${var.access_key}
    secret_key = ${var.secret_key}
  }
}

如果要在运行时指定AWS凭证,则将terraform init后端配置指定为选项。

terraform init --backend-config="access_key=your_access_key" --backend-config="secret_key=your_secret_key"

这将生成一个如下所示的S3后端配置,存储在 ./.terraform/terraform.tfstate文件中:

{
    "version": 3,
    "serial": 1,
    "lineage": "bd737d2d-1181-ed64-db57-467d14d2155a",
    "backend": {
        "type": "s3",
        "config": {
            "access_key": "your_access_key",
            "secret_key": "your_secret_key"
        },
        "hash": 9345827190033900985
    },

同样,S3后端凭据与您的AWS Provider凭据分开配置。

重新运行terraform init并在命令行上指定凭据作为--backend-config修复错误的选项。


谢谢。非常详细的回复,我现在知道了问题所在。在我的用例中,我最终使用了shared_credentials_file所有后端和提供程序都将收获和使用的选项。似乎运行良好,并且没有任何东西锁定在OS工作站的AWS凭证中。
emmdee '18

3

您得到的错误特别是指配置S3后端,AFAIK不会从AWS提供商配置中继承设置;它还具有access_keysecret_key配置选项,如果您不使用~/.aws/credentials它,则需要进行显式配置。


1

您最好在~/.aws/credentials文件中设置配置文件,例如

[profile1]
aws_access_key_id = xxxx
aws_secret_access_key = xxxxx
region = us-east-1

[profile2]
aws_access_key_id = xxxx
aws_secret_access_key = xxxx
region = us-west-2

然后,在您的提供者中,您可以告诉它要使用哪个配置文件

provider "aws" {
  profile = "profile2"
  region = "${var.region}"
}

它将密钥保留在terraform文件中,如果您想将其放入源代码管理中,这是一件好事。


感谢您的输入。我对凭据配置文件非常了解,但是我正在寻找针对特定问题的解决方案,而不是替代方法或解决方法。对于这个问题的范围,信誉必须在变量中。不胜感激。
emmdee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.