#amazon-web-services #terraform
Вопрос:
Я хочу, чтобы terraform связала мое событие управления SQS с моим событием управления DLQ, и я хочу, чтобы то же самое было сделано с событием данных SQS и событием данных DLQ.Я получаю сообщения об ошибках, когда запускаю приложение для моего кода ниже.пожалуйста, мне нужна помощь.
.tfvars sqs_queue_names = ["CloudTrail_SQS_Management_Event", "CloudTrail_SQS_Data_Event"] dead_queue_names = ["CloudTrail_DLQ_Management_Event", "CloudTrail_DLQ_Data_Event"]
variable.tf variable "sqs_queue_names"{ description = "The name of different SQS to be created" type = set(string) } variable "dead_queue_names"{ description = "The name of different Dead Queues to be created" type = set(string) }
main.tf resource "aws_sqs_queue" "CloudTrail_SQS"{ for_each = var.sqs_queue_names name = each.value redrive_policy = jsonencode({ deadLetterTargetArn = values(aws_sqs_queue.CloudTrail_SQS_DLQ)[*].arn maxReceiveCount = var.max_receive_count }) tags = var.default_tags } resource "aws_sqs_queue" "CloudTrail_SQS_DLQ"{ for_each = var.dead_queue_names name = each.value tags = var.default_tags }
ERROR MESSAGES: Error: error creating SQS Queue (CloudTrail_SQS_Management_Event): InvalidParameterValue: Value {"deadLetterTargetArn":["arn:aws:sqs:us-east-1:123456789012:CloudTrail_DLQ_Data_Event","arn:aws:sqs:us-east-1:123456789012:CloudTrail_DLQ_Management_Event"],"maxReceiveCount":10} for parameter RedrivePolicy is invalid. Reason: Invalid value for deadLetterTargetArn. │ status code: 400, request id: 9663b896-d86f-569e-92e2-e17152c2db26 │ │ with aws_sqs_queue.CloudTrail_SQS["CloudTrail_SQS_Management_Event"], │ on main.tf line 5, in resource "aws_sqs_queue" "CloudTrail_SQS": │ 5: resource "aws_sqs_queue" "CloudTrail_SQS"{ │ ╵ ╷ │ Error: error creating SQS Queue (CloudTrail_SQS_Data_Event): InvalidParameterValue: Value {"deadLetterTargetArn":["arn:aws:sqs:us-east-1:123456789012:CloudTrail_DLQ_Data_Event","arn:aws:sqs:us-east-1:123456789012:CloudTrail_DLQ_Management_Event"],"maxReceiveCount":10} for parameter RedrivePolicy is invalid. Reason: Invalid value for deadLetterTargetArn. │ status code: 400, request id: 88b8e4c5-1d50-5559-92f8-bd2297fd231f │ │ with aws_sqs_queue.CloudTrail_SQS["CloudTrail_SQS_Data_Event"], │ on main.tf line 5, in resource "aws_sqs_queue" "CloudTrail_SQS": │ 5: resource "aws_sqs_queue" "CloudTrail_SQS"{
Комментарии:
1. Похоже, это тот же вопрос, что и ваш предыдущий. Есть ли какая-то разница?
Ответ №1:
Проблема здесь в том, что вы не связываете очередь недоставленных сообщений с соответствующей очередью SQS. values(aws_sqs_queue.CloudTrail_SQS_DLQ)[*].arn
— это, по сути, передает каждую очередь с мертвой буквой ARN для каждой очереди SQS, она не переходит только к правильному ARN.
Чтобы преодолеть это, я предлагаю создать модуль, в котором мы сможем связать очередь SQS и ее DLQ. На данный момент мы можем назвать my_sqs
:
my_sqs/variables.tf
:
variable "sqs_queue_name"{ description = "The name of different SQS to be created" type = string } variable "dead_queue_name"{ description = "The name of different Dead Queues to be created" type = string } variable "max_receive_count" { type = number }
my_sqs/main.tf
:
resource "aws_sqs_queue" "sqs" { name = var.sqs_queue_name redrive_policy = jsonencode({ deadLetterTargetArn = aws_sqs_queue.dlq.arn maxReceiveCount = var.max_receive_count }) } resource "aws_sqs_queue" "dlq" { name = var.dead_queue_name }
Теперь мы можем использовать этот модуль следующим образом:
variables.tf
:
# Please not, we are tying the SQS and the DQL together here as well. variable "queue_names" { default = [ { sqs_name = "CloudTrail_SQS_Management_Event" dlq_name = "CloudTrail_DLQ_Management_Event" }, { sqs_name = "CloudTrail_SQS_Data_Event" dlq_name = "CloudTrail_DLQ_Data_Event" } ] }
Из main.tf
мы называем модуль, который мы создали выше:
main.tf
:
module "my_sqs" { source = "./my_sqs" for_each = { for sqs, dlq in var.queue_names : sqs =gt; dlq } sqs_queue_name = each.value.sqs_name dead_queue_name = each.value.dlq_name max_receive_count = 4 }
Пожалуйста, обратите внимание, что этот пример может работать с последними версиями Terraform. Это может не работать со старой версией, которая не поддерживает наличие a for_each
на a module
.
Комментарии:
1. спасибо за вашу фантастическую answer..it сработало, когда я делаю это так, как вы сказали, но я хочу использовать Terragrunt для вызова модуля, создающего ресурсы
2. Это мой Террагрант. входные данные hcl = { cloudtrail_event_log_bucket_name = «aws-cloudtrailbucket-sqs-журналы» имена sqs_queue_names = [«CloudTrail_SQS_Management_Event», «CloudTrail_SQS_Data_Event»] имена мертвых очередей = [«CloudTrail_DLQ_Management_Event», «CloudTrail_DLQ_Data_Event»]
3. @ Эрвин, я перепостил вопрос с моей конфигурацией Terragrunt.hcl
4. Отлично, я не очень хорошо знаком с Террагрунтом, другие люди могут помочь вам с новым вопросом.
5. я решил согласиться с вашим предложенным ответом….. большое вам спасибо