如果未提供参数值,有条件地忽略 Terraform 中的参数?

Conditionally ignore parameter in Terraform if its value is not provided?

我正在使用来自变量文件或命令行参数的 "google_sql_database_instance" resource to create a cloud instance with private IP only and taking the value for _private_network_,或者根本没有提供任何值。

我想要实现的是,仅在提供 private_network 并包含 _private_network_ 参数 时才创建私有 IP 实例 如果提供了它的值。这里的问题是这个变量不接受空字符串 ("") 因为它验证了下面的正则表达式。
"projects/((?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?)))/global/networks/((?:[a-z](?:[-a-z0-9]*[a-z0-9])?))$".

我如何制作一个可配置的模块(仅当提供 private_network 时才创建私有 IP 实例,否则完全忽略该参数)并且不强制要求_private_network_ 变量的值?

旧的方法是将一个空字符串 ("") 传递给参数,提供商会按照惯例忽略它。

不幸的是,这并不是在所有提供程序的所有地方都完成的,所以如果您由于参数验证而无法传递空字符串,那么您现在就被卡住了。

您可以选择 raise a pull request for the provider allowing you to pass an empty string, create a second module that differs only by whether it has a private network, or wait for Terraform 0.12 which will introduce the null value,这将使 Terraform 核心完全忽略该参数。

我认为最后一个选项是最好的,但如果您有紧急需求(目前没有 0.12 的预期发布日期,除非它已经准备好)那么我现在将模块分成两部分来满足您的需求能够实现这一点,然后您可以删除模块的私有克隆并在发布 0.12 并且您已升级到它时使用 null 值。