如何将 AWS cloudwatch 事件添加到基于具有 terraform 的容器映像的 aws_lambda_function?

Posted

技术标签:

【中文标题】如何将 AWS cloudwatch 事件添加到基于具有 terraform 的容器映像的 aws_lambda_function?【英文标题】:How can I add a AWS cloudwatch event to a aws_lambda_function which is based on a container image with terraform? 【发布时间】:2021-09-13 22:01:31 【问题描述】:

我想实现我的基于 ecr 中的 docker 映像的 lambda 函数由预定的 cloudwatch 事件触发。

问题是我无法将模块“lambda_function_container_image”中的 function_name myFunction 附加到 aws_lambda_permission

当我有一个普通的 lambda 函数时,它可以工作,但不适用于来自图像 URI 的 lambda 函数:

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)"

基于容器镜像的 Lambda 函数:

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"

Lambda 权限:

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】:

您需要通过您正在使用的module 引用function_name。根据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

  [...]

【讨论】:

我也这么认为,但行不通。错误:引用未声明的资源function_name = lambda_function_container_image.myFunction 也试过 function_name = lambda_function_container_image.myFunction.function_name 。当我尝试lambda_function_container_image.lambda_function_name 时,我得到*对未声明资源的引用。我似乎在写作,但不知何故无法工作。 @Schwenk 你可以试试module.lambda_function_container_image.lambda_function_name 有效!这就是如何使用 moduleresource 中的函数名的区别。 @Schwenk 我已经更新了我的答案。请接受。

以上是关于如何将 AWS cloudwatch 事件添加到基于具有 terraform 的容器映像的 aws_lambda_function?的主要内容,如果未能解决你的问题,请参考以下文章

Aws Lambda 收集 CloudWatch 事件

多个 cloudwatch 事件规则可以触发 aws 目标吗

AWS Elastic Beanstalk:将自定义日志添加到 CloudWatch?

如何定义AWS MetricFilter FilterPattern以匹配CloudWatch中的JSON格式的日志事件?

AWS CloudWatch 中的指标、日志和事件之间有啥区别? [关闭]

向 AWS CloudWatch 添加可用磁盘空间指标