首页 > 解决方案 > Terraform 0.12 模块中的可选资源

问题描述

我将 terraform 从 0.11 迁移到 0.12。我有一个模块,它应该配置 AWS SQS 队列和可选的死信队列。

我的回购在这里

我对队列资源有以下条件:

resource "aws_sqs_queue" "regular_queue_with_dl" {
  count = var.attach_dead_letter_config ? 1 : 0

  redrive_policy = var.attach_dead_letter_config ? data.template_file.regular_queue_redrive_policy[count.index].rendered : null
...
}

在使用 DLQ 创建队列时首次运行attach_dead_letter_config=true,但当我想删除 DLQ ( attach_dead_letter_config=false) 时,当 terraform 计划运行时出现问题:

Error: Invalid index

  on modules/sqs/sqs.tf line 67, in resource "aws_sqs_queue" "regular_queue_with_dl":
  67:   redrive_policy             = var.attach_dead_letter_config ? data.template_file.regular_queue_redrive_policy[count.index].rendered : null
    |----------------
    | count.index is 0
    | data.template_file.regular_queue_redrive_policy is empty tuple

在模块中创建此类可选资源的正确方法是什么?

标签: terraformterraform0.12+

解决方案


根据资源的命名方式,这看起来像是 Terraform 0.11 解决方法的一个示例,该解决方法有两个resource具有相反count值的块,因此一次只创建一个块,以便在两组不同的参数之间进行选择。

Terraform 0.12 不再需要该解决方法,因为您可以在不需要的情况下设置redrive_policy为。null您还可以替换为对 Terraform 0.12 中函数template_file的调用,从而保持一切自包含:templatefile

resource "aws_sqs_queue" "regular_queue" {
  redrive_policy = var.attach_dead_letter_config ? templatefile(
    "${path.module}/redrive_policy.tmpl", {
      # (...whatever you had in "vars" in the template_file data resource...)  
    },
  ) : null
...
}

将资源参数设置null为与在 Terraform 0.12 中完全省略它相同。


推荐阅读