将内插值放入 Terraform 查找的最佳方法

Posted

技术标签:

【中文标题】将内插值放入 Terraform 查找的最佳方法【英文标题】:Best way to get an interpolated value into a Terraform lookup 【发布时间】:2018-05-23 19:33:49 【问题描述】:

我正在尝试设置 Terraform 以部署到各个 AWS 区域,我在命令行上发送区域,因为它是脚本中为数不多的更改值之一。我正在使用 -var "region=east" - 例如,它通过正确分配区域在其他模块中工作,我使用此值的 main.tf 设置正确。

在创建资源时,有一个使用区域作为映射值的查找,amis 是区域和不同 ami 值的映射,我只想要与此资源匹配的 ami。我尝试了两种方法,使用命令行插值:

ami = "$lookup(var.amis, $$var.region)"

或作为中间值

variables "map_region" 
  default = "$var.region"

ami = "$lookup(var.amis, var.map_region)"

两者都给我语法错误,但在通过查找查看一些文档时,我看不到 terraform 在哪里支持这一点。其他人以某种方式成功地尝试过,或者知道使用命令行变量从地图中提取值的更好方法?

编辑: 部分问题被隐藏了,因为我使用 Bash 脚本运行 Terraform 模块。这是运行破坏力,然后应用。因为我正在考虑将命令行变量作为构建的一部分,所以我没有将它们添加到 destroy 命令中,这是请求它们并提示我输入它们的地方。一旦我将 -var 命令添加到destroy 命令并应用这一切就可以了。

【问题讨论】:

在使用插值时,您只需要一组$ - 其中的任何内容都会被渲染。我不相信您可以在变量中进行插值。 $lookup(var.amis, 'us-east-1') 会返回你想要的吗? 是的,它返回我想要的,但我需要以某种方式使用插值,以便我可以重用脚本以在不同区域部署。 【参考方案1】:
ami = "$lookup(var.amis, $$var.region)"

是错误的,因为$$ 仅对inline templates 内的插值​​变量有效。

variables "map_region" 
  default = "$var.region"

ami = "$lookup(var.amis, var.map_region)"

不起作用,因为您将映射作为键传递给 lookup

Terraform console 是尝试插值表达式的有用工具。假设变量定义如下:

$ cat vars.tf
variable "amis" 
  type = "map"

  default 
    "us-east-2" = "ami-58f5db3d"
    "us-east-1" = "ami-fad25980"
  


variable "region" 

启动控制台,将值传递给region,以模拟您将使用planapply 等进行的操作:

$ terraform console -var "region=us-east-1"
> var.region
us-east-1
> lookup(var.amis, var.region)
ami-fad25980

希望这会有所帮助。

【讨论】:

我以前试过这个,当我在我的变量文件中使用变量“region”时,我仍然会在使用 apply - terraform apply -var "region=us 时收到添加 var.region 的提示-east-1" 玩这个更多看起来像设置变量的bash脚本在某种程度上没有正确设置它们。在 Bash 中使用 terraform apply -var region=$var_region 不起作用,但在命令行上使用带有变量集的命令可以。很奇怪

以上是关于将内插值放入 Terraform 查找的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 计划“应用后已知” - 如何知道我的插值是不是成功?

解决 terraform 中 EntityAlreadyExists 错误的最佳方法是啥?

使用 terraform 和 arm 模板通过工作流部署逻辑应用程序的最佳方法?

在SQL中插值的最佳方法

Terraform 12 - 无法将 [count.index] 放入 output.tf

插值查找-有序表查找_20230411