隨著時間的推移,AWS 帳戶可能會累積不再需要的資源,但會繼續產生成本。一個常見的例子是刪除磁碟區後留下的孤立 EBS 快照。手動管理這些快照可能非常繁瑣且成本高昂。
本指南介紹如何在 AWS Lambda 函數中使用 Python (Boto3) 和 Terraform 自動清理孤立的 EBS 快照,然後根據計畫或事件使用 AWS EventBridge 觸發清理。
最終,您將擁有完整的無伺服器解決方案,以保持 AWS 環境清潔且經濟高效。
首先,讓我們確保安裝了必要的工具。
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
使用存取金鑰配置您的 AWS CLI,以允許 Terraform 和 Lambda 使用 AWS 服務進行驗證。
從您的 AWS 帳戶(AWS IAM 控制台)取得存取金鑰。
設定 AWS CLI:
aws configure
依照指示輸入您的存取金鑰、秘密存取金鑰、預設區域(例如 us-east-1)和輸出格式(例如 json)。
此處提供了建立 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}
使用 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}
定義基礎設施後,初始化並套用 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" }
驗證解決方案是否有效:
總結
透過結合 Python (Boto3)、Terraform 和 AWS EventBridge,我們創建了一個完全自動化、無伺服器的解決方案來清理孤立的 EBS 快照。這種設定不僅降低了雲端成本,還促進了整潔、高效的 AWS 環境。透過計劃調用,您可以放心,孤立資源將始終被刪除。
在您自己的 AWS 帳戶中嘗試此解決方案,體驗雲端資源管理自動化的優勢!
以上是告別孤立快照:使用 Serverless、Terraform 和 AWS EventBridge 自動清理!的詳細內容。更多資訊請關注PHP中文網其他相關文章!