Terraform 仅当条件为真时,合并两个地形图 介绍

Terraform 仅当条件为真时,合并两个地形图 介绍,terraform,Terraform,我想合并两个地形图,只有当条件为真时 可以使用该函数进行合并 条件是映射中是否存在密钥。这可以通过函数进行检查 背景 如果你不在乎我为什么要做条件合并,你可以跳过这篇文章 关于我为什么要进行这些合并的一些背景知识,因为这可能不是在terraform中实现该结果的最佳方式 我将同一个项目地形化到多个工作区。工作区是不同的AWS帐户和区域。该列表在中心地形文件中定义。这些信息被排除在每个项目之外,因为: 许多项目被地形化到许多工作区 如果我以后想将该项目地形化到一个新的工作区,而在编写项目地形

我想合并两个地形图,只有当条件为真时

  • 可以使用该函数进行合并
  • 条件是映射中是否存在密钥。这可以通过函数进行检查
背景 如果你不在乎我为什么要做条件合并,你可以跳过这篇文章

关于我为什么要进行这些合并的一些背景知识,因为这可能不是在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"]))}"
}