EBS を管理する Flexible Snapshot Proxy ツールを試してみた

EBS を管理する Flexible Snapshot Proxy ツールを試してみた

2026.02.26

はじめに

テクニカルサポートの 片方 です。
EBS (スナップショット) を管理していると、以下のような疑問を持つことはないでしょうか。

  • スナップショットの実際のサイズはどのくらいか?
  • 2 つのスナップショット間でどのくらいデータが変わったのか?
  • 不要なスナップショットを削除するとどのくらいコストが削減できるのか?

このようなことでお困りの場合は、AWS が公式 GitHub で公開しているツール「Flexible Snapshot Proxy」を利用することで解決できます。
今回は、Amazon Linux 2023(AL2023)にインストールして簡単なコマンドを試してみました。

https://github.com/awslabs/flexible-snapshot-proxy

検証環境

項目 内容
リージョン 東京リージョン(ap-northeast-1)
EC2インスタンスタイプ m5.large
OS Amazon Linux 2023(AL2023)
接続方法 AWS Systems Manager Session Manager
IAMロール AmazonSSMManagedInstanceCore(カスタムポリシー追加)

IAMロールに追加したポリシー

Flexible Snapshot Proxy を実行するために、以下の権限を追加しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeSnapshots",
                "ec2:DescribeRegions",
                "ebs:StartSnapshot",
                "ebs:ListSnapshotBlocks",
                "ebs:ListChangedBlocks",
                "ebs:GetSnapshotBlock",
                "s3:GetBucketAcl",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*"
        }
    ]
}

実装してみた

以下を参考に Amazon Linux 2023 の EC2 インスタンスへインストールします。
https://github.com/awslabs/flexible-snapshot-proxy

  1. 必要なパッケージをインストールします。

git と pip がインストールされているか確認します。

# gitの確認
$ git --version
# pipの確認
$ pip3 --version

インストールされていない場合は以下のコマンドでインストールします。

# gitがない場合
$ sudo dnf install git -y

# pipがない場合
$ sudo dnf install python3-pip -y

001

  1. Flexible Snapshot Proxy をインストールします。
    ホームディレクトリにクローンします。
# ホームディレクトリに移動
$ cd ~

# リポジトリをクローン
$ git clone https://github.com/awslabs/flexible-snapshot-proxy.git

002

続いて、必要なパッケージをインストールします。

# ディレクトリに移動
$ cd flexible-snapshot-proxy

# パッケージをインストール
$ pip3 install -r requirements.txt

003

リージョンを環境変数に設定します。今回は ap-northeast-1 (東京リージョン) で設定します。

# 環境変数を設定
$ export AWS_DEFAULT_REGION=ap-northeast-1

# 設定確認
$ echo $AWS_DEFAULT_REGION

こちらで flexible-snapshot-proxy を利用するための環境設定は完了です。お疲れさまでした!
念のため動作確認します。

# srcディレクトリに移動
$ cd src

# ヘルプを表示
$ python3 main.py --help

004

正常に --help の結果が出力されていますね。成功です!

確認してみた

Flexible Snapshot Proxy では以下のコマンドをサポートしています。

コマンド 説明
list 実際に消費/割り当てられた領域を列挙することで、EBSスナップショットの正確なサイズを返します
diff 共通の親を持つ2つのスナップショット間の増分ブロックレベル差分を列挙することで、EBSスナップショットデルタの正確なサイズを返します
download EBSスナップショットを任意のファイルまたはブロックデバイスに転送します
deltadownload 共通の親を持つ任意の2つのスナップショット間のデルタを、任意のファイルまたはブロックデバイス上にダウンロードします。親から作成された既存のボリュームの同期に使用できます
upload 任意のファイルまたはブロックデバイスを新しいEBSスナップショットに転送します
copy EBSスナップショットを別のEBS Direct APIエンドポイントに転送します。想定される使用例:アカウントおよび/またはリージョン間でのEBSスナップショットのコピー
sync 2つのEBSスナップショット間の増分差分delta(A,B)をスナップショットC(Aのクローン)に同期し、スナップショットD(Bのクローン)を作成します。想定される使用例:親スナップショットをcopyし、その後syncを使用して変更を同期
movetos3 EBSスナップショットまたは任意の画像ファイル/ブロックデバイスを、zstandard圧縮、調整可能なオブジェクトサイズ、独立したセグメントチェックサムを使用して、顧客所有のS3バケット(任意のS3ストレージクラス、またはSnowファミリー)に転送します
getfroms3 顧客所有のS3バケットに保存されたスナップショットを新しいブロックボリュームまたはファイルに転送します
multiclone downloadと同じ機能ですが、複数の宛先に並行して書き込みます。想定される使用例:スナップショットを複数のボリュームにクローン
fanout 任意のファイルまたはブロックデバイスから、提供されたリージョンのリストに基づいて、複数のEBSスナップショットに並行してアップロードします

list コマンド

まずは、簡単な list コマンドでスナップショットのサイズを確認してみます。

コマンド例
$ python3 main.py list snap-xxxxxxxxxxx
コマンド実行結果
$ python3 main.py list snap-07dccb543b012498a
()
Snapshot snap-07dccb543b012498a contains 3516 chunks and 1843396608 bytes, took 0.22 seconds.

005

