一定時間ログインが無ければEC2を停止する

前回、AWS上にDockerを使用してminecraftサーバを簡単に建てる方法を紹介しました。
EC2の良いところは、オンデマンドで簡単にサーバの起動停止ができる点ですが、ずっと起動していては費用が高く付きます。しかし、わざわざクラウド上にゲームサーバを建てようという時に、サーバ管理者が確実にゲームに参加して終了時に停止するなんて運用はしたくないですよね。それができるなら自分がデスクトップでプレイ中のゲームに友人を招待して、終わったら止めればいいだけです。

今回はCloud Watchにカスタムメトリクスを追加して、一定時間ログインが無ければEC2を停止するのを自動化していきます。

カスタムメトリクスは、CLIまたはAPIを通じて追加できます
①minecraftサーバからメトリクスを送信するために、EC2にCloud Watchにアクセスするためのロールを追加します。サービスからIAMに進みます。
ロールを選択してロールの作成を押します。

このロールを使用するのはEC2です。

ポリシーからEC2FullAccessとCloudWatchFullAccessを選択します。順番にフィルタして両方選択できます。EC2はメトリクス追加に関係無いポリシーですが、シェルスクリプトでEC2のインスタンスIDを取得するのに使用します。


以降はデフォルトでOKです。ロール名は「minecraft」とでもしておきましょう。

②EC2インスタンスに作成したロールの指定と、インスタンスID取得のためにタグを追加します。前回作ったインスタンスがあれば、選択してアクションメニューからタグの追加/編集を選択します。インスタンス作成時でもタグの追加は可能です。
ここではタグを「minecraft」にします。これはカスタムメトリクス取得のスクリプトでインスタンスを特定するのに使います。

同様にロールも設定します。アクションメニューからIAM ロールの割り当て/置換を選択して、先ほど作成したロールを設定します。

③カスタムメトリクスを送信するためのスクリプトを配置する。
sshでminecraftを建てたサーバにログインして、/home/ec2-user配下でminecraftCheck.shを作成し、以下の内容にします。

REGION,INSTANCEIDはそれぞれawsからリージョン情報とインスタンスIDを取得しています。
LOGINNUMはdockerでインストールしたコマンドを使用してminecraftのログインユーザ数を取得します。
これらの情報を使用してcloudwatchのput-metric-dataコマンドで情報を送信しています。
namespaceとmetric-nameで設定する名称は任意で構いません。cloud watchの管理画面で表示する名前になります。
作成したら、パーミッションを付けてcrontabに設定します。
また、JSONのパーサーにjqコマンドを使うので、ここでインストールしておきます。

これでcloud watchに通知されるようになりました。

④cloud watchに監視とEC2の停止設定をする。
ここまでうまくできたら、cloud watchの管理画面のメトリクスからカスタムメトリクスを見る事ができるはずです。

アラームを選択して、アラームの作成を押します。(下記キャプチャは作成済みの画面です。)

メトリクスでは、全てのメトリクスから辿って作成したメトリクスを選択します。
グラフ化したメトリクスで、期間を1分に変更します。

アラーム詳細では、ログイン数が0以下の場合が直近5回中5回としています。
これは、1分間に1回のチェックを5回繰り返して5回とも数が0だったらアラーム条件を満たすということです。
つまり、5分間ログインが無ければ停止するための条件設定ということです。
現実的には30分くらいにしておいた方が良いかもしれません。

追加設定の欠落データは適正(しきい値を超えていない)にしておきます。
普段はサーバを落としておく想定なので、ここを不正値にすると、いきなり警告状態からスタートしてしまいます。

最後にアクションは、一定時間ログインが無ければ停止したいので、EC2アクションでインスタンス停止に設定します。ここでEメール送信設定も可能です。

これで一通り設定は完了です。ログインせずに暫く放っておけばEC2が停止するはずです。
しかし、これだけ作業すれば最早簡単なサーバ構築ではないですね。(これでも従来に比べれば相当楽な方ですが)
今回追加したコマンドは前回紹介したEC2インスタンス作成時のユーザデータに入れて簡略化することが可能です。
Cloud WatchやIAMの設定自動化はcloud formationで可能かもしれません。AWSとしてはインフラ管理もコード化する事を推奨しているので、何かしらの方法でコード化し、配布することで構築を簡略化することは可能なはずです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする