Как указать зависимость от мертвой буквы с помощью модулей?

У меня есть следующий основной модуль, основанный на этом официальном модуле:

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:: недопустимый или неизвестный ключ: фильтр

1 ответ

Лучший способ сделать это - использовать 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}"
}

NB: Я также изменил отступ вашего HEREDOC здесь, потому что вы обычно должны удалить отступ с этим.

Это передаст ARN очереди SQS непосредственно из 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 правильно строить для них дерево зависимостей.

Другие вопросы по тегам