如何使用 Lambda 自动添加CloudWatch所有实例磁盘告警及 SNS 通知
2024/12/17 21:33:06
本文主要是介绍如何使用 Lambda 自动添加CloudWatch所有实例磁盘告警及 SNS 通知,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
利用Lambda轻松实现EC2实例监控
最近新增了一些服务器,因为每个服务器的基础监控都是要做的。我就想,如何能够快速便捷的方式把这些基础指标都监控上呢?本文将详细介绍如何通过Lambda自动为所有EC2实例添加CloudWatch磁盘告警,并在磁盘利用率超过阈值时,通过SNS主题发送通知。
准备工作
在开始前,我们需要准备:
- AWS账号:开通一个AWS账号。
- SNS主题:在SNS上创建一个主题,并添加订阅者。订阅方式可以是邮件、短信等。
- VPC ID:登录VPC控制台获取VPC ID。
- Lambda:需要创建一个Lambda。
创建SNS主题
接下来,我们需要在AWS SNS上创建一个主题,并将订阅者添加到主题中。这些订阅者将会接收磁盘使用超过阈值时的通知。我们可以选择电子邮件、短信等通知方式。
- 登录到 Amazon SNS 控制台。
- 单击左侧面板上的“主题”,然后单击“创建主题”。
- 输入主题名称和主题显示名称,单击“创建主题”。
- 在主题页面上,单击“订阅”,选择希望接收通知的通知方式。
- 根据选定的订阅类型输入相关信息,单击“创建订阅”。
- 在主题页面上,您将看到已创建的订阅。
举个例子,如果我们选择“邮件”作为订阅方式: - 在“电子邮件订阅”下,输入接收通知的电子邮件地址。
- 单击“创建订阅”。
- 您应会收到一封来自AWS通知的验证电子邮件。请按照电子邮件中的说明进行验证。
- 一旦验证通过,该订阅将变为“已验证”状态。
现在,当CloudWatch告警触发并调用SNS主题时,验证的电子邮件地址将收到有关警报的电子邮件通知。我们也可以添加多个订阅以接收通过不同渠道的通知,例如电子邮件、短信等。 添加订阅者后,我们可以在SNS主题的“概述”页查看订阅的详细信息和状态。在测试Lambda函数时,这有助于确保订阅设置正确和通知能正常发送。
创建Lambda函数
接下来,我们可以在Lambda控制台创建一个新的Lambda函数。
- 访问 Amazon Lambda 控制台,点击“创建函数”。
- 选择“从头开始” ,输入函数名称,如“create_cloudwatch_alarm_for_ec2_disk_usage”。
- 选择Python作为运行环境,选择 创建具有基本 Lambda 权限的新角色。
- 点击“创建函数”。
编写Lambda函数代码
代码我已经写好了,各位大佬收好。代码功能是为所有EC2实例设置CloudWatch磁盘告警,当磁盘利用率超过阈值时,通过SNS主题发送通知。
- 连接EC2客户端。
- 获取VPC中运行的EC2实例列表。
- 遍历实例创建CloudWatch磁盘使用百分比告警。默认阈值是80%。
- 告警触发SNS主题“you_sns_arn”。
将下面代码复制后进行部分修改。然后替换掉原有代码后,然后保存并部署。
下面是具体代码内容:
''' Author : Wenlong Xue Date : 2023-02-27 13:35 LastEditors : Wenlong Xue LastEditTime : 2023-02-27 17:52 Description : 为 VPC 中的 EC2 实例创建磁盘使用百分比的 CloudWatch 告警,并在磁盘使用超过阈值时发送通知到 SNS 主题 ''' import boto3 def lambda_handler(event, context): # 连接到 EC2 客户端 ec2 = boto3.client('ec2') # 获取 VPC 中运行中的实例列表 response = ec2.describe_instances( Filters=[ { 'Name': 'vpc-id', 'Values': ['vpc-xxxxxx'] # 修改VPC ID }, { 'Name': 'instance-state-name', 'Values': ['running'] } ] ) # 遍历实例并为磁盘使用百分比创建 CloudWatch 告警 for reservation in response['Reservations']: for instance in reservation['Instances']: # 获取实例 ID 和 Name 标签 instance_id = instance['InstanceId'] instance_name = '' for tag in instance['Tags']: if tag['Key'] == 'Name': instance_name = tag['Value'] break # 创建磁盘使用百分比的 CloudWatch 告警 cloudwatch = boto3.client('cloudwatch') cloudwatch.put_metric_alarm( AlarmName='{}-磁盘使用百分比'.format(instance_name), AlarmDescription='{} - 磁盘使用百分比'.format(instance_name), ActionsEnabled=True, AlarmActions=['you_sns_arn'], # 修改sns主题,如:arn:aws-cn:sns:cn-north-1:xxxxx:HighDiskUsed MetricName='disk_used_percent', # 根据情况修改 Namespace='CWAgent', # 根据情况修改 Dimensions=[ { 'Name': 'InstanceId', 'Value': instance_id } ], Statistic='Maximum', Period=300, EvaluationPeriods=1, Threshold=80.0, ComparisonOperator='GreaterThanOrEqualToThreshold' )
给IAM角色添加权限
因为 创建具有基本 Lambda 权限的新角色 的权限并不完整,所以我们要把代码中所要用到的权限给到这个新角色。
首先,Lambda中找到这个觉得然后给他添加对应的权限。
- 找到创建的Lambda 函数。
- 选择函数汇总的配置–权限。
- 找到执行角色,并点击角色名称连接。
- 点击添加权限,选择附加策略。
- 添加
CloudWatchFullAccess
和AmazonEC2ReadOnlyAccess
权限
最后权限如下:
注意
{{< alert theme=“warning” dir=“ltr” >}}
⚠️ 若提示确少什么权限就补充什么权限。
{{< /alert >}}
测试函数
现在,我们已经创建Lambda函数和SNS主题,并将订阅者添加到主题。我们可以测试Lambda函数功能。
- 我们可以手动运行测试来观察 CloudWatch告警项有没有被添加。
- 我们也可以进行添加触发器。如:固定时间段运行一次,来遍历新加的服务器。然后添加告警项。
常见问题及解决方案
{{< notice info “常见问题及解决方案” >}}
Q1: 没收到SNS通知怎么办?
A1: 确认订阅邮箱是否正确。检查AWS账号是否有权限向SNS发送通知。
Q2: 如何修改磁盘使用阈值?
A2: 编辑Lambda函数代码,更改"Threshold"的值。
Q3: CloudWatch的告警项中显示数据不足怎么办?
A3: 查看CloudWatch中原本磁盘的指标名称,并修改Lambda函数代码对应的值:MetricName=‘disk_used_percent’;Namespace=‘CWAgent’
{{< /notice >}}
参考资料
- AWS Lambda文档: https://docs.aws.amazon.com/lambda/
- AWS CloudWatch文档: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/
- AWS SNS文档: https://docs.aws.amazon.com/sns/index.html
作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/230506425079/
相关话题:https://www.cnsre.cn/tags/lambda/
这篇关于如何使用 Lambda 自动添加CloudWatch所有实例磁盘告警及 SNS 通知的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-21Svg Sprite Icon教程:轻松入门与应用指南
- 2024-12-20Excel数据导出实战:新手必学的简单教程
- 2024-12-20RBAC的权限实战:新手入门教程
- 2024-12-20Svg Sprite Icon实战:从入门到上手的全面指南
- 2024-12-20LCD1602显示模块详解
- 2024-12-20利用Gemini构建处理各种PDF文档的Document AI管道
- 2024-12-20在 uni-app 中怎么实现 WebSocket 的连接、消息发送和接收?-icode9专业技术文章分享
- 2024-12-20indices.breaker.request.limit 默认是多少?-icode9专业技术文章分享
- 2024-12-20怎么查看 Elasticsearch 的内存占用情况?-icode9专业技术文章分享
- 2024-12-20查看es 占用内存的进程有哪些方法?-icode9专业技术文章分享