使用 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 在哪里定义?