【コスト削減】不要なスナップショットを一括で削除するスクリプトを作ってみた

記事タイトルとURLをコピーする

こんにちは! エンタープライズクラウド部技術2課の日高です。

本日は以前公開した「【コスト削減】全リージョンのスナップショットからAMIとEBSに紐付けのないスナップショットを特定する」に関連するブログになります。

blog.serverworks.co.jp

上記のブログを読んで頂いた方から「スナップショットを特定したはいいものの量が多く削除する手間が発生する」とコメントをいただきました。
なので、不要なスナップショットを一括で削除するスクリプトを作ってみました。

前提と作成したスクリプト解説

前提

  • AWS CLIがインストールされている
  • スイッチロールできる設定が済まされている(AWS CLI の設定 (~/.aws/config ファイル) にて、ロールの情報が設定されている)
  • 実行環境のOSがUnix系

※スイッチロールではなく、デフォルトに設定されているアカウントでスクリプトを実行したい場合は、スクリプトの「PROFILE="指定してください"」と「--profile $PROFILE」を削除して利用してください。

作成したスクリプト

指定したリージョンにある削除対象のスナップショットIDを配列にいれることで、一括でスナップショットを削除することができます。

#!/bin/bash -eu

# スナップショットIDのリストを含む配列
SNAPSHOT_LIST=(スナップショットID① スナップショットID②)

# リージョンを指定(例: ap-northeast-1)
REGION="ap-northeast-1"

# AWS CLIプロファイル名を指定
PROFILE="指定してください"

# スナップショットIDを読み取り、それぞれを削除
for snapshot_id in "${SNAPSHOT_LIST[@]}"; do
    echo "Deleting snapshot: $snapshot_id"
    aws ec2 delete-snapshot --snapshot-id $snapshot_id --region $REGION --profile $PROFILE
done

echo "Completed deleting snapshots."

利用方法

準備

  • 上記のスクリプトを実行するフォルダ配下に作成する。

※この際SNAPSHOT_LISTregionprofileはご自身が実行したいものに書き換えてください。

実行コマンド

  • 下記コマンドを実行します。
  • bash <保存時のスクリプト名>
    • 私の場合は「delete_snapshots.sh」で保存しているのでbash delete_snapshots.shが実行コマンドになります。

スクリプトの実行結果

実行する前のマネジメントコンソールの状態

今回削除の対象とするスナップショットは、下記画像のものです。
東京リージョンに6つのスナップショットがあります。

スクリプトの実行と実行結果

bash delete_snapshots.sh でスクリプトを実行すると下記のような出力結果になります。(私の場合は「delete_snapshots.sh」でスクリプトを保存しているため)

無事削除できていることをマネジメントコンソールで確認できました。

スクリプトの詳細

スクリプトの解説をします。

#!/bin/bash -eu

# スナップショットIDのリストを含む配列
SNAPSHOT_LIST=(スナップショットID① スナップショットID②)

# リージョンを指定(例: ap-northeast-1)
REGION="ap-northeast-1"

# AWS CLIプロファイル名を指定
PROFILE="指定してください"

# スナップショットIDを読み取り、それぞれを削除
for snapshot_id in "${SNAPSHOT_LIST[@]}"; do
    echo "Deleting snapshot: $snapshot_id"
    aws ec2 delete-snapshot --snapshot-id $snapshot_id --region $REGION --profile $PROFILE
done

echo "Completed deleting snapshots."

#!/bin/bash -eu

  • この行はshebang(シェバング)として知られるもので、このスクリプトを実行するときに、どのインタープリタを使用するかを指定します。ここでは、bashシェルを使ってスクリプトを実行します。
  • -eu オプションは、スクリプト内での未定義変数の使用やコマンドのエラーが発生した場合に、スクリプトを終了するという意味です。

SNAPSHOT_LIST=(スナップショットID① スナップショットID②)

  • スナップショットIDを格納する配列を作成します。
  • 削除したいスナップショットのIDをこの配列に追加します。

REGION="ap-northeast-1"

  • 削除したいリージョンを指定するための変数です。
  • 実際のリージョン名(例: "us-west-1")に置き換えてください。

PROFILE="指定してください"

  • 使用したいAWSプロファイルの名前を指定する変数です。
  • AWS CLIで設定したプロファイル名(例: "my-profile")に置き換えてください。

※スイッチロールではなく、デフォルトに設定されているアカウントでスクリプトを実行したい場合は、スクリプトの「profile="指定してください"」と「--profile "$profile"」を削除して利用してください。

for snapshot_id in "${SNAPSHOT_LIST[@]}"; do

  • 配列SNAPSHOT_LISTの各要素(スナップショットID)に対してループを開始します。

echo "Deleting snapshot: $snapshot_id"

  • 削除処理を行うスナップショットIDを表示します。

aws ec2 delete-snapshot --snapshot-id $snapshot_id --region $REGION --profile $PROFILE

  • AWS CLIを使用して、配列で指定されたスナップショットIDを持つスナップショットを削除します。

※詳しくは以下をご覧ください。

docs.aws.amazon.com

done

  • ループの終了を意味します。

echo "Completed deleting snapshots."

  • スナップショットの削除が完了したことを表示します。

まとめ

スタンダードのスナップショットの保存料金「0.05USD/1 か月あたりの GB」とみるとそこまで料金がかからないように見えますが、容量が大きいスナップショットがあると無駄なコストが増えてしまいます。

スクリプトを活用して、無駄なコストを削減していきましょう!

本記事が誰かの助けになれば幸いです。

日高 僚太(執筆記事の一覧)

EC部ソリューションアーキテクト2課 / AWS認定資格 12冠

2022年IT未経験で新卒入社しました。
最近はダーツとサウナが気になっています!
記事に関するお問い合わせや修正依頼⇒ hidaka@serverworks.co.jp