EC2 の起動・停止をタグで自動化する ❘ EventBridge Scheduler × Lambda 構成

EC2 の起動・停止をタグで自動化する ❘ EventBridge Scheduler × Lambda 構成

2026.06.24

はじめに

複数 EC2 インスタンスをタグで絞り込み、Lambda 関数と EventBridge Scheduler を用いて自動起動・停止をスケジューリングする方法を試してみました。
EC2 インスタンスの台数が少ない場合は、インスタンス ID を直接指定する方法で、十分対応が可能です。
しかし、何十台もの EC2 インスタンスをまとめて管理したい場合は、タグを使って対象インスタンスを一括で絞り込み、自動起動・停止をスケジューリングする方法が有効です。

構成の全体図

今回検証した構成図はこちらです。
名称未設定ファイル.drawio (2)

前提条件

  • 対象 EC2 インスタンスが存在すること
  • マネジメントコンソールを操作する権限があること

対象 EC2 インスタンスにタグを付ける

タグエディタなどを使用して、あらかじめ対象インスタンスにタグを付与します。

EC2 に付与するタグの例
キー:AutoSchedule
値:true

IAM ロールを作成

1. Lambda 用 IAM ロール

Lambda 関数が CloudWatch Logs へのログ出力と、EC2 インスタンスの参照(DescribeInstances)・起動(StartInstances)・停止(StopInstances)を行うために必要な権限を付与したロールを作成します。

1. 許可ポリシーを作成する

許可ポリシー例
{
    "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",
                "ec2:DescribeInstances"
            ],
            "Resource": "*"
        }
    ]
}
  1. ロールを作成
    • 上記の許可ポリシーをアタッチ
    • 信頼されたエンティティ:Lambda

2. EventBridge 用 IAM ロール

EventBridge Scheduler が Lambda 関数を呼び出す(InvokeFunction)ために必要な権限を付与した IAM ロールを作成します。Resource に起動用・停止用の Lambda 関数の ARN を指定することで、実行対象を絞り込んでいます。

  1. 許可ポリシーを作成
    ※ アカウント ID と Lambda 関数名は各自の環境に合わせて置き換えてください。
許可ポリシー例
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:ap-northeast-1:<アカウントID>:function:<Lambda関数名(起動用)>",
                "arn:aws:lambda:ap-northeast-1:<アカウントID>:function:<Lambda関数名(停止用)>"
            ]
        }
    ]
}
  1. ロールを作成
    • 上記の許可ポリシーをアタッチ
    • 信頼されたエンティティ:下記のカスタム信頼ポリシー
カスタム信頼ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Lambda 関数を作成

EC2 インスタンスを起動する関数と、停止する関数の 2 種類を作成します。

1. EC2 起動用 Lambda 関数

Lambda 関数(Python 3.14)
import boto3

ec2 = boto3.client('ec2', region_name='ap-northeast-1')

def lambda_handler(event, context):
    # タグ AutoSchedule=true かつ停止中のインスタンスを取得
    response = ec2.describe_instances(
        Filters=[
            {'Name': 'tag:AutoSchedule', 'Values': ['true']},
            {'Name': 'instance-state-name', 'Values': ['stopped']}
        ]
    )

    instance_ids = [
        i['InstanceId']
        for r in response['Reservations']
        for i in r['Instances']
    ]

    if not instance_ids:
        print('起動対象のインスタンスがありません')
        return

    ec2.start_instances(InstanceIds=instance_ids)
    print('起動したインスタンス: ' + str(instance_ids))

2. EC2 停止用 Lambda 関数

Lambda 関数(Python 3.14)
import boto3

ec2 = boto3.client('ec2', region_name='ap-northeast-1')

def lambda_handler(event, context):
    # タグ AutoSchedule=true かつ起動中のインスタンスを取得
    response = ec2.describe_instances(
        Filters=[
            {'Name': 'tag:AutoSchedule', 'Values': ['true']},
            {'Name': 'instance-state-name', 'Values': ['running']}
        ]
    )

    instance_ids = [
        i['InstanceId']
        for r in response['Reservations']
        for i in r['Instances']
    ]

    if not instance_ids:
        print('停止対象のインスタンスがありません')
        return

    ec2.stop_instances(InstanceIds=instance_ids)
    print('停止したインスタンス: ' + str(instance_ids))

Lambda 関数をテストする

作成した 2 種類の Lambda 関数が問題なく動くかをテストします。

  1. 対象 EC2 インスタンスの状態を確認する
  1. Lambda 関数でテストイベントを作成(イベント JSON はデフォルトのままでOK)
  2. テストを実行
  3. OUTPUT 部分に、起動または停止したインスタンスIDが表示されれば完了
    CleanShot 2026-06-08 at 14.03.12@2x

EventBridge Scheduler を作成する

EC2 インスタンスの起動 / 停止を自動でスケジューリングするために作成します。
※ 下記は、8:00 〜 20:00 まで起動する場合を想定

1. EC2 起動用 スケジュール

  1. スケジュールのパターン

    • 頻度:定期的なスケジュール
    • タイムゾーン:東京
    • スケジュールの種類:cron ベースのスケジュール
    • cron 式:cron(0 8 ? * MON-FRI *)
    • フレックスタイムウィンドウ:5 分
      CleanShot 2026-06-08 at 14.12.07@2x
  2. ターゲットの選択

    • テンプレート化されたターゲット:AWS Lambda(invoke)
    • Invoke:作成済みの「EC2 起動用 Lambda 関数」を選択
      CleanShot 2026-06-08 at 14.20.06@2x

3. スケジュール完了後のアクション:NONE
4. アクセス許可:作成済みの 「EventBridge 用ロール」を選択

CleanShot 2026-06-08 at 14.22.37@2x

  1. スケジュールの確認と作成
    • 「スケジュールを作成」→完了

2. EC2 停止用 スケジュール

「1. EC2 起動用スケジュール」と同手順で作成します。下記部分のみ変更します。

  1. スケジュールのパターン
    • cron 式:cron(0 20 ? * MON-FRI *)
  2. ターゲットの選択
    • Invoke:作成済みの「EC2 停止用 Lambda 関数」を選択

動作確認

  • EC2 インスタンスを起動または停止状態にして、スケジュールの実行時刻まで待機します。
  • 実行時刻に、対象の EC2 インスタンスが起動または停止することを確認します。
  • CloudWatch Logs に起動または停止したインスタンスIDが出力されていれば成功です。

まとめ

本記事では、EventBridge Scheduler で自動起動・停止をスケジューリングし、Lambda 関数で起動・停止を実行する方法を紹介しました。
EC2 インスタンスにタグを付けるだけで管理対象に追加できるため、インスタンスが何十台に増えた場合も対応できます。
コスト削減の仕組みづくりにぜひ活用してみてください。

なお、Lambda 関数を使う方法のほかに、SSM オートメーションを使用する方法もあります。
詳細は弊社のブログをご覧ください。

参考資料

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました。

この記事をシェアする

関連記事