Terraform 地形。在模块中的TFVAR中映射

Terraform 地形。在模块中的TFVAR中映射,terraform,Terraform,我正在编写一个terraform模块,它将根据传递给地图的键从地图中选择一个值。 没什么不寻常的 但是,该映射中的值是机密的,不会根据调用模块的用户而更改。 我认为保守这些秘密的一种简单方法是将变量定义为模块中variables.tf中的映射,将terraform.tfvars中的键/值放入模块中,.gitignore terraform.tfvars,并将其加密到terraform.tfvars.gpg或其他内容 但这不起作用,因为我没有模块中的默认变量terraform希望该变量由调用方设置

我正在编写一个terraform模块,它将根据传递给地图的键从地图中选择一个值。 没什么不寻常的

但是,该映射中的值是机密的,不会根据调用模块的用户而更改。 我认为保守这些秘密的一种简单方法是将变量定义为模块中variables.tf中的映射,将terraform.tfvars中的键/值放入模块中,.gitignore terraform.tfvars,并将其加密到terraform.tfvars.gpg或其他内容

但这不起作用,因为我没有模块中的默认变量terraform希望该变量由调用方设置。 我可以在调用者中定义变量而不使用值,将其添加到调用中,或者手动指定--var文件,或者在调用者中包含terraform.tfvars。但这意味着用户必须记住一个神奇的--var文件调用,或者在我的新模块使用的任何地方复制terraform.tfvars。 记住神奇的字符串和复制都不是好的选择


模块是否可以使用自己的TFVAR来填充未传递给它的变量?

我不完全确定我是否理解,但尝试一下。你在用AWS吗?我过去使用过的一个有趣的解决方案是SSM参数

data "aws_ssm_parameter" "foo" {
  name  = "foo"
}

...
  value = data.aws_ssm_parameter.foo.value
...

SSM参数可以在tf之外创建并在您的模块中查找(以及根据调用方通过IAM或其他方式授予访问权限的策略)。

无法将自动
.tfvars
文件与非根模块一起使用。子模块总是从调用的
模块
块中获取其所有值(适当时插入
默认值
值)
.tfvars
仅用于为根模块变量赋值

另一个与您描述的特征类似的选项是在模块目录中使用JSON或YAML格式的数据文件,并使用和一个解码函数将其加载。例如:

locals {
  # This file must be created before using this module by
  # decrypting secrets.yaml.gpg in this directory.
  secrets = yamldecode(file("${path.module}/secrets.yaml"))
}
如果调用方在使用模块之前忽略了对
.gitignore
d文件进行解密,则
文件
调用将失败,并显示“未找到文件”错误消息