当前位置: 首页 > 知识库问答 >
问题:

Terraform多个云观察事件触发相同的lambda函数

仲孙鸿飞
2023-03-14

我已经在Terraform中设置了以下内容。所以有两条事件规则,上午8点开始\u事件,下午6点停止\u事件。

# Create cloudwatch event rules
resource "aws_cloudwatch_event_rule" "stop_ec2_event_rule" {
  name        = "stop-ec2-event-rule"
  description = "Stop EC2 instance at a specified time each day"
  schedule_expression = var.cloudwatch_schedule_stop
}

resource "aws_cloudwatch_event_rule" "start_ec2_event_rule" {
  name        = "start-ec2-event-rule"
  description = "Start EC2 instance at a specified time each day"
  schedule_expression = var.cloudwatch_schedule_start
}

每个事件都将一个操作传递给lambda

resource "aws_cloudwatch_event_target" "stop_ec2_event_rule_target" {
  rule      = aws_cloudwatch_event_rule.stop_ec2_event_rule.name
  target_id = "TriggerLambdaFunction"
  arn       = aws_lambda_function.lambda_rscheduler.arn
  input     = "{\"environment\":\"${var.environment}\", \"action\":\"stop\"}"
}

resource "aws_cloudwatch_event_target" "start_ec2_event_rule_target" {
  rule      = aws_cloudwatch_event_rule.start_ec2_event_rule.name
  target_id = "TriggerLambdaFunction"
  arn       = aws_lambda_function.lambda_rscheduler.arn
  input     = "{\"environment\":\"${var.environment}\", \"action\":\"start\"}"
}

这很有效


resource "aws_lambda_permission" "allow_cloudwatch" {
  statement_id  = "AllowExecutionFromCloudWatch"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.lambda_rscheduler.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.stop_ec2_event_rule.arn

我面临的问题是,我无法让Terraform将start\u事件与lambda函数相关联。我进入AWS控制台,可以手动将CloudWatch start\u事件触发器添加到lambda函数中。

如果我有start_event资源

resource "aws_lambda_permission" "allow_cloudwatch" {
  statement_id  = "AllowExecutionFromCloudWatch"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.lambda_rscheduler.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.start_ec2_event_rule.arn

它会抱怨语句\u id重复。

我需要类似terraform aws\u lambda\u event\u source\u映射的东西,但它只允许lambda函数从Kinesis、DynamoDB和SQS获取事件;而不是CloudWatch活动。

我如何告诉terraform将多个cloudwatch事件关联到同一个lambda函数;何时可以从AWS控制台手动执行?

共有1个答案

松智勇
2023-03-14

statement_id不是强制性的,因此您可以安全地将其从aws_lambda_permission中省略,terraform将自动为您生成唯一的id。您还可以使用count或for_each来为aws_lambda_permission节省一些输入。

例如,使用for_each可以将aws_lambda_permission定义为:

resource "aws_lambda_permission" "allow_cloudwatch" {
  
  for_each      = {for idx, v in [
      aws_cloudwatch_event_rule.stop_ec2_event_rule,
      aws_cloudwatch_event_rule.start_ec2_event_rule
  ]: idx => v}
  
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.lambda_rscheduler.function_name
  principal     = "events.amazonaws.com"
  source_arn    = each.value.arn
}

可以为aws\U cloudwatch\u event\u rule和aws\U cloudwatch\u event\u target编写类似版本,以便您的代码基于每个或计数的,无需重复复制和粘贴。

 类似资料:
  • 我需要用lambda和cloudwatch事件创建一个cloudformation模板,该模板将定期触发它。这是我的模板:

  • 我正在使用aws lambda函数将一个桶中上传的wav文件转换为mp3格式,然后将文件移动到另一个桶中。它工作正常。但触发有个问题。当我上传小的wav文件时,lambda函数被调用一次。但是当我上传一个大尺寸的wav文件时,这个功能会被触发多次。 我已经谷歌了这个问题,发现它是无状态的,所以它会被多次调用(不确定这个触发器是针对多次上传还是同一个上传)。 https://aws.amazon.c

  • 我将AWS S3触发器配置为带有PUT操作的lambda函数。 每2分钟上载100KB大小的.txt文件。 有时S3会以相同的事件和时间触发lambda两次。 触发器1: 触发器2: 我怎样才能避免这种情况呢?

  • 我实现了AWS Eventbridge规则和Lambda函数的基本组合作为其目标。假设该规则基于所有AWS自动缩放事件创建一个事件,并调用Lambda。当触发现有ASG的缩放操作时,此操作效果良好,但当创建具有相同前缀的新ASG时,规则不会做出反应。旧ASG名称:test-ASG-lc-123新ASG名称:test-ASG-lc-124 甚至可以使用通配符吗?

  • 我有一个 Blob 存储容器,其中配置了事件网格触发器(Blob 已创建)。我正在通过数据工厂加载此 blob 存储文件,很多时候,许多文件可能会在一次尝试中出现在此 blob 中。也许我们可以举一个20个文件的例子。 好消息是我的事件网格触发器启动了,函数app被调用。然而,我发现有时对于同一个文件,事件网格触发器被触发了不止一次。 在这20个文件中,很少有文件非常大,比如300 MB,但其他文

  • 触发AWS Lambda函数时遇到问题。 当我单击Test时,该函数工作得非常好,但我创建了一个新的计划规则,该规则每分钟触发Lambda函数。它工作一次,然后再也不会工作了。我还尝试使用Cron,结果相同。 日志应输出打印功能,但它们会读取以下内容: 我单击了“CloudWatch Events将为目标添加必要的权限,以便在触发此规则时调用它们”,所以我怀疑我的权限不是问题。 顺便说一句,我已经