首页 > 解决方案 > terraform_remote_state 后端没有部分配置?

问题描述

部分配置允许我们从命令行指定后端配置。

terraform init \
    -backend-config="region=${AWS_DEFAULT_REGION}" \
    -backend-config="bucket=${TF_VAR_BACKEND_BUCKET}" \
    -backend-config="key=${TF_VAR_BACKEND_KEY}" \
    -backend-config="encrypt=true"

考虑到同样可以用于terraform_remote_state

data "terraform_remote_state" "vpc" {
  backend = "s3"
  config { }
}

但是,它会导致错误。

Error: Error refreshing state: 1 error(s) occurred:
* data.terraform_remote_state.vpc: 1 error(s) occurred:
* data.terraform_remote_state.vpc: data.terraform_remote_state.vpc: InvalidParameter: 1 validation error(s) found.
- minimum field size of 1, GetObjectInput.Key.

看起来 terraform_remote_state 需要显式配置,如Terraform terraform_remote_state Partial Configuration中所示。

data "terraform_remote_state" "vpc" {
  backend = "s3"
  config {
    encrypt = "true"
    bucket  = "${var.BACKEND_BUCKET}"
    key     = "${var.BACKEND_KEY}"
  }
}

问题

有没有办法使用部分配置,还是 Terraform 的当前限制不能对 terraform_remote_state 使用部分配置?

标签: terraform

解决方案


部分配置仅适用于在评估任何变量之前初始化早期参数。

这个概念不适用于“正常”资源(从这个意义上说,一个data块是“正常的”)。但是,由于您将秘密保存在相应的TF_VAR_*环境变量中,因此明确说明这些似乎比隐含地依赖它们的存在更好。代码更清晰,所有使用的值都在代码中说明。这是一个很好的做法。

所以问题是:为什么要避免明确说明所需的变量?


附录:

正如您在评论中指出的那样,您想要

保存一个信息的单一位置

当您在初始化过程(通过--backend-config参数)和代码(通过对环境变量的变量访问)中使用环境变量时,您实际上是在使用一个地方来管理两个条目的信息!

(请注意,由于 terraform 处理文件的顺序,省略后端中的值的可能性仅仅是一种解决方法。)


还请重新考虑backend(这是 terraform 将其状态保存到的位置)和remote_state(这只是一个普通的数据提供者,它提供有关您可能想要的任何远程状态的信息(即使是那些位于完全独立的云实例上的那些,可能由潜在的访问不同的凭据))。因此,将凭证明确指定为后端使用的凭证是一个特殊用例。


推荐阅读