首页 后端开发 Python教程 告别孤立快照:使用 Serverless、Terraform 和 AWS EventBridge 自动清理!

告别孤立快照:使用 Serverless、Terraform 和 AWS EventBridge 自动清理!

Oct 30, 2024 pm 06:03 PM

Say Goodbye to Orphaned Snapshots: Automate Cleanup with Serverless, Terraform, and 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 函数

验证解决方案是否有效:

  1. 手动触发事件(可选):对于初始测试,从 AWS Lambda 控制台手动触发 Lambda 函数。
  2. 监控 CloudWatch 日志: Lambda 函数将日志写入 CloudWatch,您可以在其中查看条目以验证快照删除。
  3. 根据需要调整计划:修改schedule_expression以设置快照清理的自定义频率。

总结
通过结合 Python (Boto3)TerraformAWS EventBridge,我们创建了一个完全自动化、无服务器的解决方案来清理孤立的 EBS 快照。这种设置不仅降低了云成本,还促进了整洁、高效的 AWS 环境。通过计划调用,您可以放心,孤立资源将始终被删除。

在您自己的 AWS 账户中尝试此解决方案,体验云资源管理自动化的优势!

以上是告别孤立快照:使用 Serverless、Terraform 和 AWS EventBridge 自动清理!的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1676
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
Python与C:学习曲线和易用性 Python与C:学习曲线和易用性 Apr 19, 2025 am 12:20 AM

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

学习Python:2小时的每日学习是否足够? 学习Python:2小时的每日学习是否足够? Apr 18, 2025 am 12:22 AM

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

Python vs.C:探索性能和效率 Python vs.C:探索性能和效率 Apr 18, 2025 am 12:20 AM

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

Python vs. C:了解关键差异 Python vs. C:了解关键差异 Apr 21, 2025 am 12:18 AM

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

Python标准库的哪一部分是:列表或数组? Python标准库的哪一部分是:列表或数组? Apr 27, 2025 am 12:03 AM

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

Python:自动化,脚本和任务管理 Python:自动化,脚本和任务管理 Apr 16, 2025 am 12:14 AM

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

科学计算的Python:详细的外观 科学计算的Python:详细的外观 Apr 19, 2025 am 12:15 AM

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

Web开发的Python:关键应用程序 Web开发的Python:关键应用程序 Apr 18, 2025 am 12:20 AM

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

See all articles