【小ネタ】 AWS CLI コマンドを利用して EBS スナップショットの取得時間を確認してみた

【小ネタ】 AWS CLI コマンドを利用して EBS スナップショットの取得時間を確認してみた

Clock Icon2025.04.07

はじめに

テクニカルサポートの 片方 です。
本ブログでは小ネタとして、AWS CLI コマンドを利用した EBS スナップショットの取得時間を確認する方法をご紹介します。

https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/time-based-copies.html

コンソールまたはレスポンスで開始時刻と完了時刻の差を確認することで、リクエストされた完了期間内に時間ベースのスナップショットまたは EBS-backed AMI コピーオペレーションが完了したかどうかを確認できますStartTimeCompletionTimedescribe-snapshots。

やってみた

AWS CLI aws ec2 describe-snapshots コマンドでは "StartTime" と "CompletionTime" が取得可能です。
そのため、"CompletionTime" - "StartTime" = スナップショット取得時間 として確認可能です。

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-snapshots.html

なお、本ブログでは検証・実行環境として CloudShell を利用しています。

単一スナップショットの取得時間を確認

スクリプト例
aws ec2 describe-snapshots \
  --snapshot-ids snap-xxxxxxxxxxxxxxx \
  --query 'Snapshots[0].[SnapshotId, StartTime, CompletionTime, VolumeSize, State]' \
  --output text | \
awk '{
  start_time=$2; 
  completion_time=$3; 
  if ($5=="completed") {
    cmd="date -d\""start_time"\" +%s"; 
    cmd | getline start_sec; 
    close(cmd); 
    cmd="date -d\""completion_time"\" +%s"; 
    cmd | getline end_sec; 
    close(cmd); 
    duration=end_sec-start_sec; 
    printf "%s | %s | %s | %d秒 | %dGB | %s\n", 
      $1, start_time, completion_time, duration, $4, $5
  } else {
    printf "%s | %s | %s | - | %dGB | %s\n", 
      $1, start_time, completion_time, $4, $5
  }
}'

※ 適宜修正してください。

取得例
snap-xxxxxxxxxxxxxxx | 2025-02-15T14:17:46.998000+00:00 | 2025-02-15T14:44:09.578000+00:00 | 1583| 30GB | completed

全スナップショットの取得時間を確認

スクリプト例
#!/bin/bash

# スナップショット ID が指定されている場合はそれを使用し、そうでなければ全てのスナップショットを取得
if [ -n "$1" ]; then
    SNAPSHOT_IDS=("$1")
    SNAPSHOT_FILTER="--snapshot-ids $1"
else
    echo "全てのスナップショットを取得しています..."
    SNAPSHOT_FILTER=""
    # 全スナップショットの ID を配列に格納
    SNAPSHOT_IDS=($(aws ec2 describe-snapshots --owner-ids self --query 'Snapshots[*].SnapshotId' --output text))
fi

echo "スナップショット ID | 開始時間 | 完了時間 | 所要時間(秒) | サイズ(GB) | 状態"
echo "---------------------------------------------------------------------"

for SNAPSHOT_ID in "${SNAPSHOT_IDS[@]}"; do
    # スナップショット情報を JSON 形式で取得
    SNAPSHOT_INFO=$(aws ec2 describe-snapshots --snapshot-ids "$SNAPSHOT_ID")

    # 必要な情報を抽出
    START_TIME=$(echo "$SNAPSHOT_INFO" | jq -r '.Snapshots[0].StartTime')
    COMPLETION_TIME=$(echo "$SNAPSHOT_INFO" | jq -r '.Snapshots[0].CompletionTime')
    STATE=$(echo "$SNAPSHOT_INFO" | jq -r '.Snapshots[0].State')
    SIZE=$(echo "$SNAPSHOT_INFO" | jq -r '.Snapshots[0].VolumeSize')

    # 完了していないスナップショットの場合は処理をスキップ
    if [ "$STATE" != "completed" ] || [ "$COMPLETION_TIME" == "null" ]; then
        echo "$SNAPSHOT_ID | $START_TIME | 未完了 | - | $SIZE | $STATE"
        continue
    fi

    # 日時をUNIX時間に変換して差分を計算
    START_SECONDS=$(date -d "$START_TIME" +%s)
    COMPLETION_SECONDS=$(date -d "$COMPLETION_TIME" +%s)

    # 所要時間を計算(秒)
    DURATION_SECONDS=$((COMPLETION_SECONDS - START_SECONDS))

    echo "$SNAPSHOT_ID | $START_TIME | $COMPLETION_TIME | $DURATION_SECONDS | $SIZE | $STATE"
done

※ 適宜修正してください。

取得例
>     echo "$SNAPSHOT_ID | $START_TIME | $COMPLETION_TIME | $DURATION_SECONDS | $SIZE | $STATE"
> done
snap-xxxxxxxxxxxxxxx | 2025-03-15T09:00:39.634000+00:00 | 2025-03-15T09:29:03.556000+00:00 | 1704 | 30 | completed
snap-aaaaaaaaaaaaaaa | 2025-02-27T06:22:08.729000+00:00 | 2025-02-27T06:32:17.494000+00:00 | 609 | 20 | completed
snap-bbbbbbbbbbbbbbb | 2025-03-16T05:59:28.064000+00:00 | 2025-03-16T06:27:36.976000+00:00 | 1688 | 30 | completed
snap-ccccccccccccccc | 2025-02-15T13:47:40.902000+00:00 | 2025-02-15T14:14:31.983000+00:00 | 1611 | 30 | completed
snap-ddddddddddddddd | 2025-02-15T13:56:56.697000+00:00 | 2025-02-15T14:15:42.108000+00:00 | 1126 | 30 | completed
snap-eeeeeeeeeeeeeee | 2025-03-16T06:00:00.052000+00:00 | 2025-03-16T06:28:06.995000+00:00 | 1686 | 30 | completed

注意点

AWS CLI が古いバージョンである場合、describe-snapshots コマンドにて CompletionTime が表示されない可能性があります。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-troubleshooting.html#tshoot-general

AWS CLI バージョン 2 リファレンスガイドで利用可能であると記載されているコマンドが存在しない、またはパラメータが認識されないことを示すエラーが表示された場合は、最初にコマンドの形式が正しいことを確認します。形式が正しい場合は、最新バージョンの AWS CLI にアップグレードすることをお勧めします。AWS CLI の更新バージョンはほぼ毎営業日にリリースされています。AWS の新しいバージョンでは、AWS CLI の新しいサービス、機能、パラメータが導入されています。これらの新しいサービスや機能、パラメータにアクセスする唯一の方法は、その要素が最初に導入された後にリリースされたバージョンにアップグレードすることです。

そのため、以下を参考に AWS CLI のバージョンを最新に更新して CompletionTime が表示されるようにしてください。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

まとめ

本ブログが誰かの参考になれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.