時間の経過とともに、AWS アカウントには不要になったリソースが蓄積される可能性がありますが、引き続きコストが発生します。一般的な例の 1 つは、ボリュームが削除された後に残された孤立した 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 は、AWS リソースを定義および管理するための人気のある Infrastructure as Code (IaC) ツールです。
macOS: brew install terraform
Windows: Terraform インストーラー
Linux: バイナリをダウンロードし、/usr/local/bin に移動します。
インストールを確認します:
terraform -version
Terraform と Lambda が AWS サービスで認証できるように、アクセス キーを使用して AWS CLI を設定します。
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 にデプロイします。さらに、定期的なスケジュールで Lambda をトリガーする EventBridge ルールを設定します。
Terraform のセットアップとプロバイダーの構成
このセクションでは、S3 でのリモート状態管理のセットアップを含め、Terraform を構成します。
注: terraform -version の出力に従って required_version 値を変更します。
aws --version
Lambda の IAM ロールとポリシー
この IAM 設定は、Lambda が EC2 と CloudWatch にアクセスするための権限を設定し、スナップショットの削除とログ記録を有効にします。
terraform -version
Lambda 関数のパッケージ化とデプロイ
ここでは、Python コードをパッケージ化し、Lambda 関数としてデプロイします。
aws configure
Lambda 呼び出しの EventBridge ルール
AWS EventBridge を使用すると、Lambda 関数のスケジュールされたトリガーまたはイベントベースのトリガーを作成できます。ここでは、24 時間ごとなどのスケジュールに従って Lambda 関数を呼び出すように EventBridge を設定します。 EventBridge とスケジュールされたイベントの詳細については、こちらの AWS ドキュメントをご覧ください。
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 アカウントでこのソリューションを試し、クラウド リソース管理の自動化のメリットを体験してください!
以上が孤立したスナップショットに別れを告げましょう: サーバーレス、Terraform、AWS EventBridge を使用してクリーンアップを自動化します!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。