【问题标题】:Whats the right way to create multiple elements using terraform variables?使用 terraform 变量创建多个元素的正确方法是什么?
【发布时间】:2021-03-11 14:57:07
【问题描述】:

我正在使用 Terraform 创建 AWS SQS 队列。对于每个服务,我需要创建两个队列,一个正常队列和一个错误队列。每个的设置大多相同,但我需要先创建错误队列,以便我可以将其 ARN 作为其重新驱动策略的一部分传递给正常队列。与其创建 10 个模块,不如有一种更好的方法来循环替换名称。所以编程逻辑... foreach queue_prefixes中的队列,创建错误模块,然后是常规模块。我确定我只是没有正确搜索或提出正确的问题。

沙盒/main.tf

provider "aws" {
  region = "us-west-2"
}

module "hfd_sqs_error_sandbox" {
    source = "../"
    for_each = var.queue_prefixes
    name= each.key+"_Error"
}

module "hfd_sqs_sandbox" {
    source = "../"

    name=hfd_sqs_error_sandbox.name

    redrive_policy = jsonencode({
    deadLetterTargetArn = hfd_sqs_error_sandbox_this_sqs_queue_arn,
    maxReceiveCount     = 3
  })
}

变量.tf

variable "queue_prefixes" {
  description = "Create these queues with the enviroment prefixed"
  type = list(string)
  default = [
    "Clops",
    "Document",
    "Ledger",
    "Log",
    "Underwriting",
    "Wallet",
  ]
}

【问题讨论】:

    标签: terraform amazon-sqs terraform-provider-aws


    【解决方案1】:

    您可能需要考虑添加一个包装器模块来创建普通队列和死信队列。这样可以更轻松地按顺序创建资源。

    考虑这个例子(使用空资源以便于测试):

    创建所有队列的根模块:

    # ./main.tf
    
    locals {
      queue_prefixes = [
          "Queue_Prefix_1",
          "Queue_Prefix_2",
      ]
    }
    
    module queue_set {
      source = "./modules/queue_set"
    
      for_each = toset(local.queue_prefixes)
    
      name = each.key
    }
    

    包装器模块创建2个队列的集合:正常 + dlq:

    # ./modules/queue_set/main.tf
    
    variable "name" {
      type = string
    }
    
    module dlq {
      source = "../queue"
    
      name = "${var.name}_Error"
    }
    
    module queue {
      source = "../queue"
    
      name = var.name
      redrive_policy = module.dlq.id
    }
    

    独立队列资源适合创建两种类型的队列:

    # ./modules/queue/main.tf
    
    variable "name" {
      type = string
    }
    
    variable "redrive_policy" {
      type = string
      default =  ""
    }
    
    resource "null_resource" "queue" {
      provisioner "local-exec" {
        command = "echo \"Created queue ${var.name}, redrive policy: ${var.redrive_policy}\""
      }
    
      # this is irrelevant to the question, it's just to make null resource change every time
      triggers = {
        always_run = timestamp()
      }
    }
    
    output "id" {
      value = null_resource.queue.id
    }
    

    现在如果我们运行这个堆栈,我们可以看到以正确的顺序创建的资源:

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2023-03-23
      相关资源
      最近更新 更多