Как добавить событие AWS cloudwatch в функцию aws_lambda_function, основанную на образе контейнера с terraform?

avatar
Schwenk
1 июля 2021 в 20:58
180
1
0

Я хочу, чтобы моя лямбда-функция, основанная на образе докера в ECR, запускалась запланированным событием cloudwatch.

The problem is that I can not attach the function_name myFunction from the module "lambda_function_container_image" to the aws_lambda_permission.

Это работает, когда у меня есть обычная лямбда-функция, но не с лямбда-функцией из изображения URI:

resource "aws_lambda_function" "myFunction" {
 
  function_name = "myFunction"
  role          = aws_iam_role.lambda_execution_role.arn
  handler       = "exports.handler"
  runtime       = "python3.8"
}

У меня есть следующий код:

Событие AWS CloudWatch:

resource "aws_cloudwatch_event_rule" "every_five_minutes" {
    name = "every-five-minutes"
    description = "Fires every five minutes"
    schedule_expression = "rate(5 minutes)"
}

Лямбда-функция на основе образа контейнера:

module "lambda_function_container_image" {
  source = "terraform-aws-modules/lambda/aws"

  function_name = "myFunction"
  description   = "awesome function"

  create_package = false

  image_uri    = "${data.aws_caller_identity.current.account_id}.dkr.ecr${var.aws_region}.amazonaws.com/container_name"
  package_type = "Image"
}

Лямбда-разрешение:

resource "aws_lambda_permission" "allow_cloudwatch_to_call_myFunction" {
  statement_id  = "AllowExecutionFromCloudWatch"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.myFunction.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.every_five_minutes.arn
}

Я получаю следующую ошибку с текущим aws_lambda_permission:

Сообщение об ошибке:

Error: Reference to undeclared resource
-> points to function_name in aws_lambda_permission
Источник

Ответы (1)

avatar
Jens
1 июля 2021 в 21:15
2

Вам необходимо сослаться на function_name через module, который вы используете. Согласно документации terraform-aws-modules/lambda/aws модуль имеет выходные данные lambda_function_name.

Это означает, что следующее должно работать для вас:

resource "aws_lambda_permission" "allow_cloudwatch_to_call_myFunction" {
  [...]

  function_name = module.lambda_function_container_image.lambda_function_name

  [...]
}
Schwenk
2 июля 2021 в 05:10
0

Я тоже так думал, но не работает. Ошибка: Ссылка на необъявленный ресурс. function_name = lambda_function_container_image.myFunction также пробовал function_name = lambda_function_container_image.myFunction.function_name . И когда я пытаюсь lambda_function_container_image.lambda_function_name, я получаю *Ссылка на необъявленный ресурс. Я вроде бы пишу, но не работаю как-то.

Jens
2 июля 2021 в 06:58
1

@Schwenk, не могли бы вы попробовать module.lambda_function_container_image.lambda_function_name.

Schwenk
2 июля 2021 в 10:55
0

Работает! В этом разница, как использовать имя функции из модуля или ресурса.

Jens
2 июля 2021 в 12:03
1

@Schwenk Я обновил свой ответ. Пожалуйста, примите это.