Terraform 中的可选列表元素处理

Optional list element processing in Terraform

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

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

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"
      }
  ]
}

我定义了一个 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 的队列的定义,并使用静态值来减去 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}"
}