こんにちは、櫻井です。
先日、社内で利用しているAWS上のシステムの本番環境を、別のAWSアカウントに移行するためのテストを行おうとしたところ、システムが停止してしまうというミスを犯してしまいました。今回はシステムが停止してしまった原因と、今後同じことが起こらないようにするための対策について書こうと思います。
目次
システムが停止してしまった原因
今回システムが止まってしまった原因は2つありました。
起動中のインスタンスからAMIを作成した
公式ドキュメントを確認すると以下のような記載があります。
デフォルトでは、Amazon EC2 が新しい AMI を作成するとき、データの保存中にアタッチされたボリュームのスナップショットを取得できるようにインスタンスを再起動して、一貫性のある状態を維持します。[No reboot] (再起動しない) の設定では、[Enable] (有効化) チェックボックスをオンにすることで、Amazon EC2 がインスタンスをシャットダウンして再起動することを防げます。
デフォルトの場合、起動したEC2から新しいAMIを作成するとインスタンスが再起動されるということを知らずに、稼働中のインスタンスからAMIを作成したところ、システムが停止しInternal errorになってしまいました。
インスタンス内のサービスの自動起動設定がされていなかった
システムを維持するために必要なサービスの自動起動設定がされていませんでした。インスタンスからAMIの作成を行ったときに実行される再起動の際、サービスが自動起動されずに停止したままになったため、システムが停止していまいました。
今後同じことが起こらないようにするための対策
システムが停止しても問題のないタイミングで本番環境を扱う
当然のことかもしれませんが、これが一番リスクを回避できる対策だと思います。今回の場合、
「AMIの作成だったらEC2にログインしてなにか変更を加えるわけでは無いから大丈夫だろう」
という考えが今回のインシデントの大きな原因のひとつです。
本番環境を扱う場合はシステムが使われていない時間に行うか、日中の場合は告知をしてメンテナンスの時間を設けるようにするなど、本番環境を扱うことのできるタイミングを用意することで、仮にシステムが停止してしまったとしても利用者に対する影響を抑えることが出来ます。どうしても今やらなくてはいけないという場合は上司に相談してから行う等、万が一の場合に備えた行動をしましょう。
システムを維持するために必要なサービスの自動起動が有効になっているかを確認する
以下のコマンドを実行して、自動起動が有効になっているかの確認をすることが出来ます。
1 |
systemctl list-unit-files -t service |
上記のコマンドを実行した際の出力結果は以下の画像のようになります。
STATEが “enabled” になっていれば自動起動が有効になっており、”disabled” になっていた場合は自動起動設定が無効になっています。 全ての自動起動が有効になっている必要はありませんが、システムの維持に必要なサービスに関しては有効化するようにしましょう。
因みに以下のコマンドでサービスの自動起動を有効化することが出来ます。
1 |
$ systemctl enable サービス名 |
また一瞬でも止まってはいけないシステムで
「自動起動設定をしているから大丈夫だろう」
という考えで稼働中のインスタンスからAMIを作成すると問題が起こってしまうので注意しましょう。
本番環境のスナップショットからテスト用のインスタンスを起動する
本番環境のスナップショットからボリュームを復元し、テスト用に立ち上げたインスタンスのボリュームを復元したボリュームに付け替えることで本番環境に影響を与えること無くテスト用のインスタンスを利用することができるようになります。
詳しい方法を知りたい方は、公式ドキュメントに記載があるのでご確認ください。
今回この方法をとっていれば社内用の本番環境が停止してしまうこともなく、テスト用のインスタンスでの検証段階で、システムの維持に必要な自動起動の設定が有効化されていないことにも気づけたと思います。
まとめ
今回は本番環境を扱う際の注意点についてお伝えしました。本記事で扱った事例以外にも注意すべき点は多くあると思います。本番環境を扱う場合は細心の注意を払いましょう。
また万が一このような事態になってしまった場合は一人で解決しようとせずに、上司やチームを頼ってできるだけ早く事態の解決に望むようにしましょう。
カジュアル面談も実施中!
ギークフィードではAWSエンジニアを募集しています。
弊社に興味を持っていただいたり、会社のことをカジュアルに聞いてみたいという場合でも、ご気軽にフォームからお問い合わせください。その場合はコメント欄に、カジュアルにお話したいです、と記載ください!
- 特定の時間あたりのlambda実行数をSlackに通知する - 2023-12-23
- 公衆電話からでも使える電話帳サービスをLEX + AmazonConnectで作ってみた - 2023-12-19
- SQSを使ってlambdaを10秒ごとに定期実行する - 2023-12-14
- Slack と AWS の電話番号登録アプリ – Bolt + CDK ソースコード解説 - 2023-03-26
- SlackとAWSを組み合わせた電話番号登録アプリの開発 – Boltフレームワーク+CDKで作ってみた - 2023-03-26