こんにちは、最近は鍋で二郎ラーメンをテイクアウトしたいなと思ってます、今野です。
今回は表題の通り、任意のEBSのボリュームタイプをgp3へ一括で変更するスクリプトをご紹介します。
そもそもの話(執筆の背景)
某お客様に対し、ご利用料金削減のご支援の一環として、EBSボリュームタイプを最適化することでEBSに係る料金を削減しましょうといった提案しております。 もちろん、AWSマネージメントコンソールやAWS CLIのコマンドでも変更は出来ますが、1つずつ実施することは手間なのでスクリプトを作成してみました。
すでにWeb上で紹介されているような情報もあるかと思いますが、お客様へスクリプトを提供する中で自分なりに整理した内容もありますのでブログにしてみました。
なお、EBSボリューム対応をgp2からgp3へ変更することのメリットは、下記ブログが参考になるかと思います。
↑ブログに記載されているgp2 ボリュームから gp3 ボリュームへ変更する主なメリットをNotebookLMにまとめてもらった内容は下記となりますのでご参考まで。
- ストレージコストが削減できます。gp3 は gp2 より安価で、約 20% のコスト削減が可能です。
- 小容量ボリュームの IOPS が向上します。1,000 GiB 以下の gp2 ボリューム を gp3 に切り替えると、IOPS が 最低 3,000 まで向上します。
- IOPS とスループットを柔軟に設定可能です。gp3 では、ワークロードに合わせて IOPS(3,000~16,000)とスループット(125~1,000 MB/s)を調整できます。
- 小容量ボリュームのスループットが向上します。167 GiB 未満のボリューム であれば、gp3 は gp2 よりも高いスループットを提供します。
- サーバーを停止せずに変更可能です。Elastic Volumes に対応しており、「Modify」コマンドでオンラインで切り替えができます。
実行環境について
Cloudshellで実行することを想定しております。
ローカルPC等でも実施可能ですが、AWS CLIのインストールが必要です。 また、詳細は割愛しますが、ローカルPC等から実行する際はAWS CLI を実行する上でのプロファイル情報を~/.aws/config ファイルへ追加してください。
なお、AWS CLIのバージョンは最新にしておくことを推奨します。
スクリプト実行までの準備
変更したいEBSボリュームを確認し、ボリュームIDをリスト(変更対象一覧ファイル)に記載します。
EBSボリュームの洗い出しに関しては、下記ブログを参照ください。
下記コマンドをCloudShellで実行してください。
# 変更対象一覧ファイルの作成 cat << 'EOF' > ebs-gp3-change.list # ボリュームIDを記載 vol-xxxxxxxxxxxxxxxxx vol-xxxxxxxxxxxxxxxxx vol-xxxxxxxxxxxxxxxxx EOF # 作成したファイルの確認 cat ebs-gp3-change.list
次に、CloudShellで以下のコマンドを実行し、スクリプトファイルを作成します。
作成後、実行権限を付与します。
# スクリプトファイルの作成
cat << 'EOF' > ebs-gp3-change.sh
#!/bin/bash
# リストを読み込み、EBSボリュームタイプをgp3へ変更
cat ebs-gp3-change.list | while read line
do
EBS_VOLUME_ID=$(echo $line)
aws ec2 modify-volume --volume-id ${EBS_VOLUME_ID} --volume-type gp3
sleep 1
done
EOF
# スクリプトに対する実行権限の付与
chmod +x ebs-gp3-change.sh
スクリプトの実行
スクリプトを実行する準備が出来たら、いよいよスクリプトを実行していきます。
下記コマンドをCloudShellで実行してください。
./ebs-gp3-change.sh
スクリプトの実行結果
スクリプトを実行すると、下記のような実行結果が表示されます。
gp2のEBSボリュームを変更(IOPS・スループットがgp3のベースライン以下となるケース)
# 実行結果
{
"VolumeModification": {
"VolumeId": "vol-xxxxxxxxxxxxxxxxx",
"ModificationState": "modifying",
"TargetSize": 8,
"TargetIops": 3000,
"TargetVolumeType": "gp3",
"TargetThroughput": 125,
"TargetMultiAttachEnabled": false,
"OriginalSize": 8,
"OriginalIops": 100,
"OriginalVolumeType": "gp2",
"OriginalMultiAttachEnabled": false,
"Progress": 0,
"StartTime": "2025-03-09T05:46:35+00:00"
}
}
変更元であるgp2のIOPSがgp3のベースライン以下の場合は、ベースラインの値になるよう変更されるようです。 また、gp3の場合スループットはボリュームサイズに応じて設定されます。詳細は下記AWSドキュメントを参照ください。
gp2のEBSボリュームを変更(IOPS・スループットがgp3のベースラインより高くなるケース)
# 実行結果
{
"VolumeModification": {
"VolumeId": "vol-xxxxxxxxxxxxxxxxx",
"ModificationState": "modifying",
"TargetSize": 1100,
"TargetIops": 3300,
"TargetVolumeType": "gp3",
"TargetThroughput": 250,
"TargetMultiAttachEnabled": false,
"OriginalSize": 1100,
"OriginalIops": 3300,
"OriginalVolumeType": "gp2",
"OriginalMultiAttachEnabled": false,
"Progress": 0,
"StartTime": "2025-03-09T05:46:40+00:00"
}
}
IOPS・スループットが変更元のボリュームのサイズやIOPSに基づいて設定変更中となっていることが確認出来ました。
おわりに
以上、任意のEBSのボリュームタイプをgp3へ一括で変更するスクリプトのご紹介でした。
どなたかのお役に立てれば幸いです。
今野 祐靖(執筆記事の一覧)
2024年4月中途入社 年間約300日ととのうサウナー