Как устранить сообщение об ошибке при добавлении политики SQS redrive для очереди мертвых писем, созданной с помощью for_each

#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. я решил согласиться с вашим предложенным ответом….. большое вам спасибо