はじめに
AWSのEC2インスタンスを夜間や休日は停止しておいて、EC2のインスタンス課金を抑えたいといった場合の、インスタンスの自動起動・停止の方法は
- Lambdaスクリプトを書いて、EventBridgeから呼び出し
- AWS提供のInstance Schedulerをデプロイして利用
などいくつか方法があると思います。
しかし、下記のような条件に対応しようとすると、ルールやスクリプトが複雑になったり、変更のタイミングや戻しなど運用が煩雑になってしまいます。
- 土日だけではなく祝日や特異日も停止しておく
- 緊急リリースがあるため、急遽今週だけ土日も起動をする
そこで、Senjuのジョブスケジュールを使って、祝日など複雑な条件にも対応し、変更もしやすいEC2インスタンス自動起動・停止の仕組みを作ってみました。
スクリプト作成
特定のタグが付いているインスタンスを対象に、起動・停止を行います。
今回は Key : ec2-reboot-senju , Value : On としました。
ジョブスケジュールで実行するスクリプトを作成し、Senjuのサーバーに配置します。
スクリプトは、AWS CLIで特定のタグを持つEC2インスタンスの一覧から、インスタンスIDを取得し、インスタンスのstartまたはstopを実行します。
aws ec2 describe-instances --filters "Name=tag:ec2-reboot-senju,Values=On" --query "Reservations[*].Instances[].InstanceId"
aws ec2 start-instances --instance-ids i-0123456789abcdefg
aws ec2 stop-instances --instance-ids i-0123456789abcdefg
AWSでの設定
EC2インスタンスへのタグ付け
起動・停止の対象とするEC2インスタンスへタグを設定します。
EC2インスタンス操作の権限付与
SenjuサーバーからAWS CLIを用いたスクリプトを実行できるようにするために、SenjuサーバーのEC2へIAMロールをアタッチします。
AmazonEC2FullAccessポリシーを持つIAMロールを作成する。
※カスタムポリシーを作成してIAMロールに紐づけることで、より権限を制限することも可能です。
Senjuでの設定
カレンダーの作成(起動・停止の日付の設定)
営業日カレンダーを、会社や組織の営業日・非営業日を1年単位で指定して作成します。
今回は、2022年の日本の祝祭日に加え、6/15、7/13を特異日として非営業日にしています。
稼働日カレンダーを、元となる営業日カレンダーとジョブ稼働条件および非稼働条件を指定して作成します。
今回は、営業日はジョブを稼働し、非営業日は非稼働としています。
ただし、月初(毎月1日)は非営業日だったとしてもジョブが稼働する条件としています。
ジョブの作成(起動・停止の時刻の設定)
「EC2インスタンス起動ジョブ」と「EC2インスタンス停止ジョブ」の2つのジョブを先行後続をつけずに並列に配置しています。
それぞれのジョブに起動時刻を設定でき、起動は9:00、停止は18:30と設定しています。
作成した営業日カレンダー、ジョブ・ネットを「システム」に登録し、自動サイクルをONにすることで、自動で稼働日に応じてジョブが実行されるようになります。
まとめ
Senjuのジョブスケジュールを使って、祝祭日や特異日も含めた休日はEC2インスタンスを停止しておき、平日は9:00にインスタンスを起動し、18:30にインスタンスを停止する仕組みができました。
急遽今週だけ土日もインスタンス起動をするといった場合も、Senjuのカレンダーの設定を変更して稼働日とするだけで、ジョブが実行され、9:00にインスタンス起動、18:30にインスタンス停止が行われます。
mPLAT/Tourのご紹介
「mPLAT/Tour」は、Senjuをクラウド型で提供しているmPLATを、メールアドレスを登録するだけで気軽にトライアル利用できるサービスです。
各種課題ごとに予めサンプル画面と環境設定が用意されているため、初心者でも簡単に、実践的な運用業務をご体験いただけます。
今回ご紹介したような、EC2スケジュール運用ガイドも用意をしており、指定したAWSアカウント上の任意のタグ付けがされたEC2インスタンスの自動での起動・停止をお試しいただけます。
// 詳しいご説明、お申し込みはコチラ↓_/_/
https://exp.mplattour.cloud/navi/index