項目 換算
チャンク数 3,516 chunks -
実際の使用サイズ 1,843,396,608 bytes 約1.8 GB
処理時間 0.22 秒 -

別のスナップショットでも確認してみます。

コマンド実行結果
$ python3 main.py list snap-04e24551687a5e332
()
Snapshot snap-04e24551687a5e332 contains 1088 chunks and 570425344 bytes, took 0.24 seconds.

こちらを比較するといかとなります。

スナップショットID チャンク数 実際の使用サイズ
snap-07dccb543b012498a 3,516 chunks 約1.8 GB
snap-04e24551687a5e332 1,088 chunks 約0.54 GB

diff コマンド

diff コマンドを使って、同一の EBS ボリュームから取得した 2 つのスナップショット間の差分サイズを確認します。
検証では、意図的に差分を発生させるため、以下の手順で進めました。

  1. EBS ボリュームのスナップショット S1 を取得
  2. 次に、同じ EBS ボリュームにテスト用のファイルを作成し、ボリュームの内容を変更
  3. その後、再度スナップショット S2 を取得

S1 と S2 の間にはファイル作成による差分が存在する状態となるため、以下のコマンドでその差分サイズを確認します。

コマンド例
$ python3 main.py diff snap-xxxxxxxxx snap-xxxxxxxxxx
コマンド実行結果
$ python3 main.py diff snap-05f4e669c84e09c7e snap-0b9922d70b2243a7c
()
Changes between snap-05f4e669c84e09c7e and snap-0b9922d70b2243a7c contain 61 chunks and 31981568 bytes, took 0.21 seconds.

006

項目 bytes 換算
S1:snap-05f4e669c84e09c7e(古い) 1,993,342,976 bytes 約1.86 GB
S2:snap-0b9922d70b2243a7c(新しい) 1,993,867,264 bytes 約1.86 GB
D12:差分サイズ 31,981,568 bytes 約30 MB

正常に取得できました。成功です!

補足

以下に記載の通り、list および diff コマンドを利用してスナップショットのサイズを把握し、環境内のデータ変更率を分析できます。このデータは、スナップショットのコスト削減額などを見積もる手段ともなります。

Determine the size of snapshots and deltas, and estimate savings from deleting old snapshots
You can utilize the list and diff calls to gain insight into how large your snapshots are, and analyze rate of data change in your environment. This data can then be utilized for cost optimization, as it provides a way to estimate savings from changing the snapshot retention policy, among other things.

たとえば、仮に以下のようなコマンド結果の場合...

# snap-05f4e669c84e09c7e
Snapshot snap-05f4e669c84e09c7e contains 3802 chunks and 1993342976 bytes, took 0.2 seconds.

# snap-0b9922d70b2243a7c
Snapshot snap-0b9922d70b2243a7c contains 3803 chunks and 1993867264 bytes, took 0.19 seconds.

# 2つのスナップショットの差分
Changes between snap-05f4e669c84e09c7e and snap-0b9922d70b2243a7c contain 61 chunks and 31981568 bytes, took 0.21 seconds.

分析結果としては以下の通りです。

項目 bytes 換算
S1:snap-05f4e669c84e09c7e(古い) 1,993,342,976 bytes 約1.86 GB
S2:snap-0b9922d70b2243a7c(新しい) 1,993,867,264 bytes 約1.86 GB
D12:差分サイズ 31,981,568 bytes 約30 MB
新規書き込み(S2 - S1) 524,288 bytes 約0.5 MB
上書き(D12 - 新規書き込み) 31,457,280 bytes 約30 MB

上記は以下の計算で成り立ちます。

計算式
# 新規書き込み
新規書き込み = S2 - S1
             = 1,993,867,264 - 1,993,342,976
             = 524,288 bytes(約0.5 MB)

# 上書き
上書き = D12 - 新規書き込み
       = 31,981,568 - 524,288
       = 31,457,280 bytes(約30 MB)

そのため、古いスナップショット(snap-05f4e669c84e09c7e)を削除した場合に解放されるサイズと削減コストを試算できます。
※ コスト削減の試算はあくまで概算です

解放されるサイズ = 上書き分 = 約30 MB = 約0.029 GB
削減コスト = 解放されるサイズ × スナップショット料金
           = 0.029 GB × $0.05/GB/月
           ≒ 約$0.0015/月

https://aws.amazon.com/jp/ebs/pricing/

以上の結果から、このケースでは以下のことがわかります。

  • 2 つのスナップショット間の変更量は約30 MB と非常に少ない
  • 古いスナップショットを削除した場合のコスト削減効果は約 $0.0015/月

まとめ

今回は Flexible Snapshot Proxy を Amazon Linux 2023(AL2023)にインストールし、以下のコマンドを試してみました。

コマンド 内容 結果
list スナップショットの実際の使用サイズを確認 ✅ 成功
diff 2 つのスナップショット間の差分サイズを確認 ✅ 成功

listdiff コマンドを組み合わせることで、スナップショットの実際の使用サイズや差分サイズを把握し、
コスト最適化の判断材料として活用できることがわかりました。EBS スナップショットのコスト管理でお困りの方は、ぜひ試してみてください。
本ブログが誰かの参考になれば幸いです。

参考資料

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

FacebookHatena blogX

関連記事