開発・検証用のEC2を業務時間外も動かし続けると、同じスペックでも稼働時間ぶんのコストがかかります。手動で止め忘れるリスクも高く、複数の環境を管理するとすぐに運用が破綻します。
この記事では、AWS Systems Manager(SSM)のAutomation機能を使って、EC2インスタンスのスケジュール起動・停止を完全自動化する設計手順を解説します。EventBridgeスケジューラと組み合わせることで、「平日9時に起動→20時に停止」といった電源管理をcron感覚で設定できます。
AWS CLI v2・Amazon Linux 2023環境で動作確認しています。
この記事のポイント
・SSM AutomationはEC2操作の実行ログがSystems Managerコンソールに残り監査対応にも使える
・EventBridgeスケジューラのcron式でJSTタイムゾーン指定(Asia/Tokyo)が可能
・プライベートサブネット構成ではVPCエンドポイント3本でNATゲートウェイが不要になる
・IAMロールは「SSMAutomationRole」と「EventBridgeSchedulerRole」の2つが必要
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
AWS SSM Automationとは(設計に入る前の基礎知識)
SSM AutomationはAWS Systems Managerが提供するオーケストレーションサービスです。「ランブック(Runbook)」と呼ばれる実行手順書をYAML/JSON形式で定義し、EC2の起動・停止・AMI取得・パッチ適用といった運用タスクを自動実行できます。SSM Automationを使う主なメリット:
・マネジメントコンソールとIAMに操作履歴が残り、誰がいつ何を実行したか追跡できる
・踏み台サーバーやSSH接続が不要(VPCエンドポイント経由で通信可能)
・AWS標準ランブック(AWS-StartEC2Instance / AWS-StopEC2Instance)をそのまま利用できる
・EventBridgeと連携してスケジュール実行できる
EC2のスケジュール管理にLambda関数を使う方法もありますが、SSM Automationは実行ログがSystems Managerコンソールに集約されるため、障害調査や監査対応の際に確認箇所が一か所で済む利点があります。
SSM AutomationでEC2をスケジュール起動・停止する設計手順
設計の全体像は「IAMロール作成 → SSM Agent確認 → ランブック動作確認 → EventBridgeスケジュール設定」の4ステップです。1. IAMロール(SSMAutomationRole)を作成する
SSM AutomationがEC2を操作するための実行ロールが必要です。信頼ポリシーで `ssm.amazonaws.com` を許可し、AWS管理ポリシー `AmazonSSMAutomationRole` をアタッチします。# 信頼ポリシーファイルを作成 cat << 'EOF' > /tmp/ssm-trust.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ssm.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF # IAMロール作成 aws iam create-role --role-name SSMAutomationRole --assume-role-policy-document file:///tmp/ssm-trust.json # AWS管理ポリシーをアタッチ aws iam attach-role-policy --role-name SSMAutomationRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole
create-role の実行結果例:{ "Role": { "Path": "/", "RoleName": "SSMAutomationRole", "RoleId": "AROAXXXXXXXXXXXXXXXXX", "Arn": "arn:aws:iam::123456789012:role/SSMAutomationRole", "CreateDate": "2026-10-01T08:30:00+00:00" } }
2. 対象EC2にSSM Agentが動いているか確認する
Amazon Linux 2023にはSSM Agentが標準インストールされています。EC2上でステータスを確認しましょう。# EC2上でSSM Agentのステータス確認 sudo systemctl status amazon-ssm-agent
* amazon-ssm-agent.service - amazon-ssm-agent Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; preset: enabled) Active: active (running) since Wed 2026-10-01 08:00:01 UTC; 12h ago Main PID: 1234 (amazon-ssm-agen)
AmazonSSMManagedInstanceCore ポリシーがないと、Systems ManagerがEC2を「管理対象インスタンス」として認識しません。AWS CLIで登録状況を確認します。aws ssm describe-instance-information --filters "Key=InstanceIds,Values=i-0abc1234def567890" --query "InstanceInformationList[*].{ID:InstanceId,Ping:PingStatus,OS:PlatformName}" --output table
-------------------------------------------------------------- | DescribeInstanceInformation | +----------------------+-------------------+----------------+ | ID | OS | Ping | +----------------------+-------------------+----------------+ | i-0abc1234def567890 | Amazon Linux 2023 | Online | +----------------------+-------------------+----------------+
Ping が Online になっていれば、Automationからの操作が可能な状態です。3. AWS標準ランブックで動作確認する
AWSが用意しているAWS-StartEC2Instance(起動)・AWS-StopEC2Instance(停止)ランブックをAWS CLIで手動実行して動作を確かめます。# EC2を起動するAutomationを手動実行 aws ssm start-automation-execution --document-name "AWS-StartEC2Instance" --parameters "InstanceId=i-0abc1234def567890,AutomationAssumeRole=arn:aws:iam::123456789012:role/SSMAutomationRole"
{ "AutomationExecutionId": "4105a4fc-f944-11ed-a05b-0a1b2c3d4e5f" }
aws ssm get-automation-execution --automation-execution-id "4105a4fc-f944-11ed-a05b-0a1b2c3d4e5f" --query "AutomationExecution.{Status:AutomationExecutionStatus}" --output json # 正常終了時の出力 { "Status": "Success" }
Success が確認できたら次のステップに進みます。4. EventBridgeスケジューラでAutomation実行を自動化する
手動実行が確認できたら、EventBridgeスケジューラでcron式を使ってスケジュール化します。EventBridgeスケジューラにはJSTタイムゾーン指定(Asia/Tokyo)ができるため、UTC換算で考える必要がありません。EventBridgeスケジューラがSSM Automationを呼び出すためのIAMロール(EventBridgeSchedulerRole)も先に作成しておきます。このロールには
ssm:StartAutomationExecution と iam:PassRole の権限が必要です。# 平日9時(JST)に起動するスケジュールを作成 aws scheduler create-schedule --name "ec2-start-weekday-morning" --schedule-expression "cron(0 9 ? * MON-FRI *)" --schedule-expression-timezone "Asia/Tokyo" --target '{ "Arn": "arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StartEC2Instance", "RoleArn": "arn:aws:iam::123456789012:role/EventBridgeSchedulerRole", "Input": "{"InstanceId":["i-0abc1234def567890"],"AutomationAssumeRole":["arn:aws:iam::123456789012:role/SSMAutomationRole"]}" }' --flexible-time-window '{"Mode": "OFF"}' # 平日20時(JST)に停止するスケジュールを作成 aws scheduler create-schedule --name "ec2-stop-weekday-evening" --schedule-expression "cron(0 20 ? * MON-FRI *)" --schedule-expression-timezone "Asia/Tokyo" --target '{ "Arn": "arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StopEC2Instance", "RoleArn": "arn:aws:iam::123456789012:role/EventBridgeSchedulerRole", "Input": "{"InstanceId":["i-0abc1234def567890"],"AutomationAssumeRole":["arn:aws:iam::123456789012:role/SSMAutomationRole"]}" }' --flexible-time-window '{"Mode": "OFF"}'
aws scheduler get-schedule --name "ec2-start-weekday-morning" --query "{Expression:ScheduleExpression,Timezone:ScheduleExpressionTimezone,State:State}" # 出力例 { "Expression": "cron(0 9 ? * MON-FRI *)", "Timezone": "Asia/Tokyo", "State": "ENABLED" }
コスト削減に直結するVPC設計パターン
プライベートサブネット内のEC2に対してSSM Automationを実行する場合、インターネット経由ではなくVPCエンドポイントを使う設計が推奨されます。NATゲートウェイには処理データ量に応じた課金(0.062 USD/GB)があるため、SSMのAPI通信をVPCエンドポイント経由に切り替えることでコストを削減できます。SSM AutomationをプライベートEC2で動かすために必要なVPCエンドポイント(インターフェース型)は3つです:
・
com.amazonaws.ap-northeast-1.ssm(SSM APIエンドポイント)・
com.amazonaws.ap-northeast-1.ssmmessages(SSM Agentとのセッション通信)・
com.amazonaws.ap-northeast-1.ec2messages(SSM AgentのEC2メッセージング)VPCエンドポイントを作成するAWS CLI例(ssm):
aws ec2 create-vpc-endpoint --vpc-id vpc-0a1b2c3d4e5f67890 --service-name com.amazonaws.ap-northeast-1.ssm --vpc-endpoint-type Interface --subnet-ids subnet-0a1b2c3d4e5f67890 --security-group-ids sg-0a1b2c3d4e5f67890 --private-dns-enabled
スケジュール起動後にSSM AutomationがEC2に指示を送る際、起動直後はSSM AgentがSSMサービスへの接続を確立するまで数十秒かかります。起動後すぐに次のAutomationを連続実行する設計の場合は、ランブック内にウェイトステップ(
aws:waitForAwsResourceProperty)を追加して、インスタンスの状態が running になってから次の処理に移るよう制御するのがポイントです。よくあるエラーと対処法
「AccessDeniedException: not authorized to perform ssm:StartAutomationExecution」
AutomationRoleにssm:StartAutomationExecution が無いか、EventBridgeスケジューラが iam:PassRole を持っていない場合に発生します。まずIAMロールにアタッチされているポリシーを確認します。# SSMAutomationRoleのポリシーを確認 aws iam list-attached-role-policies --role-name SSMAutomationRole # 出力例 { "AttachedPolicies": [ { "PolicyName": "AmazonSSMAutomationRole", "PolicyArn": "arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole" } ] }
ssm:StartAutomationExecution と iam:PassRole(リソース: SSMAutomationRoleのARN)が必要です。Automation実行がInProgressのまま進まない
EC2のIAMロールにAmazonSSMManagedInstanceCore が無い、またはVPCエンドポイントが未設定でSSM AgentがAWSエンドポイントに到達できていないケースで発生します。# SSM Agentのログを確認(EC2上で実行) sudo tail -50 /var/log/amazon/ssm/amazon-ssm-agent.log # VPCエンドポイント経由での疎通確認(EC2上) curl -s https://ssm.ap-northeast-1.amazonaws.com/ping # 正常時の出力 {"PingStatus":"Success"}
スケジュール時刻がズレる(タイムゾーン設定ミス)
--schedule-expression-timezone を省略するとUTCで動作します。JST(UTC+9)で設定したい場合は必ず Asia/Tokyo を指定します。設定済みのスケジュールはいつでも確認できます。aws scheduler get-schedule --name "ec2-start-weekday-morning" --query "{Expression:ScheduleExpression,Timezone:ScheduleExpressionTimezone}" # タイムゾーン未設定だった場合の出力(UTC動作になる) { "Expression": "cron(0 0 ? * MON-FRI *)", "Timezone": "UTC" }
本記事のまとめ
| やりたいこと | 使うコマンド・設定 |
|---|---|
| EC2がSSM管理対象か確認 | aws ssm describe-instance-information --filters "Key=InstanceIds,Values=..." |
| Automationを手動実行(起動) | aws ssm start-automation-execution --document-name AWS-StartEC2Instance |
| Automationを手動実行(停止) | aws ssm start-automation-execution --document-name AWS-StopEC2Instance |
| Automation実行状況の確認 | aws ssm get-automation-execution --automation-execution-id <ID> |
| EventBridgeスケジュールの作成 | aws scheduler create-schedule --schedule-expression "cron(...)" |
| スケジュール設定の確認 | aws scheduler get-schedule --name <スケジュール名> |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AWS SSM Association でマルチAZ環境のパッチ適用を自動化する構成設計|State Manager活用
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます