Terraform AWS: назначение SQS для Lambda не добавляется

У меня есть рабочий проект AWS, который я пытаюсь реализовать в Terraform.

На одном из шагов требуется лямбда-функция для запроса athena и возврата результатов в SQS (я использую этот модуль для лямбда вместо исходного ресурса). Вот код:


data "archive_file" "go_package" {
  type        = "zip"
  source_file = "./report_to_SQS_go/main"
  output_path = "./report_to_SQS_go/main.zip"
}


resource "aws_sqs_queue" "emails_queue" {
  name = "sendEmails_tf"
}

module "lambda_report_to_sqs" {
  source                 = "terraform-aws-modules/lambda/aws"
  function_name          = "report_to_SQS_Go_tf"
  handler                = "main"
  runtime                = "go1.x"
  create_package         = false
  local_existing_package = "./report_to_SQS_go/main.zip"
  attach_policy_json     = true
  policy_json = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect : "Allow"
        Action : [
          "dynamodb:*",
          "lambda:*",
          "logs:*",
          "athena:*",
          "cloudwatch:*",
          "s3:*",
          "sqs:*"
        ]
        Resource : ["*"]
      }
    ]
  })
  destination_on_success = aws_sqs_queue.emails_queue.arn
  timeout                = 200
  memory_size            = 1024
}

Код работает нормально и выдает желаемый результат; однако проблема в том, что SQS не отображается в качестве пункта назначения (хотя очередь обычно отображается в SQS и может отправлять/получать сообщения).

Я не думаю, что разрешения являются проблемой, потому что я могу успешно добавлять адресаты SQS вручную из консоли.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Переменная destination_on_success используется только в том случае, если вы также установили create_async_event_config как истину. Ниже извлечено из https://github.com/terraform-aws-modules/terraform-aws-lambda/blob/master

переменные.tf

############################
# Lambda Async Event Config
############################

variable "create_async_event_config" {
  description = "Controls whether async event configuration for Lambda Function/Alias should be created"
  type        = bool
  default     = false
}

variable "create_current_version_async_event_config" {
  description = "Whether to allow async event configuration on current version of Lambda Function (this will revoke permissions from previous version because Terraform manages only current resources)"
  type        = bool
  default     = true
}

.....

variable "destination_on_failure" {
  description = "Amazon Resource Name (ARN) of the destination resource for failed asynchronous invocations"
  type        = string
  default     = null
}

variable "destination_on_success" {
  description = "Amazon Resource Name (ARN) of the destination resource for successful asynchronous invocations"
  type        = string
  default     = null
}

main.tf

resource "aws_lambda_function_event_invoke_config" "this" {
  for_each = { for k, v in local.qualifiers : k => v if v != null && local.create && var.create_function && !var.create_layer && var.create_async_event_config }

  function_name = aws_lambda_function.this[0].function_name
  qualifier     = each.key == "current_version" ? aws_lambda_function.this[0].version : null

  maximum_event_age_in_seconds = var.maximum_event_age_in_seconds
  maximum_retry_attempts       = var.maximum_retry_attempts

  dynamic "destination_config" {
    for_each = var.destination_on_failure != null || var.destination_on_success != null ? [true] : []
    content {
      dynamic "on_failure" {
        for_each = var.destination_on_failure != null ? [true] : []
        content {
          destination = var.destination_on_failure
        }
      }

      dynamic "on_success" {
        for_each = var.destination_on_success != null ? [true] : []
        content {
          destination = var.destination_on_success
        }
      }
    }
  }
}

Таким образом, destination_on_success используется только в этом ресурсе, и эти ресурсы вызываются только при соблюдении нескольких условий. Ключевой из них var.create_async_event_config должен быть правдой.

Вы можете увидеть пример для этого здесь https://github.com/terraform-aws-modules/terraform-aws-lambda/blob/be6cf9701071bf807cd7864fbcc751ed2552e434/examples/async/main.tf

module "lambda_function" {
  source = "../../"

  function_name = "${random_pet.this.id}-lambda-async"
  handler       = "index.lambda_handler"
  runtime       = "python3.8"
  architectures = ["arm64"]

  source_path = "${path.module}/../fixtures/python3.8-app1"

  create_async_event_config = true
  attach_async_event_policy = true

  maximum_event_age_in_seconds = 100
  maximum_retry_attempts       = 1

  destination_on_failure = aws_sns_topic.async.arn
  destination_on_success = aws_sqs_queue.async.arn
}

Я знал, что такая переменная существует, но не думал, что это критично. В любом случае, установка значения true вызывает ошибку error putting Lambda Function Event Invoke Config (report_to_SQS_Go_tf:$LATEST): ResourceConflictException: The EventInvokeConfig for function [my-function-arn]:$LATEST could not be updated due to a concurrent update operation.

Mohamed Yasser 02.12.2022 17:28

Я разобрался: либо добавить create_current_version_async_event_config = false, либо вручную удалить функцию; terraform destroy почему-то не работает. Буду признателен, если у вас есть объяснение такому поведению.

Mohamed Yasser 02.12.2022 17:44

ваша первая ошибка выглядит так, как будто что-то еще также обновляло функцию, чем позже, у вас есть подробности об ошибке при запуске уничтожения

Chris Doyle 02.12.2022 18:01

Прошу прощения за неясность. Destroy возвращается успешно, но прямой запуск destroy, за которым следует apply, по-прежнему вызывает ошибку. Удаление функции вручную, а затем запуск terraform destroy && terraform apply не вызывает ошибку.

Mohamed Yasser 02.12.2022 18:07

Другие вопросы по теме