У меня есть рабочий проект 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 вручную из консоли.





Переменная 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
}
Я разобрался: либо добавить create_current_version_async_event_config = false, либо вручную удалить функцию; terraform destroy почему-то не работает. Буду признателен, если у вас есть объяснение такому поведению.
ваша первая ошибка выглядит так, как будто что-то еще также обновляло функцию, чем позже, у вас есть подробности об ошибке при запуске уничтожения
Прошу прощения за неясность. Destroy возвращается успешно, но прямой запуск destroy, за которым следует apply, по-прежнему вызывает ошибку. Удаление функции вручную, а затем запуск terraform destroy && terraform apply не вызывает ошибку.
Я знал, что такая переменная существует, но не думал, что это критично. В любом случае, установка значения 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.