EC2 の起動・停止をタグで自動化する ❘ EventBridge Scheduler × Lambda 構成
はじめに
複数 EC2 インスタンスをタグで絞り込み、Lambda 関数と EventBridge Scheduler を用いて自動起動・停止をスケジューリングする方法を試してみました。
EC2 インスタンスの台数が少ない場合は、インスタンス ID を直接指定する方法で、十分対応が可能です。
しかし、何十台もの 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": "*"
}
]
}
- ロールを作成
- 上記の許可ポリシーをアタッチ
- 信頼されたエンティティ:Lambda
2. EventBridge 用 IAM ロール
EventBridge Scheduler が Lambda 関数を呼び出す(InvokeFunction)ために必要な権限を付与した IAM ロールを作成します。Resource に起動用・停止用の Lambda 関数の ARN を指定することで、実行対象を絞り込んでいます。
- 許可ポリシーを作成
※ アカウント 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関数名(停止用)>"
]
}
]
}
- ロールを作成
- 上記の許可ポリシーをアタッチ
- 信頼されたエンティティ:下記のカスタム信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Lambda 関数を作成
EC2 インスタンスを起動する関数と、停止する関数の 2 種類を作成します。
1. EC2 起動用 Lambda 関数
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 関数
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 関数が問題なく動くかをテストします。
- 対象 EC2 インスタンスの状態を確認する
- Lambda 関数でテストイベントを作成(イベント JSON はデフォルトのままでOK)
- テストを実行
- OUTPUT 部分に、起動または停止したインスタンスIDが表示されれば完了

EventBridge Scheduler を作成する
EC2 インスタンスの起動 / 停止を自動でスケジューリングするために作成します。
※ 下記は、8:00 〜 20:00 まで起動する場合を想定
1. EC2 起動用 スケジュール
-
スケジュールのパターン
- 頻度:定期的なスケジュール
- タイムゾーン:東京
- スケジュールの種類:cron ベースのスケジュール
- cron 式:
cron(0 8 ? * MON-FRI *) - フレックスタイムウィンドウ:5 分

-
ターゲットの選択
- テンプレート化されたターゲット:AWS Lambda(invoke)
- Invoke:作成済みの「EC2 起動用 Lambda 関数」を選択

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

- スケジュールの確認と作成
- 「スケジュールを作成」→完了
2. EC2 停止用 スケジュール
「1. EC2 起動用スケジュール」と同手順で作成します。下記部分のみ変更します。
- スケジュールのパターン
- cron 式:
cron(0 20 ? * MON-FRI *)
- cron 式:
- ターゲットの選択
- Invoke:作成済みの「EC2 停止用 Lambda 関数」を選択
動作確認
- EC2 インスタンスを起動または停止状態にして、スケジュールの実行時刻まで待機します。
- 実行時刻に、対象の EC2 インスタンスが起動または停止することを確認します。
- CloudWatch Logs に起動または停止したインスタンスIDが出力されていれば成功です。
まとめ
本記事では、EventBridge Scheduler で自動起動・停止をスケジューリングし、Lambda 関数で起動・停止を実行する方法を紹介しました。
EC2 インスタンスにタグを付けるだけで管理対象に追加できるため、インスタンスが何十台に増えた場合も対応できます。
コスト削減の仕組みづくりにぜひ活用してみてください。
なお、Lambda 関数を使う方法のほかに、SSM オートメーションを使用する方法もあります。
詳細は弊社のブログをご覧ください。
参考資料
- Lambda 関数を使用して EC2 インスタンスを定期的に停止し、起動する | AWS re:Post
- スケジュールに従って実行する Amazon EventBridge ルールの作成
- EventBridge Schedulerでインスタンスを平日12〜16時に起動するよう設定してみた | DevelopersIO
- Amazon EventBridgeからEC2インスタンスを起動・停止・再起動する簡易な方法5選 | DevelopersIO
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました。





