Как указать зависимость от мертвой буквы с помощью модулей? - PullRequest
0 голосов
/ 17 сентября 2018

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

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 Ответ

0 голосов
/ 17 сентября 2018

Лучший способ сделать это - использовать выходной 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 здесь, потому что обычно необходимо удалить отступ с помощью этих .

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

...