terraform\u远程\u状态后端没有部分配置?

terraform\u远程\u状态后端没有部分配置?,terraform,Terraform,允许我们从命令行指定后端配置 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 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"
有过同样的想法也可以用来做

但是,它会导致错误

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_状态需要显式配置,如中所示

问题:
是否有使用部分配置的方法,或者是Terraform当前的限制无法对Terraform_remote_state使用部分配置?

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

该概念不适用于“正常”资源(从这个意义上说,
数据
块是“正常的”)。但是,由于您在相应的
TF\u VAR.*
环境变量中保存了您的秘密,因此显式声明这些变量似乎比隐式地依赖它们的存在要好。代码更清晰,代码中说明了所有使用的值。这是很好的做法

所以问题是:为什么要避免显式地声明所需的变量


增编:

正如您在评论中指出的,您希望

保存一个信息的单个位置

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

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



还请重新考虑
后端
(这是terraform将其状态保存到的位置)和
远程_状态
(这只是一个普通的数据提供程序,提供您可能需要的任何远程状态的信息)之间的区别(即使是在完全独立的云实例上,通过可能不同的凭据访问的实例)。因此,将凭据显式指定为后端使用的凭据是一个特殊的用例。

使用单个位置来保存一个信息,而不是多个。更改一个位置中的值,而不是更多。对于后端bucket name,为什么在部分配置参数和terraform_remote_state.config中都有一个?我指的是配置代码方面。当然不是关于在后端使用TF_VAR,而是一个用于terraform init,另一个用于terraform_remote_state。为了一致性,如果允许terraform{backend“s3”{},为什么不使用数据“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.
data "terraform_remote_state" "vpc" {
  backend = "s3"
  config {
    encrypt = "true"
    bucket  = "${var.BACKEND_BUCKET}"
    key     = "${var.BACKEND_KEY}"
  }
}