EBS を管理する Flexible Snapshot Proxy ツールを試してみた
はじめに
テクニカルサポートの 片方 です。
EBS (スナップショット) を管理していると、以下のような疑問を持つことはないでしょうか。
- スナップショットの実際のサイズはどのくらいか?
- 2 つのスナップショット間でどのくらいデータが変わったのか?
- 不要なスナップショットを削除するとどのくらいコストが削減できるのか?
このようなことでお困りの場合は、AWS が公式 GitHub で公開しているツール「Flexible Snapshot Proxy」を利用することで解決できます。
今回は、Amazon Linux 2023(AL2023)にインストールして簡単なコマンドを試してみました。
検証環境
| 項目 | 内容 |
|---|---|
| リージョン | 東京リージョン(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 インスタンスへインストールします。
- 必要なパッケージをインストールします。
git と pip がインストールされているか確認します。
# gitの確認
$ git --version
# pipの確認
$ pip3 --version
インストールされていない場合は以下のコマンドでインストールします。
# gitがない場合
$ sudo dnf install git -y
# pipがない場合
$ sudo dnf install python3-pip -y

- Flexible Snapshot Proxy をインストールします。
ホームディレクトリにクローンします。
# ホームディレクトリに移動
$ cd ~
# リポジトリをクローン
$ git clone https://github.com/awslabs/flexible-snapshot-proxy.git

続いて、必要なパッケージをインストールします。
# ディレクトリに移動
$ cd flexible-snapshot-proxy
# パッケージをインストール
$ pip3 install -r requirements.txt

リージョンを環境変数に設定します。今回は ap-northeast-1 (東京リージョン) で設定します。
# 環境変数を設定
$ export AWS_DEFAULT_REGION=ap-northeast-1
# 設定確認
$ echo $AWS_DEFAULT_REGION
こちらで flexible-snapshot-proxy を利用するための環境設定は完了です。お疲れさまでした!
念のため動作確認します。
# srcディレクトリに移動
$ cd src
# ヘルプを表示
$ python3 main.py --help

正常に --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.

| 項目 | 値 | 換算 |
|---|---|---|
| チャンク数 | 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 つのスナップショット間の差分サイズを確認します。
検証では、意図的に差分を発生させるため、以下の手順で進めました。
- EBS ボリュームのスナップショット S1 を取得
- 次に、同じ EBS ボリュームにテスト用のファイルを作成し、ボリュームの内容を変更
- その後、再度スナップショット 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.

| 項目 | 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/月
以上の結果から、このケースでは以下のことがわかります。
- 2 つのスナップショット間の変更量は約30 MB と非常に少ない
- 古いスナップショットを削除した場合のコスト削減効果は約 $0.0015/月
まとめ
今回は Flexible Snapshot Proxy を Amazon Linux 2023(AL2023)にインストールし、以下のコマンドを試してみました。
| コマンド | 内容 | 結果 |
|---|---|---|
list |
スナップショットの実際の使用サイズを確認 | ✅ 成功 |
diff |
2 つのスナップショット間の差分サイズを確認 | ✅ 成功 |
list と diff コマンドを組み合わせることで、スナップショットの実際の使用サイズや差分サイズを把握し、
コスト最適化の判断材料として活用できることがわかりました。EBS スナップショットのコスト管理でお困りの方は、ぜひ試してみてください。
本ブログが誰かの参考になれば幸いです。
参考資料
- GitHub - awslabs/flexible-snapshot-proxy: High-performance open-source orchestration utility that utilizes EBS Direct APIs to efficiently clone, copy and migrate EBS snapshots to and from arbitrary File, Block or Object destinations.
- EBS の料金
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました






