Terraform 仅当条件为真时,合并两个地形图 介绍
我想合并两个地形图,只有当条件为真时Terraform 仅当条件为真时,合并两个地形图 介绍,terraform,Terraform,我想合并两个地形图,只有当条件为真时 可以使用该函数进行合并 条件是映射中是否存在密钥。这可以通过函数进行检查 背景 如果你不在乎我为什么要做条件合并,你可以跳过这篇文章 关于我为什么要进行这些合并的一些背景知识,因为这可能不是在terraform中实现该结果的最佳方式 我将同一个项目地形化到多个工作区。工作区是不同的AWS帐户和区域。该列表在中心地形文件中定义。这些信息被排除在每个项目之外,因为: 许多项目被地形化到许多工作区 如果我以后想将该项目地形化到一个新的工作区,而在编写项目地形
- 可以使用该函数进行合并
- 条件是映射中是否存在密钥。这可以通过函数进行检查
- 许多项目被地形化到许多工作区
- 如果我以后想将该项目地形化到一个新的工作区,而在编写项目地形文件时该工作区并不存在,则不需要编辑源代码管理中的项目地形文件。我更喜欢将新工作区添加到一个中心地形文件,而不是每个项目的地形。项目的地形文件应该是关于需要哪些AWS资源(lambdas、dynamo、roles等),而不是什么AWS帐户,后者在项目外部管理
locals {
workspaces = {
workspace_1 = {
aws_region = us-east-1
aws_account = [some account id]
}
workspace_2 = {
aws_region = us-west-2
aws_account = [some account id]
}
...
# a list of workspaces
}
}
工作区信息(aws帐户、区域)可以通过简单的merge()加载到工作区\u default
。到目前为止还不错
现在,每个项目可能需要定义一个特定的本地映射条目,也许该项目需要工作区_17中更高的DynamoDB RCU。
例如
我正在尝试找出如何将该项目的工作区覆盖合并到我的工作区
。而且项目可能不会覆盖任何内容,因此locals.env[terraform.workspace]
可能不存在。因此使用了lookup()
函数
地形版本
我使用terraform版本1.11.13,无法轻松升级到1.12,因此任何解决方案都需要使用1.11。以下是条件合并
locals {
workspace = "${
merge(
local.workspaces[terraform.workspace],
merge(
local.env["default"],
local.env[contains(keys(local.env), terraform.workspace) ? terraform.workspace : "default"]))}"
}
locals {
env = {
# stuff that is common to this project in any workspace
default = {
rcu = [the normal RCU value]
...
# list of key value pairs
}
# stuff that must be defined for this project in workspace_17
workspace_17 {
rcu = [a higher RCU value]
}
}
}
locals {
workspace = "${
merge(
local.workspaces[terraform.workspace],
merge(
local.env["default"],
local.env[contains(keys(local.env), terraform.workspace) ? terraform.workspace : "default"]))}"
}