告别孤立快照:使用 Serverless、Terraform 和 AWS EventBridge 自动清理!
随着时间的推移,AWS 账户可能会积累不再需要的资源,但会继续产生成本。一个常见的例子是删除卷后留下的孤立 EBS 快照。手动管理这些快照可能非常繁琐且成本高昂。
本指南介绍如何在 AWS Lambda 函数中使用 Python (Boto3) 和 Terraform 自动清理孤立的 EBS 快照,然后根据计划或事件使用 AWS EventBridge 触发清理。
最终,您将拥有完整的无服务器解决方案,以保持 AWS 环境清洁且经济高效。
第 1 步:安装 AWS CLI 和 Terraform
首先,让我们确保安装了必要的工具。
AWS CLI
AWS CLI 允许通过命令行访问 AWS 服务。根据您的操作系统安装:
macOS:brew install awscli
Windows: AWS CLI 安装程序
Linux: 使用包管理器(例如,对于 Ubuntu 为 sudo apt install awscli)。
验证安装:
aws --version
地形
Terraform 是一种流行的基础设施即代码 (IaC) 工具,用于定义和管理 AWS 资源。
macOS:brew install terraform
Windows: Terraform 安装程序
Linux: 下载二进制文件并将其移至 /usr/local/bin。
验证安装:
terraform -version
步骤 2:配置 AWS 访问
使用访问密钥配置您的 AWS CLI,以允许 Terraform 和 Lambda 使用 AWS 服务进行身份验证。
从您的 AWS 账户(AWS IAM 控制台)获取访问密钥。
配置 AWS CLI:
aws configure
按照提示输入您的访问密钥、秘密访问密钥、默认区域(例如 us-east-1)和输出格式(例如 json)。
第 3 步:用于孤立快照清理的 Python 代码
此处提供了创建 Lambda 函数的分步说明。
此 Lambda 函数使用 AWS 的 Python SDK Boto3 来列出所有 EBS 快照,检查其关联的卷状态,并删除卷不再可用的快照。完整的功能代码如下:
import boto3 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): ec2_cli = boto3.client("ec2") response = ec2_cli.describe_snapshots(OwnerIds=["self"], DryRun=False) snapshot_id = [] for each_snapshot in response["Snapshots"]: try: volume_stat = ec2_cli.describe_volume_status( VolumeIds=[each_snapshot["VolumeId"]], DryRun=False ) except ec2_cli.exceptions.ClientError as e: if e.response["Error"]["Code"] == "InvalidVolume.NotFound": snapshot_id.append(each_snapshot["SnapshotId"]) else: raise e if snapshot_id: for each_snap in snapshot_id: try: ec2_cli.delete_snapshot(SnapshotId=each_snap) logger.info(f"Deleted SnapshotId {each_snap}") except ec2_cli.exceptions.ClientError as e: return { "statusCode": 500, "body": f"Error deleting snapshot {each_snap}: {e}", } return {"statusCode": 200}
第 4 步:无服务器基础设施的 Terraform 配置
使用 Terraform,我们将创建 Lambda 函数、IAM 角色和策略以将此脚本部署到 AWS。此外,我们将设置一个 EventBridge 规则来定期触发 Lambda。
Terraform 设置和提供程序配置
本部分配置 Terraform,包括在 S3 中设置远程状态管理。
注意: 根据 terraform -version 输出更改 required_version 值。
aws --version
Lambda 的 IAM 角色和策略
此 IAM 配置为 Lambda 设置访问 EC2 和 CloudWatch 的权限,从而启用快照删除和日志记录。
terraform -version
打包和部署 Lambda 函数
在这里,我们打包 Python 代码并将其部署为 Lambda 函数。
aws configure
Lambda 调用的 EventBridge 规则
AWS EventBridge 允许您为 Lambda 函数创建计划触发器或基于事件的触发器。在这里,我们将配置 EventBridge 以按计划(例如每 24 小时)调用我们的 Lambda 函数。您可以在此处的 AWS 文档中了解有关 EventBridge 和计划事件的更多信息。
import boto3 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): ec2_cli = boto3.client("ec2") response = ec2_cli.describe_snapshots(OwnerIds=["self"], DryRun=False) snapshot_id = [] for each_snapshot in response["Snapshots"]: try: volume_stat = ec2_cli.describe_volume_status( VolumeIds=[each_snapshot["VolumeId"]], DryRun=False ) except ec2_cli.exceptions.ClientError as e: if e.response["Error"]["Code"] == "InvalidVolume.NotFound": snapshot_id.append(each_snapshot["SnapshotId"]) else: raise e if snapshot_id: for each_snap in snapshot_id: try: ec2_cli.delete_snapshot(SnapshotId=each_snap) logger.info(f"Deleted SnapshotId {each_snap}") except ec2_cli.exceptions.ClientError as e: return { "statusCode": 500, "body": f"Error deleting snapshot {each_snap}: {e}", } return {"statusCode": 200}
第 5 步:应用 Terraform 配置
定义基础设施后,初始化并应用 Terraform 配置:
terraform { required_version = ">=1.5.6" required_providers { aws = { source = "hashicorp/aws" version = "~> 5.72.0" } } backend "s3" { bucket = "terraform-state-files-0110" key = "delete-orphan-snapshots/terraform.tfstate" region = "us-east-1" dynamodb_table = "tf_state_file_locking" } } provider "aws" { region = "us-east-1" }
第 6 步:测试和监控 Lambda 函数
验证解决方案是否有效:
- 手动触发事件(可选):对于初始测试,从 AWS Lambda 控制台手动触发 Lambda 函数。
- 监控 CloudWatch 日志: Lambda 函数将日志写入 CloudWatch,您可以在其中查看条目以验证快照删除。
- 根据需要调整计划:修改schedule_expression以设置快照清理的自定义频率。
总结
通过结合 Python (Boto3)、Terraform 和 AWS EventBridge,我们创建了一个完全自动化、无服务器的解决方案来清理孤立的 EBS 快照。这种设置不仅降低了云成本,还促进了整洁、高效的 AWS 环境。通过计划调用,您可以放心,孤立资源将始终被删除。
在您自己的 AWS 账户中尝试此解决方案,体验云资源管理自动化的优势!
以上是告别孤立快照:使用 Serverless、Terraform 和 AWS EventBridge 自动清理!的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

每天学习Python两个小时是否足够?这取决于你的目标和学习方法。1)制定清晰的学习计划,2)选择合适的学习资源和方法,3)动手实践和复习巩固,可以在这段时间内逐步掌握Python的基本知识和高级功能。

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。

Python在科学计算中的应用包括数据分析、机器学习、数值模拟和可视化。1.Numpy提供高效的多维数组和数学函数。2.SciPy扩展Numpy功能,提供优化和线性代数工具。3.Pandas用于数据处理和分析。4.Matplotlib用于生成各种图表和可视化结果。

Python在Web开发中的关键应用包括使用Django和Flask框架、API开发、数据分析与可视化、机器学习与AI、以及性能优化。1.Django和Flask框架:Django适合快速开发复杂应用,Flask适用于小型或高度自定义项目。2.API开发:使用Flask或DjangoRESTFramework构建RESTfulAPI。3.数据分析与可视化:利用Python处理数据并通过Web界面展示。4.机器学习与AI:Python用于构建智能Web应用。5.性能优化:通过异步编程、缓存和代码优
