Techfirm Cloud Architect Blog

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

EC2インスタンスをタグで自動管理:朝起動、夜停止のスケジュール設定

はじめに

本記事では、AWS Systems Managerドキュメント(以下、SSMドキュメント)を使用してEC2インスタンスを効率的に管理する方法を紹介します。特に、以前ご紹介した記事の応用編として、EC2インスタンスに設定されたタグに基づいて起動・停止を制御する手法に焦点を当てます。

前提

  • 今回の例で停止させるEC2インスタンスは、タグキーに「Environment」、タグバリューに「Staging」が設定されているものとする
  • 東京リージョンのオンデマンドEC2インスタンスとし、複数台でも可とする
  • 月~金曜日の8:00~19:00の間だけ起動し、それ以外の曜日・時間は停止状態にする

主なポイント

本記事は、以下のようなポイントがあります。

  1. Lambdaレス運用によるメンテナンス負荷の軽減

    • SSMドキュメントを直接使用することで、Lambda関数の作成・管理が不要に
    • インフラストラクチャのシンプル化によるメンテナンスコストの削減
  2. タグベースの柔軟な制御

    • EC2インスタンスに付与されたタグを基に、きめ細かな起動・停止スケジュールの設定が可能
    • ビジネスニーズや運用要件に応じた柔軟なリソース管理の実現

設定の流れ

  • SSMドキュメントの作成
  • EventBridge用IAMロールの作成
  • EventBridge起動用ルールの作成
  • EventBridge停止用ルールの作成

設定

SSMドキュメントの作成

  • EC2起動用のSSMドキュメント作成

    EC2起動用のSSMドキュメントを作成します。

    1. Systems Manager > ドキュメント > ドキュメント作成 > オートメーションを選択 document-1
    2. SSMドキュメントの作成 document-2 SSMドキュメント名:左上のSSMドキュメント名に任意の名前を設定する。ここでは「Custom-StartEC2ByTag」とする
      SSMドキュメントコード:コードをクリックし、以下コードを記載する
      作成:SSMドキュメント名、コードを記載後、「ランブックを作成」を押下する
      description: Exec AWS-StartEC2Instances Tags:Staging
      schemaVersion: '0.3'
      assumeRole: '{{ AutomationAssumeRole }}'
      parameters:
      TagKey:
          type: String
          default: Environment
          description: (Required) TagKey
      TagValue:
          type: String
          default: Staging
          description: (Required) Staging or Product
          allowedValues:
          - Staging
          - Product
      AutomationAssumeRole:
          type: String
          description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
          default: ''
      mainSteps:
      - name: StartEC2Instances
          action: aws:executeAwsApi
          isEnd: true
          inputs:
          Service: ssm
          Api: StartAutomationExecution
          DocumentName: AWS-StartEC2Instance
          TargetParameterName: InstanceId
          Targets:
              - Key: tag:{{ TagKey }}
              Values:
                  - '{{ TagValue }}'
    
  • EC2停止用のSSMドキュメント作成

    続いてEC2停止用のSSMドキュメントを作成します。
    作成手順は基本的に同じですが、停止用SSMドキュメント向けに以下を変更します。

    1. SSMドキュメントの作成 document-3 SSMドキュメント名:左上のSSMドキュメント名に任意の名前を設定する。ここでは「Custom-StopEC2ByTag」とする
      SSMドキュメントコード:コードをクリックし、以下コードを記載する
      作成:SSMドキュメント名、コードを記載後、「ランブックを作成」を押下する
      description: Exec AWS-StopEC2Instances Tags:Staging
      schemaVersion: '0.3'
      assumeRole: '{{ AutomationAssumeRole }}'
      parameters:
      TagKey:
          type: String
          default: Environment
          description: (Required) TagKey
      TagValue:
          type: String
          default: Staging
          description: (Required) Staging or Product
          allowedValues:
          - Staging
          - Product
      AutomationAssumeRole:
          type: String
          description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
          default: ''
      mainSteps:
      - name: StopEC2Instances
          action: aws:executeAwsApi
          isEnd: true
          inputs:
          Service: ssm
          Api: StartAutomationExecution
          DocumentName: AWS-StopEC2Instance
          TargetParameterName: InstanceId
          Targets:
              - Key: tag:{{ TagKey }}
              Values:
                  - '{{ TagValue }}'
    

