AWS SSM Automationで実現するEC2スケジュール起動停止設計|コスト削減VPC運用パターン

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > AWS(Amazon Linux) > AWS SSM Automationで実現するEC2スケジュール起動停止設計|コスト削減VPC運用パターン
「EC2インスタンスを夜中も起動しっぱなしにして、月末のAWS請求に驚いたことはありませんか。」
開発・検証用の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つが必要


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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)

SSM Agentが動いていても、EC2インスタンスにアタッチしたIAMロールに 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"

実行IDが返ります:

{ "AutomationExecutionId": "4105a4fc-f944-11ed-a05b-0a1b2c3d4e5f" }

実行IDを使ってステータスを確認します:

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" }

Amazon Linuxを使ったEC2の基本的なサーバー構築・初期設定については、AWSのAmazon Linux運用入門も参考にしてください。

コスト削減に直結する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

3つのエンドポイントを同様に作成することで、EC2はNATゲートウェイを通らずにSSMと通信できます。

スケジュール起動後に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" } ] }

EventBridgeSchedulerRoleにはインラインポリシーまたはカスタムポリシーで 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 <スケジュール名>
SSM AutomationとEventBridgeスケジューラの組み合わせは、EC2の電源管理を最もシンプルに自動化できる構成です。Lambda関数を書く必要がなく、実行ログがSystems Managerコンソールに集約されるため、監査対応が必要な環境にも向いています。プライベートサブネット構成ではVPCエンドポイントを3つ(ssm / ssmmessages / ec2messages)追加することで、NATゲートウェイなしに動作します。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、AWSのAmazon Linux運用入門ガイドでは、LinuxサーバーをAWS上で構築・運用するための実践的な手順をまとめています。合わせてご覧ください。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。