为 Azure 容器注册表 (ACR) 的私有端点创建动态私有 dns 区域记录

问题描述

我正在努力为 Azure 中相同资源的多个私有端点设置动态私有 dns 区域记录(ACR - Azure 容器注册表)。

所以我目前已经设置了这个简单的例子。基本上它模拟创建 ACR 并构建需要在 DNS 中注册的记录映射,以便可以正确使用 ACR。这里的问题是需要以某种方式从每个资源/对象的内部字段(这里是端点变量)中提取值,然后正确转换它以匹配预期输出。这是必需的,因为在我的情况下,它是模块的组成部分,需要根据创建的实际资源的值动态构建。

以下示例应该可以帮助任何想要检查此问题并有所帮助的人。 要验证您是否得到了正确的结果,只需键入“terraform refresh”,然后应该打印输出

terraform {
  backend local {}
}

# simulates creation of multiple Azure Container Registry private endpoints
variable endpoints {
  type = map
  default = {
    "registry" = {
      custom_dns_configs = [
        {
          fqdn = "something.westeurope.data.azurecr.io"
          ip_addresses = ["1.1.1.1",]
        },{
          fqdn         = "something.azurecr.io"
          ip_addresses = ["1.1.1.2",]
        }
      ]
    },"registry2" = {
      custom_dns_configs = [
        {
          fqdn = "something.westeurope.data.azurecr.io"
          ip_addresses = ["1.1.2.1",{
          fqdn = "something.azurecr.io"
          ip_addresses = ["1.1.2.2",]
    },#...
    # "registryN" = {...}
  }
}

# Question: How to write for block here to get out of it exactly what's in expected
#           result having in mind that there can be multiple of "registry" blocks?
#           Below line produce only single result which doesn't match expected result.
output result {
  value = {for pe in var.endpoints:
    pe.custom_dns_configs[0].fqdn => pe.custom_dns_configs[0].ip_addresses
  }
}

# Expected result:
# result = {
#   "something.westeurope.data.azurecr.io" = [
#     "1.1.1.1",#     "1.1.2.1",#   ]
#   "something.azurecr.io" = [
#     "1.1.1.2",#     "1.1.2.2",#   ]
# }

解决方法

回答我自己的问题:

output result {
  value = {for k,v in { 
      for cdc in flatten(
        [for pe in var.endpoints: pe.custom_dns_configs]
      ): 
        cdc.fqdn => cdc.ip_addresses...
    }: 
      k => flatten(v)
  }
}

现在解释几句:

  • [] 和 {} - [] 生成一个元组,从传入的映射中去除“注册表”键,而 {} 需要生成某种动态键
  • [for pe in var.endpoints: pe.custom_dns_configs] 只需从地图的每个元素的 var.environments 中提取内部字段。然后使用 flatten 只是为了使事情更简单,而无需深入研究不同级别的嵌套列表
  • 下一步是为 fqdn 构建新映射 -> 列表(IP 地址)
  • 需要 cdc.ip_addresses 后的“...”。这是允许按键对值进行分组的符号。在这种情况下,我们至少有 2 次相同的 fqdn,并且通常情况下,terraform 会抱怨当键不唯一时它无法创建这样的映射。在那里添加这 3 个点可以启用此分组。
  • 然后使用最顶层的 for 块只是为了展平整个值输出。

现在的问题是我们是否仍想保留“registry”、“registry2”、“registryN”分组。为此,我还没有找到解决方案。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...