как определить элемент в значении коллекции

#amazon-web-services #terraform #terraform-provider-aws

Вопрос:

Я получаю эти сообщения об ошибках при запуске приложения terragrunt.Мне нужно иметь возможность указывать каждый элемент при создании SQS и DeadLetterQueue с помощью политики.Я не уверен, как решить эту проблему.Я хочу найти способ напрямую ссылаться на отдельные DLQ с соответствующими SQS для создания необходимых ресурсов

 resource "aws_sqs_queue_policy" "Cloudtrail_SQS_Policy" {
  for_each  = toset(var.sqs_queue_names)
  queue_url = aws_sqs_queue.CloudTrail_SQS[each.key].id

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Id": "sqspolicy",
  "Statement": [
    {
      "Sid": "AllowSQSInvocation",
      "Effect": "Allow",
      "Principal": {"AWS":"*"},
      "Action": "sqs:*",
      "Resource": "${aws_sqs_queue.CloudTrail_SQS[each.key].arn}"

resource "aws_sqs_queue_policy" "CloudTrail_SQS_DLQ"{
    for_each  = toset(var.dead_queue_names)
    queue_url = aws_sqs_queue.CloudTrail_SQS_DLQ[each.key].id

    policy = <<POLICY
{
  "Version": "2012-10-17",
  "Id": "sqspolicy",
  "Statement": [
    {
      "Sid": "DLQ Policy",
      "Effect": "Allow",
      "Principal": {"AWS":"*"},
      "Action": "sqs:*",
      "Resource": "${aws_sqs_queue.CloudTrail_SQS_DLQ[each.key].arn}
 
 Error Messages:

Error: Invalid index
│ 
│   on iam.tf line 3, in resource "aws_sqs_queue_policy" "Cloudtrail_SQS_Policy":
│    3:   queue_url = aws_sqs_queue.CloudTrail_SQS[each.key].id
│     ├────────────────
│     │ aws_sqs_queue.CloudTrail_SQS is object with 2 attributes
│     │ each.key is "CloudTrail_SQS_Management_Event"
│ 
│ The given key does not identify an element in this collection value.
╵
╷
│ Error: Invalid index
│ 
│   on iam.tf line 15, in resource "aws_sqs_queue_policy" "Cloudtrail_SQS_Policy":
│   15:       "Resource": "${aws_sqs_queue.CloudTrail_SQS[each.key].arn}",
│     ├────────────────
│     │ aws_sqs_queue.CloudTrail_SQS is object with 2 attributes
│     │ each.key is "CloudTrail_SQS_Data_Event"
│ 
│ The given key does not identify an element in this collection value.
╵
╷
│ Error: Invalid index
│ 
│   on iam.tf line 15, in resource "aws_sqs_queue_policy" "Cloudtrail_SQS_Policy":
│   15:       "Resource": "${aws_sqs_queue.CloudTrail_SQS[each.key].arn}",
│     ├────────────────
│     │ aws_sqs_queue.CloudTrail_SQS is object with 2 attributes
│     │ each.key is "CloudTrail_SQS_Management_Event"
│ 
│ The given key does not identify an element in this collection value.
 

Ответ №1:

Я переработал весь ваш код, так как любые изменения приведут к большему количеству ошибок. В вашем случае лучший способ выполнить ваши требования-использовать карту, а не list или set . Вам не нужно делать свои входные переменные картой, если вы этого не хотите, хотя это было бы проще. Но сохраняя входные переменные такими, какие они есть, вы можете создавать local.sqs_dlq_map и использовать их:

 
locals {
  sqs_dlq_map = zipmap(var.sqs_queue_names, var.dead_queue_names)
}


resource "aws_sqs_queue" "CloudTrail_SQS"{

    for_each                   = local.sqs_dlq_map
    name                       = each.key
    redrive_policy = jsonencode({
        deadLetterTargetArn    = aws_sqs_queue.CloudTrail_SQS_DLQ[each.key].arn
        maxReceiveCount        = 2 #var.max_receive_count
    })

    #tags = var.default_tags
    
}

resource "aws_sqs_queue" "CloudTrail_SQS_DLQ"{

    for_each                   = local.sqs_dlq_map
    name                       = each.value
   

    #tags = var.default_tags
}


resource "aws_sqs_queue_policy" "Cloudtrail_SQS_Policy" {
  for_each  = local.sqs_dlq_map
  queue_url = aws_sqs_queue.CloudTrail_SQS[each.key].id

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Id": "sqspolicy",
  "Statement": [
    {
      "Sid": "AllowSQSInvocation",
      "Effect": "Allow",
      "Principal": {"AWS":"*"},
      "Action": "sqs:*",
      "Resource": "${aws_sqs_queue.CloudTrail_SQS[each.key].arn}"
    }]
}
POLICY
}

resource "aws_sqs_queue_policy" "CloudTrail_SQS_DLQ"{
    for_each  = local.sqs_dlq_map
    queue_url = aws_sqs_queue.CloudTrail_SQS_DLQ[each.key].id

    policy = <<POLICY
{
  "Version": "2012-10-17",
  "Id": "sqspolicy",
  "Statement": [
    {
      "Sid": "DLQ Policy",
      "Effect": "Allow",
      "Principal": {"AWS":"*"},
      "Action": "sqs:*",
      "Resource": "${aws_sqs_queue.CloudTrail_SQS_DLQ[each.key].arn}"
    }]
}
POLICY
}

 

Комментарии:

1. ,большое вам спасибо за ваш ответ.. Я не возражаю против рефакторинга всего кода, если это приведет меня туда, где я хочу быть. Будет ли эта строка связывать каждый SQS с соответствующим мертвым запросом——- redrive_policy = jsonencode({ deadLetterTargetArn = aws_sqs_queue. CloudTrail_SQS_DLQ[каждый.ключ].arn

2. @биби я добавил DLQ, чтобы затем ответить

3. Спасибо вам за то, что уделили мне очень много времени. Я дам тебе обратную связь завтра

4. это сработало идеально

5. большое вам спасибо @Marcin