将内插值放入 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
,以模拟您将使用plan
、apply
等进行的操作:
$ 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 模板通过工作流部署逻辑应用程序的最佳方法?