如何使用模块指定死信依赖?

问题描述 投票:1回答:1

我有以下核心模块基于这个official module

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:“name”:未设置必填字段错误:data.aws_sqs_queue.thumbnail_requests_queue_dead ::无效或未知密钥:filter

amazon-web-services terraform amazon-sqs terragrunt
1个回答
3
投票

最好的方法是使用outputted ARN from the module

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

注意:因为you normally need to remove the indentation with these,我也改变了你的HEREDOC缩进。

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.