サイトアイコン 協栄情報ブログ

CloudWatchEventsとSSM Automationの組み込みで簡単にEC2の自動起動と停止


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

はじめに

開発やテスト環境の EC2 を使用しない時、停止して利用料金を削減するという取り組みはAWS環境を使うプロジェクトではほとんど求めていると思います。EC2サーバーのスケジュール化する起動停止は、前にはLambdaFunctionを使って対応していました。その後SystemManagerのオートメーションが発表され、CloudWatchEventsとSSM Automationの組み込みでEC2インスタンスの自動起動停止を簡単にスケジュール化できるようになりました。

やってみた

Step1 EC2操作用ロールを準備する

1.IAMロールの作成(IAM)

以下のロールポリシーでSystems Manager Automation に対するサービスロールを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*"
        }
    ]
}

2.ロールへの信頼関係追加(IAM)

信頼されたエンティティに対して「events.amazonaws.com」を追加します。

Step2 CloudWatchEventルールでスケーリングする

イベントルール追加-EC2自動停止(CloudWatch-Events)

・EC2インスタンスのスケーリング停止設定を実施します。
スケジュールはCron式での登録になります。UTC時間なので、日本時間-9時間で考える必要があることをご注意ください。

・ナビゲーションペインで、[イベント]、[ルールの作成] の順に選択します。

・ [イベントソース] で、[スケジュール] を選択します。続いて[Cron 式] を選択してタスクをいつトリガーするか定義する cron 式を指定します。cron 式の構文の詳細については、「ルールのスケジュール式」を参照してください。

今回は毎日の日本時間23時(UTC時間は14時)に停止するように定義します。

・[ターゲット] で [ターゲットの追加] を選択し、以下の表の通りに設定します。

項目 選択内容
ターゲット SSM Automation
ドキュメント AWS-StopEC2Instance
オートメーションパラメータの設定 「定数」を選択。
InstanceId 停止させたいインスタンスのIDを設定
インプットトランスフォーマー 「既存のロールを使用」を選択。
ロール入力欄 先ほど作成したロールを設定
ルールの定義:名前 適当なルール名を定義(例:Stop-EC2-2300-Weekdays)

EC2自動起動について

上記の手順と同様に、Cron式登録とターゲットを登録すればと思います。

以下の項目以外は自動停止と同様な設定です。

項目 選択内容
Cron式 0 0 MON-FRI *
ドキュメント AWS-StartEC2Instance
ルールの定義:名前 適当なルール名を定義(例:Start-EC2-0900-Weekdays)

動作確認

設定した時刻に指定したインスタンスが起動および停止することが確認できました。
Automation の実行結果については、AWS Systems ManagerコンソールのAutomation から確認することができます。

ハマった事

InstanceIdに複数インスタンスを同時に指定することができます。
その場合はカンマ区切りだけではなく、以下のようなカンマの後ろに半角スペースを設けて、ストリングリスト型で値を渡します。また、InstanceIdに複数IDを設定する場合、編集する場合、以下のようなフォーマットが崩れたりする現象がありますので、AWSのバグだと思います。どこかで改善して頂ければと思いますが、現時点では一応まだこの現象が存在しております。

["i-xxxxxxxxxxxxxxxxx", "i-xxxxxxxxxxxxxxxxx"]

単純なカンマ区切りでも設定はできてしまいますが、Automation 実行時に以下のようなエラーが発生します。

Step fails when it is validating and resolving the step inputs. Input InstanceIds String pattern validation fails. Expected regex pattern: (^i-(\w{8}|\w{17})$)|(^op-\w{17}$). Actual value: i-xxxxxxxxxxxxxxxxx, i-xxxxxxxxxxxxxxxxx. Please refer to Automation Service Troubleshooting Guide for more diagnosis details.
モバイルバージョンを終了