terraform - 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 使用部分配置?
解决方案
部分配置仅适用于在评估任何变量之前初始化早期参数。
这个概念不适用于“正常”资源(从这个意义上说,一个data
块是“正常的”)。但是,由于您将秘密保存在相应的TF_VAR_*
环境变量中,因此明确说明这些似乎比隐含地依赖它们的存在更好。代码更清晰,所有使用的值都在代码中说明。这是一个很好的做法。
所以问题是:为什么要避免明确说明所需的变量?
附录:
正如您在评论中指出的那样,您想要
保存一个信息的单一位置
当您在初始化过程(通过--backend-config
参数)和代码(通过对环境变量的变量访问)中使用环境变量时,您实际上是在使用一个地方来管理两个条目的信息!
(请注意,由于 terraform 处理文件的顺序,省略后端中的值的可能性仅仅是一种解决方法。)
还请重新考虑backend
(这是 terraform 将其状态保存到的位置)和remote_state
(这只是一个普通的数据提供者,它提供有关您可能想要的任何远程状态的信息(即使是那些位于完全独立的云实例上的那些,可能由潜在的访问不同的凭据))。因此,将凭证明确指定为后端使用的凭证是一个特殊用例。
推荐阅读
- .net - InvalidCastException .Net
- java - 新的 Android 版本是否与旧的 WebView 文件选取器方法兼容
- php - Symfony 内置服务器不允许连接
- azure - Docker NodeJS Azure ServiceBus 服务锁定超时
- react-native - React Native 条件渲染不起作用,需要帮助
- ruby-on-rails - 从 attr_encrypted 迁移到 vault-rails gem
- laravel - 在会话开始前 10 分钟显示按钮
- symfony - 由于使用 parent() 和块结构,Twig 在我调用 form_row() 之前输出 Symfony 表单元素
- javascript - 使用 Google Apps 脚本访问亚马逊 MWS
- authentication - Kafka 客户端应用程序的瞬时 kerberos 身份验证失败