Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

【AWS】EC2の起動・停止を自動化する

はじめに

EC2をオンデマンドインスタンスで利用する場合、起動時間に応じて料金が発生するため、起動時間に注意が必要です。
とくに開発環境など、夜間・休日は使用しない環境であれば、インスタンスを停止しておくとコストを削減できます。
しかし、毎回手動で起動・停止を行うのは手間なので、AWSのサービスを利用して自動で起動停止するようにしたいと思います。
この記事では、Amazon EventBridgeを使用した自動化について、実装方法を紹介します。

前提

  • 東京リージョンのオンデマンドEC2インスタンス1台が対象
  • 月~金曜日の10:00~19:00の間だけ起動し、それ以外の曜日・時間は停止状態にする

設定の流れ

  • EventBridge用IAMロールの作成
  • EventBridge起動用ルールの作成
  • EventBridge停止用ルールの作成

EventBridge用IAMロールの作成

  • IAMロールの作成

    EventBridgeがSystemsManagerを操作するための権限、を与えるIAMロールを作成します。

    1. IAM > ロール > ロールを作成を選択

    2. 信頼されたエンティティを選択

      信頼されたエンティティタイプ:AWSのサービス
      ユースケース:Systems Manager(プルダウンから入力して検索 > Systems Managerを選択)

    3. 許可を追加

      許可ポリシー:AmazonSSMAutomationRoleポリシーのチェックボックスを選択(AmazonSSMAutomationRoleで検索)
    4. 名前、説明、タグ、作成確認

      ロール名:分かりやすい名前を入力(例ではec2-start-stop-role)
      説明:必要があれば変更
      タグ:必要があれば追加

    ここまで設定したら、ロールを作成を選択します。


    作成したロールが一覧に表示されていることを確認

  • IAMロールの信頼関係を編集

    ここまでで作成できたIAMロールは、Systems Manager用のロールになっています。
    EventBridge用のロールにするため、信頼関係を編集します。

    1. 作成したIAMロールを選択 > 信頼関係タブ > 信頼ポリシーを編集を選択

      以下のように、"Service"の部分を編集します。

        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "events.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
      

      編集が完了したら、ポリシーを更新を選択

これでEventBridge用IAMロールの作成が完了しました。

EventBridge起動用ルールの作成

ここからはEventBridgeで、EC2自動起動用のルールを作成します。
この記事では、月~金曜日の10:00にEC2を起動するルールを想定しています。

  • ルールの作成

    1. EventBridge > ルール > ロールを作成を選択

    2. ルールの詳細

      名前:分かりやすい名前を入力(例ではtest-ec2-start)
      説明:必要があれば変更
      ルールタイプ:スケジュール

    3. スケジュールを定義
      ここでは実行タイミングをCron式で指定します。

      スケジュールパターン:特定の時刻
      Cron式:

      時間 日付 曜日
      0 1 ? * Mon-Fri *
        ※Cron式について
        EventBridgeのタイムゾーンはUTCです。
        日本時間での設定を想定している場合は、その時間の9時間前を設定する必要があります。
        「以後 10 回のトリガー日」の横にあるプルダウンでローカルタイムゾーンを選択すると、JSTでの実行時刻を確認することができます。
      
    4. ターゲットを選択
      ここでは実行する内容(今回はEC2の起動)を指定します。

      ターゲットタイプ:AWSのサービス
      ターゲットを選択:Systems Managerオートメーション
      ドキュメント:AWS-StartEC2Instance
      InstanceId:対象のEC2インスタンスIDを記載

        インスタンスを複数指定したい場合は以下のように指定します。
        ["i-xxxxxxxxxxxx","i-yyyyyyyyyyyy"]
      

      実行ロール:既存のロールを使用、作成したIAMロールを選択

    5. タグを追加
      必要があればタグを追加

    6. レビューと作成
      設定に問題が無ければ、ルールの作成を選択します。

これでまず起動用ルールの作成が完了しました。

EventBridge停止用ルールの作成

次に、EC2自動停止用のルールを作成します。
月~金曜日の19:00にEC2を停止するルールを想定しています。

  • ルールの作成
    基本的には自動起動ルールと同じように作成しますが、停止ルール用に以下の部分を変更します。

    • ルールの詳細
      • 名前:分かりやすい名前を入力(test-ec2-stopなど)
    • スケジュールを定義
      • Cron式:
      時間 日付 曜日
      0 10 ? * Mon-Fri *
    • ターゲットを選択
      • ドキュメント:AWS-StopEC2Instance

これで停止用のルールも作成完了です。

作成したルールが一覧に表示されていることを確認

動作確認

指定した時刻にEC2の起動・停止が実行されることを確認します。

おわりに

今回はよく使われている自動起動・停止の実装方法を少し細かく書いてみました。
シンプルな仕組みですが、使う時間がある程度決まっている開発環境などのコスト削減には大きく貢献できます。
ぜひ活用してみてください。