使用 terraform 创建 lambda 函数

Posted

技术标签:

【中文标题】使用 terraform 创建 lambda 函数【英文标题】:Use terraform to create a lambda function 【发布时间】:2021-07-18 05:29:24 【问题描述】:

在下面的示例中,我们可以看到 lambda 函数的代码,该函数根据 cpu 利用率在 cloudwatch 中创建警报。

import boto3
import collections
from datetime import datetime
import calendar

def lambda_handler(event, context):

    client = boto3.client('cloudwatch')

    alarm = client.put_metric_alarm(
    AlarmName='CPU Alarm',
    MetricName='CPUUtilization',
    Namespace='AWS/EC2',
    Statistic='Average',
    ComparisonOperator='GreaterThanOrEqualToThreshold',
    Threshold=70.0,
    Period=10,
    EvaluationPeriods=1,
    Dimensions=[
        
            'Name': 'InstanceId',
            'Value': 'instance_id'
        
    ],
    Unit='Percent',
    ActionsEnabled=True,
    AlarmActions=['arn:aws:sns:us-east-1:xxxxxxxxxxxx:CloudWatch'])

我很难理解如何在 terraform 中创建它。有人可以帮忙吗?关键是我需要它工作,以便在实例启动后立即创建警报,这就是触发 lambda 的事件。

我“认为”我的 .tf 文件看起来像这样...?

resource "aws_cloudwatch_metric_alarm" "CPU Alarm" 
  alarm_name                = "CPU Alarm"
  comparison_operator       = "GreaterThanOrEqualToThreshold"
  evaluation_periods        = "1"
  metric_name               = "CPUUtilization"
  namespace                 = "AWS/EC2"
  period                    = "10"
  statistic                 = "Average"
  threshold                 = "70"
  alarm_description         = "This metric monitors ec2 cpu utilization"
  insufficient_data_actions = []

我很想让它工作,这样每个启动的实例都会创建一个特定的指标来监控其 CPU。有没有人这样做过并且能够提供帮助...

谢谢。

【问题讨论】:

那么您在 TF 中创建的这个警报应该会触发您有问题的 lambda 函数? Lambda 函数将在 tf 中创建,并且 lambda 将由 EC2 中的“运行”状态触发。 lambda 函数创建 cpu 警报。 您是否正在管理您想要使用 Terraform 创建警报的 EC2 实例?如果是,您不能将aws_cloudwatch_metric_alarmfor_each 结合起来创建所需的警报吗? 我同意 yvesonline 所说的。如果 EC2 实例是由 Terraform 创建的,那么应该可以让 Terraform 创建 CW 警报。如果 EC2 实例是以其他方式创建的,并且您确实需要 Lambda 来配置 CW 警报,那么我建议查看可以触发 Lambda 的 EC2 状态更改事件。它位于最新文档中的 AWS EventBridge 下。这将允许您在启动实例时触发您的函数(使用实例 ID 和状态)。 【参考方案1】:

您必须创建一些元素并相互关联才能实现您的目标。

    创建aws_cloudwatch_event_rule 以捕获进入运行状态的实例。可以使用以下规则:

  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": 
    "state": ["running"]
  

    设置 aws_lambda_permission 以便规则可以触发您的 lambda。

    使用 aws_cloudwatch_event_target 将您的 lambda 函数设置为规则的目标。

    您的函数在触发时将为实例创建警报

根据您的具体用例,如果实例从停止状态变为运行状态,也会触发规则。您的 lambda 应该考虑,并检查实例是否存在现有警报。

其他可能性是使用 CloudTrial 试验捕获 API 调用 create-instance,然后设置警报。

【讨论】:

答案无关紧要。 感谢您的尝试,我尝试了一些由您提供的链接触发的进一步研究,但实际上此响应没有帮助。 L 如果您希望 Lambda 在实例启动时运行,CW 事件绝对有用。

以上是关于使用 terraform 创建 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

terraform/aws lambda 函数访问在 s3 上被拒绝

Terraform 中的相对路径

使用 Terraform 将 AWS Lambda 日志写入 CloudWatch 日志组

使用 terraform 设置由预定事件源触发的 lambda 函数

使用 terraform 设置由预定事件源触发的 lambda 函数

使用 terraform 部署多个 lambda 函数