プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

EC2 スポットインスタンスの停止と復旧

メール環境として、こちらに書いたように Rainnloop を使って複数のメールアドレスを管理しています。

今朝、仕事前にメールをみようとしたら、なぜか接続できません。少なくとも、昨日の夜までは問題なく使えてました。

とりあえず aws のコンソールにログインして、 EC2 のインスタンスを確認すると、確かに止まっています。なんでだろうか?と思ったのですが、すぐにはわかりません。

とりあえず一度起動してみるか、と思って起動してみると

あ!そういうことか。 スポットインスタンスの価格が設定金額を超えてしまったので、停止したようです。

念のため価格推移を見てみると、

今のインスタンスはアベイラビリティゾーンが ap-northeast-1a だったんですが、4月に入ってから徐々に価格が上がってきてますね(上図の赤線)。

にしても、なんでこんなに低い金額に設定してたんだろうか?ためしに立ち上げてそのまま使い続けたのかな?

さて、どうしたものかな? 対応案としては、

  1. このままの状態にしておく
  2. 高めの設定金額でスポットインスタンスを立ち上げる

メール環境といっても、 Rainloop はブラウザベースのメールクライアントで、個別のメールアドレス( IMAP サーバー)にアクセスしてるだけです。なので、元のメールアドレス側の web メール環境にアクセスすれば送受信に問題はありません(まあ、これがスポットインスタンスにしてる理由なんですけどね)。

とはいえ、不便なのと、ちょうど、仕事のほうも若干余裕があるので、今回は案2のほうで進めたいと思います。

復旧作業

残念ながらスポットリクエストは、インスタンスが起動後は最高金額(昔は入札金額と呼んでたような気がしますが、価格設定方法が変わったみたいですね)をあとから変更することができません。なので、入札金額を高くしたスポットリクエストを作る必要があるのですが、この時に起動するインスタンスは AMI として指定しておく必要があります。

当初は、公開されている Ubuntu の AMI を指定して、その後 Rainloop のインストールや各種設定を行ったため、直接今のインスタンスで動作しているものに対応する AMI がありません。

なので、既存の EC2 インスタンスから AMI を作成しておきます。

EC2 インスタンスから AMI を作成

停止してはいるものの、 EC2 インスタンスがあるので、これを元に AMI を作成します。 停止しているインスタンスにチェックを入れて、『アクション』->『イメージとテンプレート』->『イメージを作成』を選択します。

イメージの作成画面が表示されるので、下記のように必要事項を入れておきます。

設定した項目としては、

  • イメージ名
  • イメージの説明
  • ストレージについては『終了時に削除』のチェックを外しておきます

ぐらいです。画面下部にある『イメージを作成』ボタンを押すと、イメージの作成が行われます。 

スポットリクエストを作成

AMI ができたら、次にスポットリクエストを作成します。

AMI を選択して、『アクション』 -> 『スポットインスタンスをリクエスト』を選択します。リクエスト時の設定画面が表示されるので、必要な項目を設定していきます。

AMI はこんな感じに選択しておきます。

  • インスタンスタイプ, t3.nano
  • キーペア
  • セキュリティグループ

も以前と同じように設定します。ストレージについてもデフォルトのままとして変更しません(AMI 作成の元になった、以前の EC2 インスタンスが使っていたものと同じです)。8GB gp2 ですね。

『高度な詳細』を開いて、いくつか設定を確認していきます。

  • 最高料金:最高料金なし(オンデマンドの価格が上限になる)
  • リクエストタイプ:永続
  • 中断動作:停止

とします。前回のリクエストの時は不必要に低くしてしまってましたね。オンデマンド以下にしてある程度安定的に動かすので十分だと思います(とはいっても、以前の設定金額でも3年以上止まってなかったですが)。

IAMインスタンスプロフィールは既存のものを選択しておきます。

  • インスタンスの自動復旧:デフォルト
  • シャットダウン動作:停止

とします。その他の項目はデフォルトのままとしました。

設定ができれば『インスタンスを起動』ボタンを押します。しばらくすると、無事にインスタンスが起動しました。

Elastic IP の付け替え

スポットインスタンスが無事に起動したら、次は停止中のインスタンスに紐づいている Elastic IP アドレスを新たに起動したインスタンスに付け替えます。

Elastic IP アドレスを表示して、対象となるアドレスを選択します。

『アクション』 -> 『Elastic IP アドレスの関連付け』を選択します。表示された設定画面で、新しいスポットインスタンスを選択します。

この時、画面下部の『再関連付け』のところにチェックを付けておきます。

この状態で『関連付ける』を押します。新しいスポットインスタンスに既存の IP アドレスが割り当てられていればOKです。

これで、新しいインスタンスに問題なくアクセスできるか確認してみると、ちゃんとアクセスできましたね。

後始末

新しいインスタンスに問題なくアクセスできるのが確認出来たら、あとは後始末をすれば作業完了です。

以前使っていたスポットリクエストを選択して、

『アクション』->『リクエストをキャンセル』を選択します。

確認画面が表示されるので

『確認』を押します。

スポットリクエストをキャンセルすると、

EC2も削除されます。ステータスが『終了済み』となってますが、しばらくするとリストから消えます。また、 EC2 が削除されると EBS も削除されました。

これで、無事に復旧できました。

おまけ

起動したインスタンスの syslog を見てみると、どうも昨日の夜 11 時回ってから停止させられたようです。

こんなことあるんですねー。