Terraform中的可选列表元素处理

时间:2018-04-13 11:27:58

标签: 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队列?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

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

作为旁注,它的死信不是死人。

ID     Title             Composer           Lyricist          Illustrator
a0018  My Western Rose   NA                 NA                NA
a0018  NA                Lincoln, Harry J.  NA                NA
a0018  NA                NA                 Vandersloot, F.W. NA
a0018  NA                NA                 NA                Dittmar, W.J.

答案 1 :(得分:0)

我的同事提出的解决方案似乎比@ 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}"
}