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?
答案 0 :(得分:0)
部分配置仅适用于在评估任何变量之前初始化早期参数。
该概念不适用于“正常”资源(从这个意义上讲,data
块是“正常”)。但是,由于您将秘密保存在相应的TF_VAR_*
环境变量中,因此明确声明这些秘密似乎比隐含地依赖它们的存在更好。代码更清晰,所有使用的值均在代码中说明。这是个好习惯。
问题是:为什么要避免明确说明所需变量?
附录:
如您在评论中指出的,您想要
保存一个信息的单个位置
当您在初始化过程(通过--backend-config
参数)和代码(通过对环境变量的变量访问)中使用环境变量时,实际上是在一个地方有效地管理两个条目的信息!
(请注意,由于terraform处理文件的顺序,后端中忽略值的可能性仅仅是一种解决方法。)
还请重新考虑backend
(这是terraform将状态保存到的状态)和remote_state
(这是一个普通的数据提供程序,它提供有关您可能需要的任何远程状态的信息(即使是完全位于单独的云实例上的实例,也可以通过可能不同的凭据进行访问))。因此,将凭据明确指定为后端使用的凭据是一个特殊的用例。