【小ネタ】AWS CLI で EBS ボリュームの「タイプ別総容量」をサクッと集計する

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

はじめに

こんにちは、サメ映画をこよなく愛する梅木です。最近のお気に入りは足が8本あるタイプのサメです。

今回はちょっとした「小ネタ」として、AWS上のEBSボリュームのタイプ別総容量を確認する方法を紹介します。

EBSボリュームのタイプを見直すことで、コスト削減やパフォーマンスの向上が見込めます。

「今、うちの環境にはどのタイプのEBSボリュームが何件あって、合計何GiB使われているのか?」 を把握することで、コスト削減効果の試算や移行にかかる時間の見積もりを行えます。

今回は AWS CloudShell と AWS CLI を利用し、EBS ボリュームの「タイプ別総容量」を簡単に集計・確認できる方法をご紹介します。

用語

  • AWS CloudShell

    • AWSのマネジメントコンソールからワンクリックで起動できる、ブラウザベースのコマンドライン環境です。
    • AWS CLI や jq といった定番ツールが最初からインストールされており、コンソールにログインしているユーザーの権限をそのまま引き継いで操作できます。手元のPCに環境構築をする手間がなく、今回のようなスクリプトをサクッと動かして検証するのに最適なサービスです。
    • ※注意点: 今回実行するスクリプト自体はリソースの「読み取り操作(Describe)」のみを行いますが、AWS CloudShell を起動するために、別途 CloudShell 自体の利用権限が必要になります。起動時にエラーになる場合は、ご自身のIAM権限をご確認ください(参考:AWS CloudShell のアイデンティティベースのポリシー例 - AWS CloudShell
  • AWS CLI

    • AWSの各種サービスを、コマンド操作で管理・制御するための公式ツールです。
    • マネジメントコンソール(ブラウザ画面)でポチポチと手作業で行うような情報取得や設定変更を、コマンド一つで実行することができます。今回のブログでは、このツールを使って「アカウント内のEBSボリューム情報を集計する」という処理を行っています。

利用する AWS CLI コマンド

aws ec2 describe-volumes コマンドを利用します。

このコマンドは、指定したリージョン内にあるEBSボリュームの詳細情報(ボリュームID、サイズ、ボリュームタイプ、アタッチされているインスタンスIDなど)を一覧で取得してくれます。 そのまま実行するとJSONデータが返ってきますが、出力結果を jq コマンド(JSONデータを簡単に扱える機能)などと組み合わせることで、タイプ別の集計やフィルタリングが容易に行えます。

なお、jq は AWS CloudShell に事前インストールされており、手動インストールは不要です。

詳細は以下のリファレンスをご確認ください。

集計スクリプト紹介

上記のaws ec2 describe-volumes コマンドを利用したスクリプトを紹介します。

スクリプト

(コードが長いため折りたたんでいます。クリックして展開してください)

スクリプトのコードを表示する(クリックで展開)

#!/bin/bash
#
# EBS コスト削減調査スクリプト (CloudShell版)
#
# 出力内容:
#   1. EBSボリュームの一覧と総容量(全タイプ)
#
# 使い方:
#   chmod +x ebs-volume-check.sh
#   ./ebs-volume-check.sh
#
# 特定リージョンで実行する場合:
#   AWS_DEFAULT_REGION=ap-northeast-1 ./ebs-volume-check.sh
#

set -euo pipefail

REGION="${AWS_DEFAULT_REGION:-$(aws configure get region 2>/dev/null || echo "ap-northeast-1")}"
ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

echo ""
echo "=============================================="
echo " EBS ボリュームタイプ別総容量集計レポート"
echo "=============================================="
echo "実行日時      : $(date '+%Y-%m-%d %H:%M:%S %Z')"
echo "対象AWSアカウント : ${ACCOUNT_ID}"
echo "リージョン    : ${REGION}"
echo "=============================================="

# -----------------------------------------------
# 1. EBSボリュームの調査(全タイプ)
# -----------------------------------------------
echo ""
echo "----------------------------------------------"
echo " 1. EBSボリューム一覧"
echo "----------------------------------------------"
echo ""

ALL_VOL_JSON=$(aws ec2 describe-volumes \
  --query 'Volumes[].{VolumeId:VolumeId,VolumeType:VolumeType,Size:Size,State:State,AvailabilityZone:AvailabilityZone,Attachments:Attachments[0].InstanceId}' \
  --output json)

ALL_VOL_COUNT=$(echo "${ALL_VOL_JSON}" | jq 'length')

if [ "${ALL_VOL_COUNT}" -eq 0 ]; then
  echo "EBSボリュームは見つかりませんでした。"
else
  printf "%-22s  %-6s  %10s  %-12s  %-20s  %-20s\n" "VolumeId" "Type" "Size(GiB)" "State" "AZ" "AttachedInstance"
  printf "%-22s  %-6s  %10s  %-12s  %-20s  %-20s\n" "----------------------" "------" "----------" "------------" "--------------------" "--------------------"

  echo "${ALL_VOL_JSON}" | jq -r 'sort_by(.VolumeType) | .[] | [.VolumeId, .VolumeType, (.Size|tostring), .State, .AvailabilityZone, (.Attachments // "N/A")] | @tsv' | \
  while IFS=$'\t' read -r vol_id vol_type size state az instance; do
    [ "${instance}" = "null" ] && instance="(未アタッチ)"
    printf "%-22s  %-6s  %10s  %-12s  %-20s  %-20s\n" "${vol_id}" "${vol_type}" "${size}" "${state}" "${az}" "${instance}"
  done

  echo ""
  echo "----------------------------------------------"
  echo " ボリュームタイプ別集計"
  echo "----------------------------------------------"
  echo "${ALL_VOL_JSON}" | jq -r '
    group_by(.VolumeType) |
    .[] |
    {
      type: .[0].VolumeType,
      count: length,
      total_gib: (map(.Size) | add)
    } |
    "  \(.type)  : \(.count) 件  /  \(.total_gib) GiB"
  '

  ALL_VOL_TOTAL_GIB=$(echo "${ALL_VOL_JSON}" | jq '[.[].Size] | add')
  echo "  ---------------------------------"
  echo "  合計     : ${ALL_VOL_COUNT} 件  /  ${ALL_VOL_TOTAL_GIB} GiB"
fi

処理の流れ

大まかな処理の流れは以下の通りです。

  1. 実行環境の情報を取得 aws sts get-caller-identity などを使い、現在のアカウントIDやリージョン情報を取得して、レポートのヘッダーとして出力します。
  2. ボリューム情報の一括取得 aws ec2 describe-volumes コマンドを実行し、アカウント・リージョン内の全EBSボリュームのデータ(JSON形式)を変数(ALL_VOL_JSON)に格納します。
  3. 一覧のフォーマット表示 取得したJSONデータを jq コマンドに渡し、ボリュームIDやサイズ、アタッチ先のインスタンスIDなどを抽出し、表形式で出力しています。
  4. ボリュームタイプ別の集計 再度 jq コマンドの集計機能(group_byadd)を使い、データを VolumeType(gp2 や gp3 など)ごとにグループ分けし、それぞれのグループの「件数」と「合計サイズ(GiB)」を計算してサマリーとして出力しています。

検証

1. スクリプト作成

上記で紹介したスクリプトをローカルPCに保存します(ファイル名は任意で構いませんが、今回は ebs-volume-check.sh として保存しました)

※ローカルPCでファイル後、アップロードする手順として解説しますが、CloudShell上で直接 vi ebs-volume-check.sh を実行して保存しても問題ありません

2. CloudShellへのアップロード

  • AWS マネジメントコンソールにログインします
  • 画面左下の CloudShell アイコンをクリックします

画面左下の CloudShell アイコンをクリック

  • 画面右上のアクションをクリックし、ファイルのアップロードをクリックします

画面右上のアクションをクリックし、ファイルのアップロードをクリック

  • 1で作成したスクリプトをアップロードします

3. 集計スクリプト実行

CloudShell で以下のコマンドを実行します。

$ chmod +x ebs-volume-check.sh
$ ./ebs-volume-check.sh

4. 結果確認

以下のように出力されることを確認します。

==============================================
EBS ボリュームタイプ別総容量集計レポート
==============================================
実行日時      : 2026-03-24 00:20:39 UTC
対象AWSアカウント : 123412341234
リージョン    : ap-northeast-1
==============================================

----------------------------------------------
 1. EBSボリューム一覧
----------------------------------------------

VolumeId                Type     Size(GiB)  State         AZ                    AttachedInstance    
----------------------  ------  ----------  ------------  --------------------  --------------------
vol-xxxxxxxxxxxxxxxx1   gp2             30  in-use        ap-northeast-1a       i-xxxxxxxxxxxxxxxx1
vol-xxxxxxxxxxxxxxxx2   gp2             30  in-use        ap-northeast-1a       i-xxxxxxxxxxxxxxxx2
・・・・・・・(複数件リストアップされます)
vol-xxxxxxxxxxxxxxxx3   gp3             30  in-use        ap-northeast-1a       i-xxxxxxxxxxxxxxxx3
vol-xxxxxxxxxxxxxxxx4   gp3              8  in-use        ap-northeast-1a       i-xxxxxxxxxxxxxxxx4
・・・・・・・(複数件リストアップされます)

----------------------------------------------
 ボリュームタイプ別集計
----------------------------------------------
  gp2  : 10 件  /  3000 GiB
  gp3  : 20 件  /  6000 GiB
  ---------------------------------
  合計     : 30 件  /  9000 GiB

これで、サクッとボリュームタイプ別の総容量が集計できました!

5. クリーンアップ

  • 必要に応じて、集計スクリプトを削除しておきましょう($HOME領域のデータは120日間無操作で自動削除されます)
$ rm ebs-volume-check.sh

まとめ

今回は aws ec2 describe-volumes とスクリプトを組み合わせて、EBSボリュームのタイプ別総容量を AWS CloudShell を利用し、簡単に集計する方法をご紹介しました。

それでは、また次回の記事でお会いしましょう!

梅木美香(記事一覧)

EC部SA課所属

2025 Japan All AWS Certifications Engineers

岩手県盛岡市出身。ソウルフードは、もちろん盛岡じゃじゃめんです