EventBridge用IAMロールの作成

IAMロールの作成手順は省略いたします。
以前ご紹介した記事を参考に、以下値を設定してください。
なお、本記事の手順ではIAMロール名は「ec2-start-stop-role」とします。

  • IAMロールの作成

信頼関係に以下を設定します。

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

ポリシーは以下を設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ssm:StartAutomationExecution",
                "ssm:StopAutomationExecution",
                "ec2:StartInstances",
                "ec2:StopInstances",
                "tag:GetResources"
            ],
            "Resource": "*"
        }
    ]
}

EventBridge起動用ルールの作成

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

  • ルールの作成

    1. EventBridge > ルール > ルールを作成を選択 eventbridge-start-ec2-1

    2. ルールの詳細 eventbridge-start-ec2-2 名前:分かりやすい名前を入力(例ではstart-ec2-by-tag)
      説明:必要があれば変更
      ルールタイプ:スケジュール
      「続行してルールを作成する」を押下

    3. スケジュールを定義 ここでは実行タイミングをCron式で指定します。 eventbridge-start-ec2-3 スケジュールパターン:特定の時刻
      Cron式:

      時間 日付 曜日
      0 23 ? * MON-FRI *
        ※Cron式について
        EventBridgeのタイムゾーンはUTCです。
        日本時間での設定を想定している場合は、その時間の9時間前を設定する必要があります。
        「以後 10 回のトリガー日」の横にあるプルダウンでローカルタイムゾーンを選択すると、JSTでの実行時刻を確認することができます。
      
    4. ターゲットを選択 ここでは実行する内容(今回はEC2の起動)を指定します。 eventbridge-start-ec2-4 ターゲットタイプ:AWSのサービス
      ターゲットを選択:Systems Managerオートメーション
      ドキュメント:上記で作成したSSMドキュメント名。ここではCustom-StartEC2ByTag
      TagKey:Environment
      TagValue:Staging
      実行ロール:既存のロールを使用、作成したIAMロールを選択する。ここではec2-start-stop-role

    5. タグを追加 eventbridge-start-ec2-5 必要があればタグを追加し、次へを押下

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

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

EventBridge停止用ルールの作成

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

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

    • ルールの詳細 eventbridge-stop-ec2-1
      • 名前:分かりやすい名前を入力(例ではstop-ec2-by-tag)
    • スケジュールを定義 eventbridge-stop-ec2-2

      • Cron式:
      時間 日付 曜日
      0 10 ? * MON-FRI *
    • ターゲットを選択

      • ドキュメント:上記で作成したSSMドキュメント名。ここではCustom-StopEC2ByTag

これで停止用のルールも作成完了です。
eventbridge-end 作成したルールが一覧に表示されていることを確認します。

動作確認

指定した時刻にタグが設定されたEC2インスタンスだけが起動・停止されることを確認します。

おわりに

今回は以前ご紹介した記事の応用編として、タグによるEC2インスタンスの自動起動・停止の実装方法をまとめました。
SSMドキュメントとタグを活用したEC2インスタンス管理は、運用の効率化とコスト最適化を同時に実現するアプローチです。Lambdaを使用しないシンプルな構成と、タグによる柔軟な制御を組み合わせることで、より洗練されたクラウドリソース管理が可能になります。

記事では例としてタグキー「Environment」、タグバリュー「Staging」を使用しましたが、SSMドキュメント内の「parameters」セクションを修正することで、環境固有のタグ設定に対応可能です。
SSMドキュメントのパラメーターをカスタマイズすることで、組織固有のニーズに合わせた細やかな制御が実現できますので、是非活用してみてください。

参考

本記事は、以下記事を参考に、SSMドキュメント内容を少し修正させていただきました。
【AWS】オートメーションでEC2を自動停止・起動する手順(画像付き)