こちらの記事で書いたように、オフラインマップサーバーをEC2上に移しましたが、このサーバーは常時稼働する必要はありません。 EC2は動かしておくと、課金もされるので、必要な時だけ、自動的に起動して、自動的に停止させたいと思います。
ネットを調べると、いろいろな方法で実現できることがわかります。今回は楽をしたかったので、 CloudWatchEvent + AWS System Manager(旧称 SSM) による処理としました。
元ネタは下記になります。
- EC2 インスタンスの起動と停止を自動化することは出来ますか? | DevelopersIO
- [AWS] CloudWatchでEC2の自動起動・停止をスケジュールする | AgoHack
- CloudWatch Events と Systems Manager で EC2の起動/停止をスケジュール化する - Qiita
- CloudWatch Eventsを使ってEC2を自動停止する | Tech Dive
IAM ロールの作成
IAM ロールを作成する際、最初にサービスとして、 System Manager を選択します。
そのうえで、ポリシーとして SSMAutomationRole をアタッチします。
ロール名を指定して、ロールを作成します。
IAMロール作成後、信頼関係を表示して、
『信頼関係の編集』を行い、信頼されたエンティティとして、
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ssm.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
とあるのを、
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
のように変更します。
EC2 起動用の CloudWatchEvent ルールの作成
IAM ロールが作成できれば、次は CloudWatchEvent のルールを作成します。ルールは、 Cron 式で指定します。 『ターゲット』として、『SSM Automation』を選択し、ドキュメントから『AWS-StartEC2Instance』を選択します。
ドキュメントを選択すると、インスタンスID入力欄が出てくるので、対象となる EC2 インスタンスのインスタンスIDを入力します。
最後に、ロールとして、先ほど作ったロールを設定すればOKです。
EC2 停止用の CloudWatchEvent ルールの作成
EC2 停止用の CloudWatchEvent ルールも起動用と同様に作成します。停止用の場合は、ドキュメントして、『AWS-StopEC2Instance』を選択するだけです。
テスト
作成したルールの Cron 式で起動する時間を適当に調整してテストします。指定した時間になると、EC2インスタンスが起動していることが確認できればOKです。停止も同様に確認しておきます。正しく動作していれば、これでOKです。
もし、EC2が期待したように起動しない場合は、ルールそのものが呼び出されたのか、ルールは呼ばれたけどEC2の起動に失敗したか、などは、CloudWatch メトリクスを見ればわかります。
まとめ
SSMを使えば、EC2の起動停止の制御が非常に簡単にできることがわかりました。
これ、いままで動かしっぱなしだった他の EC2 でも応用できますね。うまくすればずいぶんと、お安く運用できそうです。