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

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"
}

aws configure访问 ID 权限 100% 良好。我对输入的设置使用相同的帐户 ID 和密钥,~/.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".

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

我不理解 - 如果我的provider设置明确声明了在 Terraform 源代码中使用的凭据,那么我的操作系统级 AWS 配置为什么重要?

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

编辑,这是Terraform v0.11.7

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

答案1

你的第一个问题

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

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

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

Terraform S3 后端与 Terraform AWS 提供程序不同。错误消息“未找到 AWS 提供程序的有效凭据源。”具有误导性。它暗示使用了 AWS 提供程序配置,但这是错误的。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"
  }
}

你的第二个问题,

如何让 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 提供商凭证是分开配置的。

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

答案2

您收到的错误具体是指配置 S3 后端,据我所知,它不会从 AWS 提供商配置中继承设置;它也有access_key&secret_key配置选项,如果您不使用这些选项,~/.aws/credentials则需要明确配置。

答案3

你最好在你的~/.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 文件之外,如果您想将它们放入源代码管理中,这是一件好事。

答案4

我也遇到了同样的问题,最简单、最安全解决这个问题的方法是配置 AWS 配置文件。即使你在项目中正确提到了 AWS_PROFILE,你必须在 backend.tf 中再次提及它

我的问题是,我已经在项目中设置了 AWS 提供程序,如下所示,并且它运行正常。

provider "aws" {
region = "${var.AWS_REGION}"
profile = "${var.AWS_PROFILE}"
}

但在项目结束时,我试图配置 S3 后端配置文件。因此我运行了该命令terraform init,但还是收到了相同的错误消息。

Error: error configuring S3 Backend: no valid credential sources for S3 Backend found.

笔记这对于 Terraform 后端配置来说还不够。你必须提到AWS_PROFILE在后端文件中也是如此。

  • 完整解决方案

我目前正在使用 terraform 最新版本。它是 v0.13.5。请注意,您也不能在后端文件中使用变量。

请参阅provider.tf

provider "aws" {
region = "${var.AWS_REGION}"
profile = "${var.AWS_PROFILE}" # lets say profile is my-profile
}

例如你的 AWS_PROFILE 是我的简历 那么你的backend.tf应该如下所示。

terraform {
    backend "s3" {
    bucket = "my-terraform--bucket"
    encrypt = true
    key = "state.tfstate"
    region = "ap-southeast-2"
    profile = "my-profile" # you have to give the profile name here. not the variable("${var.AWS_PROFILE}")
  }
}

然后运行terraform init

相关内容