AWSでEC2を特定の時間だけ起動することでコストを抑えたいとは誰もが考えることです。
以前はLambdaとCloudWatchでそれを実装していたのですが、今回はAmazon EventBridgeとAWS System Managerを使って実装してみました。
Lambdaでの実装の場合、コードを書く必要がありますが、今回の方法はノーコードで実装することが可能です。
無料期間が終わったサーバを有料で使い続ける場合に少しでもコストを抑えたい人は試してみてください。
中国在住なのでTwitterやFacebookにアクセスする際に使用しているV2RAYサーバを夜中は停止することにしました。
IAMロールの作成
まずはIdentity and Access Management (IAM)でロールを作成します。
Identity and Access Management (IAM)の「▼アクセス管理」→「ロール」から「ロールの作成」をクリックします。
信頼されたエンティティタイプの「AWSのサービス」を選択します。
ユースケースは「他のAWSのユースケース」から「CloudWatch Events」を選択し、「次へ」をクリックします。
許可の追加ですが、何も追加せずに「次へ」をクリックします。
任意のルール名を付けます。
ここでは「ec2-autostart-autostop-role」としました。
必要に応じてタグをつけて「次へ」をクリックするとロールが作成されます。
作成されたロールにポリシーをアタッチしていきます。
作成された「ec2-autostart-autostop-role」をクリックします。
「許可を追加」から「ポリシーをアタッチ」をクリックします。
「AmazonSSMAutomationRole」を検索し、「ポリシーをアタッチ」をクリックします。
ポリシーが追加されました。
不要なポリシーにチェックを入れ、「削除」をクリックします。
「信頼関係」タブをクリックし、「信頼ポリシーを編集」でserviceに「scheduler.amazonaws.com」を追加します。
ポリシーの設定が完了しました。
EC2起動ルールの作成
Amazon EventBridgeでEC2インスタンスの起動ルールを作成します。
Amazon EventBridgeを開き「ルールを作成」をクリックします。
任意のルールの名前を設定します。
ここでは「ec2-start-rule」としました。
ルールタイプは「スケジュール」を選択して「次へ」をクリックします。
スケジュールパターンは日次で実行させたいので「特定の時刻」を選択します。
cronの設定はUTCで指定する必要があるので注意してください。ここではローカル(中国北京)時間で毎朝6時に起動するように設定しています。
cronの設定方法についてはこちらです。
ターゲットタイプは「AWSのサービス」、ターゲットの選択では「System Manager オートメーション」、ドキュメントは「AWS-StartEC2Instance」を選択します。
InstanceIDは自動起動させるEC2のインスタンスIDを設定します。
実行ロールは「既存ロール」を選択して、先ほどIAMで作成したロールを設定します。
他は特に変更の必要がないので「次へ」をクリックします。
必要に応じてタグを設定し「次へ」をクリックします。
内容を確認して間違いがなければ「ルールの作成」をクリックします。
これでEC2の自動起動ルールが作成されました。
EC2停止ルールの作成
停止ルールの作成は起動ルールの作成と同じ手順です。
1か所だけ設定が異なるだけで設定ができます。
まずは「ルールを作成」をクリックします。
ルールの名前を設定します。
ここでは「ec2-stop-rule」としました。
「スケジュール」を選択し「次へ」をクリックします。
スケジュールパターンは「特定の時刻」を選択し、cronの設定で毎日0時に停止するように設定します。
※時刻はUTCで指定する必要があります。
ターゲットタイプは「AWSのサービス」、ターゲットの選択では「System Manager オートメーション」、ドキュメントは「AWS-StopEC2Instance」を選択します。
ここが先ほどのEC2の起動とは異なる部分です。注意してください。
InstanceIDは自動停止させるEC2のインスタンスIDを設定します。
実行ロールは「既存ロール」を選択して、先ほどIAMで作成したロールを設定します。
他は特に変更の必要がないので「次へ」をクリックします。
必要に応じてタグを設定し「次へ」をクリックします。
内容を確認して間違いがなければ「ルールの作成」をクリックします。
これでEC2の自動停止ルールが作成されました。