terraform_remote_state后端没有部分配置?

时间:2018-08-05 13:38:16

标签: terraform

Partial Configuration允许我们从命令行指定后端配置。

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?

1 个答案:

答案 0 :(得分:0)

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

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

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


附录:

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

  

保存一个信息的单个位置

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

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


还请重新考虑backend(这是terraform将状态保存到的状态)和remote_state(这是一个普通的数据提供程序,它提供有关您可能需要的任何远程状态的信息(即使是完全位于单独的云实例上的实例,也可以通过可能不同的凭据进行访问))。因此,将凭据明确指定为后端使用的凭据是一个特殊的用例。