Terraform中的可选列表元素处理

Terraform中的可选列表元素处理,terraform,Terraform,我正在尝试向现有队列添加重新驱动策略 我已经成功地定义了这样一个列表: variable "sqsq_primary" { type = "list" default = [ { name = "PrimaryQueue1" maxReceiveCount = -1 deadLetterQueue = "" }, { name = "PrimaryQueue2" max

我正在尝试向现有队列添加重新驱动策略

我已经成功地定义了这样一个列表:

variable "sqsq_primary" {
  type = "list"
    default = [
      {
        name = "PrimaryQueue1"
        maxReceiveCount = -1
        deadLetterQueue = ""
      },
      {
        name = "PrimaryQueue2"
        maxReceiveCount = 5
        deadLetterQueue = "PrimaryQueue2_DL"
      },
      {
        name = "PrimaryQueue3"
        maxReceiveCount = 20
        deadLetterQueue = "PrimaryQueue3_DL"
      }
  ]
}
variable "sqsq_primary_dl" {
  type = "list"
  default = [
    "PrimaryQueue2_DL",
    "PrimaryQueue3_DL"
  ]
}
resource "aws_sqs_queue" "q" {
  count = "${length(var.sqsq_primary)}"
  name = "${lookup(var.sqsq_primary[count.index], "name")}-${var.environment}"
  ## Conditionally Sets A Redrive Policy ##
  redrive_policy = "${lookup(var.sqsq_primary[count.index], "deadLetterQueue") != "" ? "{\"deadLetterTargetArn\":\"arn:aws:sqs:${var.region}:${var.acc_number}:${lookup(var.sqsq_primary[count.index], "deadLetterQueue")}-${var.environment}\",\"maxReceiveCount\":${lookup(var.sqsq_primary[count.index], "maxReceiveCount")}}" : ""}"
  depends_on = ["aws_sqs_queue.qdl"]
}

resource "aws_sqs_queue" "qdl" {
  count = "${length(var.sqsq_primary_dl)}"
  name = "${element(var.sqsq_primary_dl, count.index)}-${var.environment}"
}
我定义了一个DL队列列表,如下所示:

variable "sqsq_primary" {
  type = "list"
    default = [
      {
        name = "PrimaryQueue1"
        maxReceiveCount = -1
        deadLetterQueue = ""
      },
      {
        name = "PrimaryQueue2"
        maxReceiveCount = 5
        deadLetterQueue = "PrimaryQueue2_DL"
      },
      {
        name = "PrimaryQueue3"
        maxReceiveCount = 20
        deadLetterQueue = "PrimaryQueue3_DL"
      }
  ]
}
variable "sqsq_primary_dl" {
  type = "list"
  default = [
    "PrimaryQueue2_DL",
    "PrimaryQueue3_DL"
  ]
}
resource "aws_sqs_queue" "q" {
  count = "${length(var.sqsq_primary)}"
  name = "${lookup(var.sqsq_primary[count.index], "name")}-${var.environment}"
  ## Conditionally Sets A Redrive Policy ##
  redrive_policy = "${lookup(var.sqsq_primary[count.index], "deadLetterQueue") != "" ? "{\"deadLetterTargetArn\":\"arn:aws:sqs:${var.region}:${var.acc_number}:${lookup(var.sqsq_primary[count.index], "deadLetterQueue")}-${var.environment}\",\"maxReceiveCount\":${lookup(var.sqsq_primary[count.index], "maxReceiveCount")}}" : ""}"
  depends_on = ["aws_sqs_queue.qdl"]
}

resource "aws_sqs_queue" "qdl" {
  count = "${length(var.sqsq_primary_dl)}"
  name = "${element(var.sqsq_primary_dl, count.index)}-${var.environment}"
}
在我的模块中,我定义了如下资源:

variable "sqsq_primary" {
  type = "list"
    default = [
      {
        name = "PrimaryQueue1"
        maxReceiveCount = -1
        deadLetterQueue = ""
      },
      {
        name = "PrimaryQueue2"
        maxReceiveCount = 5
        deadLetterQueue = "PrimaryQueue2_DL"
      },
      {
        name = "PrimaryQueue3"
        maxReceiveCount = 20
        deadLetterQueue = "PrimaryQueue3_DL"
      }
  ]
}
variable "sqsq_primary_dl" {
  type = "list"
  default = [
    "PrimaryQueue2_DL",
    "PrimaryQueue3_DL"
  ]
}
resource "aws_sqs_queue" "q" {
  count = "${length(var.sqsq_primary)}"
  name = "${lookup(var.sqsq_primary[count.index], "name")}-${var.environment}"
  ## Conditionally Sets A Redrive Policy ##
  redrive_policy = "${lookup(var.sqsq_primary[count.index], "deadLetterQueue") != "" ? "{\"deadLetterTargetArn\":\"arn:aws:sqs:${var.region}:${var.acc_number}:${lookup(var.sqsq_primary[count.index], "deadLetterQueue")}-${var.environment}\",\"maxReceiveCount\":${lookup(var.sqsq_primary[count.index], "maxReceiveCount")}}" : ""}"
  depends_on = ["aws_sqs_queue.qdl"]
}

resource "aws_sqs_queue" "qdl" {
  count = "${length(var.sqsq_primary_dl)}"
  name = "${element(var.sqsq_primary_dl, count.index)}-${var.environment}"
}
这很有效。但是,我不喜欢重复的信息,即DL队列的名称

所以问题是,我怎样才能摆脱第二份名单?如果deadLetterQueue!=“


谢谢你的帮助

我认为您可能遇到了地形插值的限制。除非您将地图列表解构为单独的地图,否则最好的可能在下面

如果将没有dl的队列的定义保留在底部,并在dl资源计数上使用静态值作为负数学,则计划将保持与以前相同

作为旁注,这是一纸空文,不是一纸空文

variable "sqsq_primary" {
  type = "list"
    default = [
      {
        name = "PrimaryQueue2"
        maxReceiveCount = 5
        deadLeaterQueue = "PrimaryQueue2_DL"
      },
      {
        name = "PrimaryQueue3"
        maxReceiveCount = 20
        deadLeaterQueue = "PrimaryQueue3_DL"
      },
      {
        name = "PrimaryQueue1"
        maxReceiveCount = -1
        deadLeaterQueue = ""
      }
  ]
}

resource "aws_sqs_queue" "q" {
  count = "${length(var.sqsq_primary)}"
  name = "${lookup(var.sqsq_primary[count.index], "name")}-${var.environment}"
  ## Conditionally Sets A Redrive Policy ##
  redrive_policy = "${lookup(var.sqsq_primary[count.index], "deadLeaterQueue") != "" ? "{\"deadLetterTargetArn\":\"arn:aws:sqs:${var.region}:${var.acc_number}:${lookup(var.sqsq_primary[count.index], "deadLeaterQueue")}-${var.environment}\",\"maxReceiveCount\":${lookup(var.sqsq_primary[count.index], "maxReceiveCount")}}" : ""}"
  depends_on = ["aws_sqs_queue.qdl"]
}

resource "aws_sqs_queue" "qdl" {
  count = "${length(var.sqsq_primary) - 1}"
  name = "${lookup(var.sqsq_primary[count.index], "deadLeaterQueue")-var.environment}"
}

我认为您可能遇到了地形插值的限制。除非您将地图列表解构为单独的地图,否则最好的可能在下面

如果将没有dl的队列的定义保留在底部,并在dl资源计数上使用静态值作为负数学,则计划将保持与以前相同

作为旁注,这是一纸空文,不是一纸空文

variable "sqsq_primary" {
  type = "list"
    default = [
      {
        name = "PrimaryQueue2"
        maxReceiveCount = 5
        deadLeaterQueue = "PrimaryQueue2_DL"
      },
      {
        name = "PrimaryQueue3"
        maxReceiveCount = 20
        deadLeaterQueue = "PrimaryQueue3_DL"
      },
      {
        name = "PrimaryQueue1"
        maxReceiveCount = -1
        deadLeaterQueue = ""
      }
  ]
}

resource "aws_sqs_queue" "q" {
  count = "${length(var.sqsq_primary)}"
  name = "${lookup(var.sqsq_primary[count.index], "name")}-${var.environment}"
  ## Conditionally Sets A Redrive Policy ##
  redrive_policy = "${lookup(var.sqsq_primary[count.index], "deadLeaterQueue") != "" ? "{\"deadLetterTargetArn\":\"arn:aws:sqs:${var.region}:${var.acc_number}:${lookup(var.sqsq_primary[count.index], "deadLeaterQueue")}-${var.environment}\",\"maxReceiveCount\":${lookup(var.sqsq_primary[count.index], "maxReceiveCount")}}" : ""}"
  depends_on = ["aws_sqs_queue.qdl"]
}

resource "aws_sqs_queue" "qdl" {
  count = "${length(var.sqsq_primary) - 1}"
  name = "${lookup(var.sqsq_primary[count.index], "deadLeaterQueue")-var.environment}"
}

我的同事提出了一个比@henry dobson提供的解决方案更灵活的解决方案

我们还对其进行了重构,因此现在它不需要deadLeaterQueue值-我们现在符合命名标准,因此DL队列的结果名称与问题中的名称不同

variable "sqsq_primary" {
  type = "list"
    default = [
      {
        name = "PrimaryQueue1"
        maxReceiveCount = 0
      },
      {
        name = "PrimaryQueue2"
        maxReceiveCount = 5
      },
      {
        name = "PrimaryQueue3"
        maxReceiveCount = 20
      }
  ]
}
data "empty_data_source" "deadletterq" {
  count = "${length(var.sqsq_primary)}"
  inputs = {
    dl = "${lookup(var.sqsq_primary[count.index], "maxReceiveCount", "") > 0 ? "${replace(lookup(var.sqsq_primary[count.index], "name"),"Queue","DeadLetterQueue")}" : ""}"
  }
}

resource "aws_sqs_queue" "q" {
  count = "${length(var.sqsq_primary)}"
  name = "${lookup(var.sqsq_primary[count.index], "name")}-${var.environment}"
  ## Conditionally Sets A Redrive Policy ##
  redrive_policy = "${lookup(var.sqsq_primary[count.index], "maxReceiveCount") > 0 ? "{\"deadLetterTargetArn\":\"arn:aws:sqs:${var.region}:${var.acc_number}:${replace(lookup(var.sqsq_primary[count.index], "name"),"Queue","DeadLetterQueue")}-${var.environment}\",\"maxReceiveCount\":${lookup(var.sqsq_primary[count.index], "maxReceiveCount")}}" : ""}"
  depends_on = ["aws_sqs_queue.qdl"]
}

resource "aws_sqs_queue" "qdl" {
  count = "${length(compact(data.empty_data_source.deadletterq.*.outputs.dl))}"
  name = "${element(compact(data.empty_data_source.deadletterq.*.outputs.dl), count.index)}-${var.environment}"
}

我的同事提出了一个比@henry dobson提供的解决方案更灵活的解决方案

我们还对其进行了重构,因此现在它不需要deadLeaterQueue值-我们现在符合命名标准,因此DL队列的结果名称与问题中的名称不同

variable "sqsq_primary" {
  type = "list"
    default = [
      {
        name = "PrimaryQueue1"
        maxReceiveCount = 0
      },
      {
        name = "PrimaryQueue2"
        maxReceiveCount = 5
      },
      {
        name = "PrimaryQueue3"
        maxReceiveCount = 20
      }
  ]
}
data "empty_data_source" "deadletterq" {
  count = "${length(var.sqsq_primary)}"
  inputs = {
    dl = "${lookup(var.sqsq_primary[count.index], "maxReceiveCount", "") > 0 ? "${replace(lookup(var.sqsq_primary[count.index], "name"),"Queue","DeadLetterQueue")}" : ""}"
  }
}

resource "aws_sqs_queue" "q" {
  count = "${length(var.sqsq_primary)}"
  name = "${lookup(var.sqsq_primary[count.index], "name")}-${var.environment}"
  ## Conditionally Sets A Redrive Policy ##
  redrive_policy = "${lookup(var.sqsq_primary[count.index], "maxReceiveCount") > 0 ? "{\"deadLetterTargetArn\":\"arn:aws:sqs:${var.region}:${var.acc_number}:${replace(lookup(var.sqsq_primary[count.index], "name"),"Queue","DeadLetterQueue")}-${var.environment}\",\"maxReceiveCount\":${lookup(var.sqsq_primary[count.index], "maxReceiveCount")}}" : ""}"
  depends_on = ["aws_sqs_queue.qdl"]
}

resource "aws_sqs_queue" "qdl" {
  count = "${length(compact(data.empty_data_source.deadletterq.*.outputs.dl))}"
  name = "${element(compact(data.empty_data_source.deadletterq.*.outputs.dl), count.index)}-${var.environment}"
}

谢谢你!谢谢你发现了错误:)谢谢你!谢谢你发现了错误:)