[アップデート] Amazon EC2 がインスタンスの停止/終了時に OS シャットダウンをスキップできるようになったので停止済みになるまでの時間を測定してみた
いわさです。
先日のアップデートで、EC2 の停止/終了時のオプションで OS シャットダウンをスキップすることができるようになりました。
通常はデータの損失を防いだり、処理が途中で中断されてしまうことを避けるために、EC2 の停止/終了時には OS の正常終了を待ってからインスタンスをシャットダウンさせます。
Methods for stopping an instance - Amazon Elastic Compute Cloud より
今回は新たに OS シャットダウンをスキップできるようになりました。
例えばデータ保持が重要ではないワークロードや構成の場合はこのオプションを使うことでシャットダウン時間を従来よりも高速化できます。
使用方法ですが、アナウンスやドキュメントによると AWS CLI あるいはマネジメントコンソールからの実行が可能とされています...が記事執筆時点ではマネジメントコンソール(東京リージョン/バージニア北部リージョンの日本語・英語)から該当の UI が確認できませんでした。
公式ドキュメントによると、以下で「Skip OS shutdown」というエリアが表示されるようです。[1]
ただし、AWS CLI については該当オプションが実装されており使うことが出来ました。
stop-instances
にskip-os-shutdown
オプションが新たに追加されていました。
STOP-INSTANCES() STOP-INSTANCES()
NAME
stop-instances -
:
SYNOPSIS
stop-instances
--instance-ids <value>
[--hibernate | --no-hibernate]
[--skip-os-shutdown | --no-skip-os-shutdown]
[--dry-run | --no-dry-run]
[--force | --no-force]
[--cli-input-json | --cli-input-yaml]
[--generate-cli-skeleton <value>]
本日はこちらを使って OS シャットダウンをスキップした停止を何度か試し、時間を測ってみましたので検証結果を共有したいと思います。
検証してみた
今回は計測スクリプトを作成し、t3.micro インスタンスで Amazon Linux 2023、Windows Server 2025 で複数回の停止を行って「停止済み」ステータスとなるまでの時間を計測してみました。
#!/bin/bash
# EC2インスタンスのステータスをチェックするスクリプト
# 使用方法: ./check_ec2_status.sh <instance-id>
# 引数チェック
if [ $# -ne 1 ]; then
echo "使用方法: $0 <instance-id>"
echo "例: $0 i-1234567890abcdef0"
exit 1
fi
INSTANCE_ID=$1
# インスタンスIDの形式チェック(簡易)
if [[ ! $INSTANCE_ID =~ ^i-[0-9a-f]{8,17}$ ]]; then
echo "エラー: 無効なインスタンスID形式です: $INSTANCE_ID"
echo "インスタンスIDは 'i-' で始まり、その後に8-17文字の英数字が続く必要があります"
exit 1
fi
# 開始時刻を記録
START_TIME=$(date +%s)
START_TIME_READABLE=$(date '+%Y-%m-%d %H:%M:%S')
echo "EC2インスタンス $INSTANCE_ID のステータスを監視開始..."
echo "開始時刻: $START_TIME_READABLE"
echo ""
while true; do
# EC2インスタンスの状態を取得
STATUS=$(aws ec2 describe-instances \
--instance-ids "$INSTANCE_ID" \
--query 'Reservations[0].Instances[0].State.Name' \
--output text 2>/dev/null)
# AWS CLIコマンドのエラーチェック
if [ $? -ne 0 ]; then
echo "エラー: インスタンス $INSTANCE_ID の情報を取得できませんでした"
echo "インスタンスIDが正しいか、適切なAWS認証情報が設定されているか確認してください"
exit 1
fi
# 現在の時刻を取得
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$TIMESTAMP] インスタンス $INSTANCE_ID のステータス: $STATUS"
# ステータスが "stopped" の場合は監視終了
if [ "$STATUS" = "stopped" ]; then
echo "✅ インスタンス $INSTANCE_ID は停止済みです"
break
fi
# 1秒待機
sleep 1
done
# 終了時刻を記録して実行時間を計算
END_TIME=$(date +%s)
END_TIME_READABLE=$(date '+%Y-%m-%d %H:%M:%S')
EXECUTION_TIME=$((END_TIME - START_TIME))
echo ""
echo "監視完了"
echo "終了時刻: $END_TIME_READABLE"
echo "実行時間: ${EXECUTION_TIME}秒"
# 実行時間を分秒で表示(60秒以上の場合)
if [ $EXECUTION_TIME -ge 60 ]; then
MINUTES=$((EXECUTION_TIME / 60))
SECONDS=$((EXECUTION_TIME % 60))
echo "実行時間(詳細): ${MINUTES}分${SECONDS}秒"
fi
実行結果
以下は Amazon Linux 2023 の通常停止の場合です。
測定回 | 時間(秒) |
---|---|
1 | 72 |
2 | 62 |
3 | 45 |
4 | 53 |
5 | 64 |
6 | 23 |
以下は Amazon Linux 2023 で OS 停止スキップオプションを使った場合です。
測定回 | 時間(秒) |
---|---|
1 | 25 |
2 | 34 |
3 | 44 |
4 | 71 |
5 | 32 |
6 | 40 |
7 | 6 |
8 | 23 |
9 | 25 |
以下は Windows で通常どおり停止させた場合です。
測定回 | 時間(秒) |
---|---|
1 | 23 |
2 | 51 |
3 | 47 |
4 | 44 |
5 | 50 |
6 | 73 |
以下は Windows の OS 停止をスキップさせた場合です。
測定回 | 時間(秒) |
---|---|
1 | 50 |
2 | 8 |
3 | 18 |
4 | 16 |
5 | 14 |
6 | 49 |
実行結果のまとめ
まとめるとこんな感じです。
OS | 停止方式 | 測定回数 | 平均(秒) | 最小(秒) | 最大(秒) | 標準偏差 | 改善率 |
---|---|---|---|---|---|---|---|
Amazon Linux 2023 | 通常 | 6 | 53.2 | 23 | 72 | 18.4 | - |
Amazon Linux 2023 | スキップ | 9 | 33.3 | 6 | 71 | 19.8 | 37.4% |
Windows Server 2025 | 通常 | 6 | 48.0 | 23 | 73 | 17.8 | - |
Windows Server 2025 | スキップ | 6 | 25.8 | 8 | 50 | 18.7 | 46.3% |
どちらの OS の場合もばらつきはありますが、平均で見てみると 30~40 % 早くなっている感じですね。
さいごに
本日は Amazon EC2 がインスタンスの停止/終了時に OS シャットダウンをスキップできるようになったので、どの程度早くなったのか検証環境で測定してみました。
注意点として、OS 上での処理(プロセス起動状況、メモリ状態や I/O状況)によって通常は OS シャットダウンまでの時間は大きく変わります。
今回の検証では EC2 インスタンスの起動と停止を繰り返しているのでそのあたりのオーバーヘッドがかなり小さい状態です。実際のワークロードで OS シャットダウンまでの時間がかかるような状況ではより大きな速度改善を感じれるのではと思います。
一定の効果はありそうなので、グレースフルシャットダウンが不要な環境では効果的に使えそうですね。
また、オートスケーリング早くなりそうだなぁという印象だったのですが、どうやら本日時点では起動テンプレートやオートスケーリンググループの設定にこの OS 停止スキップオプションの指定はないようでした。