使用 for_each 的多个 aws_rds_cluster_instance

Posted

技术标签:

【中文标题】使用 for_each 的多个 aws_rds_cluster_instance【英文标题】:Multiple aws_rds_cluster_instance using for_each 【发布时间】:2021-12-19 17:00:21 【问题描述】:

我想创建一个模块

在我的路由变量.tfvars 文件中,我在输入下方传递。

rds_aurora = [
  
    cluster_identifier               = "aurora-cluster-mysql-qa"
    cluster_instance_count           = 2
    engine                           = "aurora-mysql"
    engine_version                   = "5.7.mysql_aurora.2.07.1"
  ,
  
    cluster_identifier               = "aurora-cluster-mysql-dev"
    cluster_instance_count           = 1
    engine                           = "aurora-mysql"
    engine_version                   = "5.7.mysql_aurora.2.07.1"
   

Module.tf 文件

 resource "aws_rds_cluster_instance" "cluster_instances" 
  for_each                            =  for rds_aurora_instance in var.rds_aurora : "$rds_aurora_instance.cluster_identifier-cluster_instance_count" => rds_aurora_instance 
  identifier                          = each.value.key
  cluster_identifier                  = each.value.cluster_identifier
  engine                              = each.value.engine
  engine_version                      = each.value.engine_version

我正在尝试将变量转换为以下形式,以便在模块中使用它。

aurora-cluster-mysql-qa-0  => 
    cluster_identifier               = "aurora-cluster-mysql-qa"
    cluster_instance_count           = 2
    engine                           = "aurora-mysql"
    engine_version                   = "5.7.mysql_aurora.2.07.1"
  
aurora-cluster-mysql-qa-1  => 
    cluster_identifier               = "aurora-cluster-mysql-qa"
    cluster_instance_count           = 2
    engine                           = "aurora-mysql"
    engine_version                   = "5.7.mysql_aurora.2.07.1"
  
 
aurora-cluster-mysql-dev-0 => 
    cluster_identifier               = "aurora-cluster-mysql-dev"
    cluster_instance_count           = 2
    engine                           = "aurora-mysql"
    engine_version                   = "5.7.mysql_aurora.2.07.1"
  

下面的表达式似乎不起作用。请帮忙。 我只想使用 for-each ,所以在修改/删除任何块期间,我不会遇到可变块顺序问题。

 for_each                            =  for rds_aurora_instance in var.rds_aurora : "$rds_aurora_instance.cluster_identifier-cluster_instance_count" => rds_aurora_instance 

【问题讨论】:

你的例子对我来说看起来不错。你有错误吗? 下面的部分不行,这里只创建一个名为“aurora-cluster-mysql-qa-2”的实例,但我想要2个名为“aurora-cluster-mysql-qa-”的实例0" 和 "aurora-cluster-mysql-qa-1" "$rds_aurora_instance.cluster_identifier-cluster_instance_count" => rds_aurora_instance 哪里不行?你有错误吗? 下面的部分不行,这里只创建一个名为“aurora-cluster-mysql-qa-2”的实例,但我想要2个名为“aurora-cluster-mysql-qa-”的实例0" 和 "aurora-cluster-mysql-qa-1" "$rds_aurora_instance.cluster_identifier-cluster_instance_count" => rds_aurora_instance 你的问题不清楚。到底发生了什么?您当前的代码有什么问题?请使用所有相关详细信息更新问题。 【参考方案1】:

这不是一个简单的转换,您的rds_aurora 是一个对象数组,我们在该对象的一个​​属性中进行计数,我们将需要一个中间变量来转换它,这将需要几个循环...

我会这样做:

provider "aws" 
  region = "us-east-2"


locals 
  rds_aurora = [
    
      cluster_identifier     = "aurora-cluster-mysql-qa"
      cluster_instance_count = 2
      engine                 = "aurora-mysql"
      engine_version         = "5.7.mysql_aurora.2.07.1"
    ,
    
      cluster_identifier     = "aurora-cluster-mysql-dev"
      cluster_instance_count = 1
      engine                 = "aurora-mysql"
      engine_version         = "5.7.mysql_aurora.2.07.1"
    
  ]

  data =  for i in flatten([
    for x in local.rds_aurora :
    [
      for y in range(x.cluster_instance_count) :
      
        "id"                     = y
        "cluster_identifier"     = x.cluster_identifier
        "cluster_instance_count" = 2
        "engine"                 = x.engine
        "engine_version"         = x.engine_version
      
    ]
    ]) : "$i.cluster_identifier_$i.id" => i
  


output "new_data" 
  value = local.data

让我们分解那里发生的事情,我们有 3 个循环

for i in flatten([ 这个我们把最终的对象放在一起 for x in local.rds_aurora 只是 rds_aurora 中元素的循环 for y in range(x.cluster_instance_count) 这是获得我们稍后将要的 id (0, 1) 的那个 连接最终对象

【讨论】:

这有帮助 :) 并且工作正常,但我想有条件地创建资源,只有在 engine_mode != "serverless" 时,我怎样才能将条件部分放入 for_each = local.data 我想它必须添加engine_mode == serverless 时数据中的某处忽略该块 @AbhishekSolanki serverless 条件是对这个问题的一个新的旋转......但是 terraform 中的 for 循环有一些代码:discuss.hashicorp.com/t/… 谢谢它对我有帮助和工作:)

以上是关于使用 for_each 的多个 aws_rds_cluster_instance的主要内容,如果未能解决你的问题,请参考以下文章

使用 for_each 创建的资源中带有 for_each 的动态块

Terraform for_each - each.key 在哪里定义?

如何在 C++ 中使用 for_each 累积结果? [复制]

使用具有 for_each 集的模块的输出值

for_each使用

使用 for_each 创建不同数量的具有唯一 NIC 的 VM