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

时间:2018-09-16 23:54:07

标签: amazon-web-services terraform amazon-sqs terragrunt

基于此official module,我具有以下核心模块:

'report_'

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

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

如何指定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.thumbnail_requests_queue_dead:“名称”:   未设置必填字段错误:   data.aws_sqs_queue.thumbnail_requests_queue_dead::无效或未知   键:过滤器

1 个答案:

答案 0 :(得分: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也为它们正确构建依赖关系树,您会得到更好的结果。

相关问题