Как указать зависимость от мертвой буквы с помощью модулей?
У меня есть следующий основной модуль, основанный на этом официальном модуле:
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 правильно строить для них дерево зависимостей.