はじめに
AWS CLIでEC2を停止するときに使う stop-instances コマンド。
AWS公式ドキュメントを眺めていたら、ちょっと気になる記載を発見しました。
それが --force オプションについて。
(いや、今さらかよとは言わないでください)
公式ドキュメントにはこんなことが書いてありました。
This option is not recommended for Windows instances.
ん???
Windowsインスタンスでは --force は非推奨らしい。
今まであんまり意識してなかったんですが、そう言われると気になる。
そもそも --force って具体的に何やってるんだ?ということで、ちょっと調べてみました。
--force って何してるの?
まず、いつものEC2停止コマンドがこちら。(ap-northeast-1指定ver)
aws ec2 stop-instances \
--instance-ids i-xxxxxxxxxxxxxxxxx \
--region ap-northeast-1
普通にEC2を停止するコマンドですね。
これを実行すると、OSの正常なシャットダウンが試みられます。
じゃあ --force を付けるとどうなるのか。
aws ec2 stop-instances \
--instance-ids i-xxxxxxxxxxxxxxxxx \
--force \
--region ap-northeast-1
--force って名前からして、問答無用で電源を落としそうな感じがしますよね。
でも実際はそうじゃないらしい。
なんと、--force を付けても最初は普通にシャットダウンしようとするんです。
公式ドキュメントによると、動作はこんな感じ。
- まずは正常なシャットダウンを試みる
- ファイルシステムのキャッシュやメタデータを書き込もうとする
- 一定時間待っても停止できなければ強制停止
- その場合、書き込みが完了していない可能性がある
つまり、
--force = 即電源ブチッ!ではない
ということですね。
ちなみにAWS公式では、--force は主にEC2が stopping 状態から進まなくなった場合の対処として案内されています。
普段の停止でわざわざ指定する必要はなさそうです。
なんでWindowsでは非推奨なの?
じゃあ、なんでWindowsでは非推奨なのか。
ざっくり言えば、OSがシャットダウン処理を終える前に強制停止すると、データが壊れる可能性があるから です。(AIと壁打ち調べ)
Windows Serverって、シャットダウンするときにいろいろやってますよね。
例えば、
- Windowsサービスの停止
- ディスクへの書き込み
- アプリケーションの終了処理
- ファイルシステムのキャッシュの書き込み
などなど。
これらが終わる前に強制停止されると、当然よろしくないことが起こる可能性があります。
例えばこんな感じ。
| 対象 | 起こり得ること |
|---|---|
| NTFS | ファイルシステムの不整合 |
| Windows Update | 更新処理の中断 |
| SQL Server | DBの復旧処理が必要になる、整合性への影響 |
| Active Directory | ディレクトリDBの整合性への影響 |
| Windowsサービス | 正常な終了処理ができない |
もちろん、強制停止したら必ず壊れるという話ではありません。
ただ、正常にシャットダウンできなかったことによるリスクはある ということですね。
ちなみにこれ、Windowsだけの話ではありません。
Linuxでも同様にデータ破損のリスクはあります。
じゃあなんでWindowsだけ名指しで非推奨なの?という疑問もありますが、AWS公式のCLIリファレンスにはWindows固有の技術的な理由までは詳しく書かれていませんでした。
なので、そこは変に推測せず、公式がWindowsでは非推奨としていることを押さえておけばよさそうです。
ちなみに --skip-os-shutdown なんてものもある
調べていたら、もう一つ気になるオプションがありました。
それが --skip-os-shutdown。
こっちは名前のとおり、OSの正常なシャットダウン処理をスキップする オプションです。
aws ec2 stop-instances \
--instance-ids i-xxxxxxxxxxxxxxxxx \
--skip-os-shutdown \
--region ap-northeast-1
え、じゃあ --force と何が違うの?となったので比較してみました。
| 停止方法 | 動作 | 用途 |
|---|---|---|
| 通常停止 | OSの正常停止を試みる | 普段の停止 |
--force |
正常停止を試み、停止できなければ強制停止 |
stopping から進まないとき |
--skip-os-shutdown |
OSの正常停止をスキップ | 正常停止処理を省略したいとき |
| 両方指定 | 正常停止をスキップし、強制停止も行う | 両方の動作が必要なとき |
なるほど。
--force と --skip-os-shutdown は別物なんですね。
個人的にはここが結構意外でした。
ちなみに --skip-os-shutdown は、メモリ上のデータがディスクに書き込まれなかったり、シャットダウンスクリプトが実行されなかったりする可能性があるので、こちらも気軽に使うものではなさそうです。
じゃあ普段の運用ではどうするの?
結論、普通に停止できるなら、普通に停止すればOK!(ap-northeast-1指定ver)
aws ec2 stop-instances \
--instance-ids i-xxxxxxxxxxxxxxxxx \
--region ap-northeast-1
停止できたか確認するならこちら。
aws ec2 wait instance-stopped \
--instance-ids i-xxxxxxxxxxxxxxxxx \
--region ap-northeast-1
これでEC2が stopped になるまで待機できます。
ただし、あくまでAWS上で停止状態になったことの確認なので、OSやアプリケーションが正常終了したかまでは分かりません。
もし stopping から進まなくなった場合は、原因を確認したうえで --force を検討する感じですね。
なお、AWS公式には --force 使用後、ファイルシステムのチェックや修復を実施するよう記載されています。
本番環境なら、バックアップの有無や業務影響も確認してから実行したいところ。
まとめ
というわけで、今回知ったことをまとめると、
--forceを付けても最初は正常停止を試みる- WindowsインスタンスではAWS公式が非推奨としている
--forceと--skip-os-shutdownは別物- 強制停止した場合はデータ破損のリスクがある
こんな感じでした。
普段からAWSを触っていても、CLIのオプションを一つひとつ細かく確認することってあんまりないですよね。
自分も今回仕事でコマンドレビュー依頼されてリファレンスを読んでいて気づきました。
特にWindows Serverを運用している場合、何気なく指定した --force がトラブルにつながる可能性もあるので注意したいところです。
運用手順書にとりあえず --force を付けていたりしたら、一度確認してみてもいいかもしれません。(AIが出してくるコマンド結構--forceつけがち)
やっぱり公式ドキュメントってちゃんと読むもんですねw
以上、今さら知ったAWSの小ネタでした。