EC2 の「強制的に停止 (Forcefully Stop)」操作を紹介します

EC2 はまれに、残念ながら、停止(stop)操作をしても長時間stoppingのまま…ということがあります。その際に実行できる手として「強制的な停止」操作があります。
2019.08.26

TL;DR

  • EC2が停止中(stopping)のままで一向に止まらない、なんてことがまれにあります
  • そんなときのために、強制停止オプション(--force)があります
  • 強制停止だけに注意点もあります

Yes, Forcefully Stop !

様々な理由で、EC2 が「 stopping 」のまま止まらなくなることがあります。

マネジメントコンソールから「アクション」>「インスタンスの状態」>「停止」を選択し、表示されたダイアログで「停止する」をクリック。通常なら数分もすれば再起動処理が完了し状態が running にかわるところが、何十分待ってもいっこうに stopped にならない。そんな経験はないでしょうか。

実は EC2 インスタンスの停止( stop )コマンドには、「強制的に停止 (Forcefully Stop)」機能があります。 が、その操作方法がちょっと分かりにくいところがあるので、この場でご紹介します。

なお AWS 公式のドキュメントとしては、下記がありますのでこちらも併せてご参照ください。

インスタンスの停止と起動 - Amazon Elastic Compute Cloud

インスタンスの停止に関するトラブルシューティング - Amazon Elastic Compute Cloud

操作方法

順にご説明します。がその前に。

本当に強制停止が必要ですか?

EC2 には、該当インスタンスのコンソール画面をスクリーンショットの形で参照したり、コンソールログを取得したりする機能があります。

止まっているようにみえて、何かしらの処理が動いていたりするかも知れません。この操作には後述するリスクがありますので、十分待って、「もうこれしかない」という場面でお使いになることをお勧めします。

…よろしいでしょうか? それではご説明します。

マネジメントコンソールの場合

まず、 stopping 状態のままになってしまった EC2 をマネジメントコンソールで選択します。 その状態で「停止 (Stop)」を選択してください。

停止中 (stopping) 状態の EC2 に対して再度停止を実行しようとすると、ダイアログが変化し「強制的に停止」する旨の文言になります。

このまま「強制的に停止」をクリックすれば、その旨実行されます。

AWS CLI の場合

AWS CLIから実行する場合はもっと簡単です。 --force オプションを突けるだけです。 例えばこんな感じになります(公式ドキュメントより):

aws ec2 stop-instances \
  --instance-ids i-0123ab456c789d01e \
  --force

その後について

実は「強制的に停止」の操作をしたからといって、即座に stop するか。。。というと、実はそこまで「強制」ではありません。

そもそも、 stopping の状態のまま何十分も止まらないという状態そのものが 異常 です。AWS のインフラに何らかのトラブルが発生している/していたのかもしれません。 それでも経験上、長くとも小一時間程度もすれば停止することがほとんどです。

その時間が待てない、ということであれば、公式ドキュメントにも書かれているように、事前に取得してあるバックアップ(スナップショット)からの復旧を行うことをご検討ください。復旧手段としては、これが最も確実な方法となります。

注意点

強制終了というだけあって、ノーリスクというわけではありません。そこはご注意ください。

いうなれば、オンプレサーバ機の電源ボタンを長押しするに等しい操作1が AWS 内部で行われることになります。 ちょっと AWS CLI の該当オプションのヘルプを引用しますが、

--force | --no-force (boolean)
Forces the instances to stop. The instances do not have an opportu-
nity to flush file system caches or file system metadata. If you use
this option, you must perform file system check and repair proce-
dures. This option is not recommended for Windows instances.

Default: false

要はファイルシステムのキャッシュやメタデータを書き出す操作が省略されるため、ファイルシステムへダメージがあるかも知れないということになります。

ただし「強制的な停止」が必要になった時点で、すでに OS が正常に動作していない状態だといえます。そこは残念ながら、覚悟するしかないと(個人的には)考えます。

まとめ

EC2 の「強制的な停止」操作についてご説明しました。 先日の AWS 障害のような大規模障害のときのみならず、日常的にも AWS ホストは障害を起こします(機械なので当たり前です)。そういった場合に、通常の動作では EC2 をシャットダウン出来なくなることもあります。

そういった場面にであうことも少ないかも知れませんが、もしもの時のために、「こういったことも出来る」ということだけご認識おき頂けますと幸いです。

おまけ

この記事を書くために「長時間 stopping のままである EC2」を用意しなくてはならなかったんですが、 試してみたところ「カーネルパニック」させることで近い状態にできました。 Linux カーネルにパニックを起こさせるためには、以下の 3 行を実行すれば可能です。

言うまでもないですが、この操作を行えば OS は完全に停止し再起動するしかなくなります。 実行は自己責任で行ってください

$ sudo -s
# echo 1 > /proc/sys/kernel/sysrq
# echo c > /proc/sysrq-trigger

なお、その際のスクリーンショットがこちらです。

ご参考までに。

脚注


  1. クラウドネイティブの世代には通じない例えでしょうか。。。