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

emm*_*dee 12 terraform

我在 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"
}
Run Code Online (Sandbox Code Playgroud)

访问 ID 权限 100% 良好。我使用相同的帐户 ID 和密钥进行aws configure设置,~/.aws/credentials就像我在上面的 Terraform 变量声明中一样。

只要~/.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".
Run Code Online (Sandbox Code Playgroud)

如果我~/.aws/credentials通过运行重新填充aws configure它,它将再次正常工作。

我不明白——如果我的provider设置明确声明要在 Terraform 源代码中使用的凭证,为什么我的操作系统级 AWS 配置很重要?

如何让 Terraform 仅使用在我的 Terraform 配置中定义的凭据而忽略我的操作系统用户配置文件中的内容?

编辑,是 Terraform v0.11.7

编辑:请注意,我正在尝试解决为什么在提供者声明中没有使用静态声明的信用的问题。不寻找替代方法或解决方法。谢谢。

小智 12

你的第一个问题

如果我的提供者设置明确声明要在 Terraform 源代码中使用的凭证,为什么我的操作系统级 AWS 配置很重要?

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

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

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

您的操作系统级 AWS 配置很重要,因为如果没有指定 S3 后端凭证,如此处所述https://www.terraform.io/docs/backends/types/s3.html,则 Terraform 默认使用以下内容:

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

您没有在 S3 后端配置中指定任何凭证,因此 terraform 默认为 AWS 共享凭证文件。

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

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
  }
}
Run Code Online (Sandbox Code Playgroud)

你的第二个问题,

如何让 Terraform 仅使用在我的 Terraform 配置中定义的凭据而忽略我的操作系统用户配置文件中的内容?

首先,后端不能包含插值,请参阅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}
  }
}
Run Code Online (Sandbox Code Playgroud)

如果要在运行时指定 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
    },
Run Code Online (Sandbox Code Playgroud)

同样,S3 后端凭证与您的 AWS 提供商凭证是分开配置的。

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