【问题标题】:How to specify dead letter dependency using modules?如何使用模块指定死信依赖?
【发布时间】:2019-02-20 21:10:57
【问题描述】:

我有以下基于此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:“名称”: 未设置必填字段错误: data.aws_sqs_queue.thumbnail_requests_queue_dead: : 无效或未知 关键:过滤器

【问题讨论】:

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


    【解决方案1】:

    最好的方法是使用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}"
    }
    

    注意:我还在这里更改了您的 HEREDOC 的缩进,因为you normally need to remove the indentation with these

    这会将 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 也为它们正确构建依赖关系树。

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 2022-11-12
      • 2017-09-29
      • 2019-02-01
      • 2016-07-25
      • 1970-01-01
      相关资源
      最近更新 更多