首页 > 解决方案 > 如何使用模块指定死信依赖?

问题描述

我有以下基于这个官方模块的核心模块

module "sqs" {
  source = "github.com/terraform-aws-modules/terraform-aws-sqs?ref=0d48cbdb6bf924a278d3f7fa326a2a1c864447e2"
  name = "${var.site_env}-sqs-${var.service_name}"
}

我想创建两个队列:xyz 和 xyz_dead。xyz 将其死信消息发送到 xyz_dead。

module "xyz_queue" {
  source       = "../helpers/sqs"
  service_name = "xyz"

  redrive_policy = <<POLICY { 
      "deadLetterTargetArn" : "${data.TODO.TODO.arn}",   
      "maxReceiveCount" : 5
  }
  POLICY
  site_env = "${var.site_env}"
}

module "xyz_dead_queue" {
  source       = "../helpers/sqs"
  service_name = "xyz_dead"
  site_env     = "${var.site_env}"
}

如何指定deadLetterTargetArn依赖项?

如果我做:

data "aws_sqs_queue" "dead_queue" {
  filter {
    name   = "tag:Name"
    values = ["${var.site_env}-sqs-xyz_dead"]
  }
}

并设置deadLetterTargetArn"${data.aws_sqs_queue.dead_queue.arn}",然后我收到此错误:

错误:data.aws_sqs_queue.thumbnail_requests_queue_dead:“名称”:未设置必填字段错误:data.aws_sqs_queue.thumbnail_requests_queue_dead::无效或未知键:过滤器

标签: amazon-web-servicesterraformamazon-sqsterragrunt

解决方案


最好的方法是使用模块输出的 ARN

module "xyz_queue" {
  source       = "../helpers/sqs"
  service_name = "xyz"
  site_env     = "${var.site_env}"

  redrive_policy = <<POLICY
{ 
  "deadLetterTargetArn" : "${module.xyz_dead_queue.this_sqs_queue_arn}",   
  "maxReceiveCount" : 5
}
POLICY
}

module "xyz_dead_queue" {
  source       = "../helpers/sqs"
  service_name = "xyz_dead"
  site_env     = "${var.site_env}"
}

注意:我还在这里更改了您的 HEREDOC 的缩进,因为您通常需要使用这些.

这会将 SQS 队列的 ARN 直接从xyz_dead_queue模块传递到xyz_queue.

至于你得到的错误,aws_sqs_queue数据源只需要一个name参数,而不是filter像其他一些数据源那样的块。

如果您想使用aws_sqs_queue数据源,那么您只想使用:

data "aws_sqs_queue" "dead_queue" {
  name = "${var.site_env}-sqs-${var.service_name}"
}

也就是说,如果您同时创建两个事物,那么除非您首先创建第一个资源,否则使用数据源引用其中一个事物将会遇到问题。这是因为数据源在资源之前运行,因此如果两个队列都不存在,您的数据源将运行并且找不到死信队列并因此失败。如果死信队列确实存在,那就没问题了。一般来说,尽管您最好避免使用这样的数据源,而仅使用它们来引用在单独terraform apply(或者甚至可能在 Terraform 之外创建)中创建的事物。

您最好将资源或模块的输出简单地传递给其他资源/模块,并允许 Terraform 也为它们正确构建依赖关系树。


推荐阅读