ホームページ  >  記事  >  バックエンド開発  >  孤立したスナップショットに別れを告げましょう: サーバーレス、Terraform、AWS EventBridge を使用してクリーンアップを自動化します!

孤立したスナップショットに別れを告げましょう: サーバーレス、Terraform、AWS EventBridge を使用してクリーンアップを自動化します!

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 18:03:03388ブラウズ

Say Goodbye to Orphaned Snapshots: Automate Cleanup with Serverless, Terraform, and AWS EventBridge!

時間の経過とともに、AWS アカウントには不要になったリソースが蓄積される可能性がありますが、引き続きコストが発生します。一般的な例の 1 つは、ボリュームが削除された後に残された孤立した 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 は、AWS リソースを定義および管理するための人気のある Infrastructure as Code (IaC) ツールです。

macOS: brew install terraform
Windows: Terraform インストーラー
Linux: バイナリをダウンロードし、/usr/local/bin に移動します。

インストールを確認します:

terraform -version

ステップ 2: AWS アクセスの構成

Terraform と Lambda が AWS サービスで認証できるように、アクセス キーを使用して AWS CLI を設定します。

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 にデプロイします。さらに、定期的なスケジュールで 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}

ステップ 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 アカウントでこのソリューションを試し、クラウド リソース管理の自動化のメリットを体験してください!

以上が孤立したスナップショットに別れを告げましょう: サーバーレス、Terraform、AWS EventBridge を使用してクリーンアップを自動化します!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。