概要
毎週のヘルスチェック、毎日のパッチ適用、異常時の修復。EC2 の定期メンテナンスを自動化したいけれど、本番環境に手を入れる前には担当者の承認を挟みたい。そんな要件は珍しくありません。
Systems Manager Automation のランブックには、実行を一時停止して承認を待つアクション aws:approve があります。承認者が承認すると次のステップへ進み、拒否するとそこで止まります。このランブックを State Manager の関連付けに登録すれば、cron 式や rate 式のスケジュールで定期的に実行でき、実行の履歴も Systems Manager に残ります。Session Manager で手作業する、Lambda 関数でメンテナンスの仕組みを自作する、といった方法より管理するものが少なく済みます。
この記事では、承認付きのランブックの書き方と、State Manager でスケジュール実行する仕組みを整理します。実践では、承認ステップとヘルスチェックのステップを持つカスタムランブックを作り、State Manager の関連付けから実行して、コンソールで承認すると処理が進むところまでを確かめます。

クラウドおさる倉庫の棚卸しは毎週の決まり仕事でござるが、扉を開ける前には長老のひと言が要る。今日は「決まった日に勝手に始まり、長老がうなずいたら先へ進む」手順書を作るでござるよ。
この記事のメリット
- Automation のランブックに
aws:approveで承認ステップを入れられるようになる - 承認待ちのオートメーションを、コンソールから承認・拒否できるようになる
- State Manager の関連付けで、ランブックを cron 式・rate 式のスケジュールで実行できるようになる
- 定期メンテナンスの自動化で、Session Manager の手作業や Lambda の自作ではなく Automation と State Manager を選ぶ理由を説明できるようになる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。


クラウドおさる



はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
定期メンテナンスを自動化する方法の比較
| 方法 | スケジュール | 承認 | 実行の記録 | 管理するもの |
|---|---|---|---|---|
| Automation のランブック + State Manager の関連付け | cron 式・rate 式 | aws:approve で挟める | 実行の履歴が Systems Manager に残る | ランブック(YAML / JSON)と関連付け |
| Session Manager で担当者が手作業 | 人が覚えておく | 運用ルール頼み | セッションのログを別に設定 | 手順書と担当者 |
| Lambda 関数で自作し、EventBridge で定期実行 | EventBridge のスケジュール | 自作が要る | 自作が要る | 関数のコード・ランタイム・権限 |
Automation には、パッチの適用(Run Command の AWS-RunPatchBaseline など)、コマンドの実行、AWS API の呼び出し、承認待ちといった定義済みのアクションがそろっています。これを組み合わせたランブックを State Manager に登録するのが、最も手数の少ない形です。



手順書(ランブック)、当番表(State Manager)、長老の判子(aws:approve)を Systems Manager の中だけでそろえられるのが、この組み合わせの良いところでござるな。
aws:approve のしくみ
aws:approve のステップに来ると、オートメーションは待機中になり、承認者の判断を待ちます。主な入力は次のとおりです。
| 入力 | 必須 | 内容 |
|---|---|---|
Approvers | 必須 | 承認できるプリンシパル(最大 10)。IAM ユーザー名、IAM ユーザーの ARN、IAM ロールの ARN、引き受けたロールの ARN で指定する |
MinRequiredApprovals | 任意 | 再開に必要な承認の数(既定 1) |
Message | 任意 | 承認依頼の通知に入れるメッセージ |
NotificationArn | 任意 | 承認が必要になったことを知らせる SNS トピックの ARN(トピック名は Automation で始める) |
承認者はコンソールの「オートメーション」で待機中の実行を開き、「承認」か「拒否」を選んで送信します。SNS の通知は任意なので、通知なしでもコンソールから承認できます。待機の既定のタイムアウトは 7 日(最大 30 日)で、ステップの timeoutSeconds で変えられます。
- name: approveMaintenance
action: aws:approve
timeoutSeconds: 3600
onFailure: Abort
inputs:
Approvers: '{{ Approvers }}'
MinRequiredApprovals: 1
Message: Approve the weekly health check of soa-maint-web.


aws:approve は、1 回の実行で複数のアカウント・リージョンへ広げるマルチアカウント・マルチリージョンのオートメーションではサポートされないと、ドキュメントに書かれているのでござる。複数のアカウントで承認を挟むなら、どこで実行して誰が承認するかを先に決めておくでござるぞ。
State Manager の関連付けでスケジュール実行する
State Manager の関連付けにランブックを指定すると、次の設定でオートメーションを実行します。
| 設定 | 内容 |
|---|---|
| 実行方法 | シンプルな実行(インスタンス ID などを入力パラメータで指定)か、レート制御(タグやリソースグループでフリート全体を対象にし、同時実行数とエラーのしきい値を決める) |
| 入力パラメータ | ランブックの必須パラメータ。AutomationAssumeRole にはランブックが引き受けるロールの ARN を必ず指定する |
| スケジュール | cron 式または rate 式。スケジュールなしなら 1 回だけ |
関連付けは作成した直後に 1 回実行され、その後はスケジュールに従って実行されます。CLI の create-association では --target-locations で複数のアカウント・リージョンを対象にでき、その場合は管理用アカウントの AWS-SystemsManager-AutomationAdministrationRole と、対象の各アカウントの AWS-SystemsManager-AutomationExecutionRole が要ります。


実践
Systems Manager のマネージドノードになっている EC2 インスタンス soa-maint-web に対して、承認を挟んでヘルスチェックのコマンドを実行するカスタムランブック soa-MaintenanceWithApproval を作ります。週 1 回のスケジュールで State Manager の関連付け soa-weekly-maintenance に登録し、作成直後の実行が承認待ちで止まること、コンソールで承認するとヘルスチェックまで進むことを確かめます。
前提条件
- リージョン:
ap-northeast-1(東京) - 以下のリソースが作成済みであること
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| EC2 インスタンス | soa-maint-web | Systems Manager のマネージドノード(Amazon Linux 2023、t3.micro、AmazonSSMManagedInstanceCore を付けたインスタンスプロファイル) | AWS Systems Manager でインスタンスをリモート管理する |
| IAM ロール | soa-maintenance-automation-role | ランブックが引き受けるロール(Run Command の実行と結果の参照を許可) | AWS IAM でユーザー・ロール・ポリシーを作成しアクセス制御する |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| Automation ランブック(カスタム) | soa-MaintenanceWithApproval | 承認を待ってからヘルスチェックのコマンドを実行する |
| State Manager の関連付け | soa-weekly-maintenance | ランブックを週 1 回実行する |
手順 1: 承認者の ARN とインスタンス ID を控える
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。
承認者には、いまコンソールにサインインしている自分を指定します。コンソール下部の「CloudShell」をクリックし、次のコマンドで自分の ARN を表示して控えます。IAM ユーザーなら arn:aws:iam::<アカウントID>:user/...、ロールでサインインしているなら arn:aws:sts::<アカウントID>:assumed-role/... の形になります。
aws sts get-caller-identity --query Arn --output text続けて、EC2 のコンソールで soa-maint-web のインスタンス ID(i- で始まる値)を、IAM のコンソールで soa-maintenance-automation-role の ARN を控えておきます。
手順 2: 承認付きのランブックを作る
上部の検索バーに Systems Manager と入力し、「Systems Manager」を選択します。左側ナビゲーションの「変更管理ツール」→「ドキュメント」を選択し、「Create document」→「Automation」を選択します。
ランブックのビジュアルデザイナーが開きます。初めて開いたときは「開始方法」のウィンドウが出るので、右上の × で閉じます。画面上部で「コード」に切り替え、エディタの内容を次の YAML に置き換えます(キーボードで打ち込むと自動インデントで崩れるので、貼り付けで入れます)。
schemaVersion: '0.3'
description: Weekly health check of an EC2 instance with manual approval.
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
InstanceId:
type: String
description: The ID of the instance to check.
Approvers:
type: StringList
description: The IAM principals that can approve this maintenance.
AutomationAssumeRole:
type: String
description: The role that Automation assumes to run this runbook.
mainSteps:
- name: approveMaintenance
action: aws:approve
timeoutSeconds: 3600
onFailure: Abort
inputs:
Approvers: '{{ Approvers }}'
MinRequiredApprovals: 1
Message: Approve the weekly health check of soa-maint-web.
- name: runHealthCheck
action: aws:runCommand
isEnd: true
inputs:
DocumentName: AWS-RunShellScript
InstanceIds:
- '{{ InstanceId }}'
Parameters:
commands:
- uptime
- df -h /
- free -m

画面上部の NewRunbook の横の鉛筆アイコンをクリックして名前を soa-MaintenanceWithApproval に変え、「ランブックを作成」をクリックします。「自分が所有」タブに soa-MaintenanceWithApproval が表示されることを確認します。
手順 3: State Manager の関連付けを作る
左側ナビゲーションの「ノードツール」→「ステートマネージャー」を選択し、「関連付けの作成」をクリックします。以下を設定します。
- 名前:
soa-weekly-maintenance - ドキュメント: 表から
soa-MaintenanceWithApprovalのラジオボタンを選択(表はページ送りで、自分のドキュメントは後ろのページにあります) - 実行: 「シンプルな実行」
- 入力パラメータ:
- InstanceId:
soa-maint-webのインスタンス ID - Approvers: 手順 1 で控えた自分の ARN(複数指定するときは 1 行に 1 つ)
- AutomationAssumeRole: ドロップダウンで
soa-maintenance-automation-roleを選択


「スケジュールを指定」で、以下を設定します。
- 「スケジュールあり」を選択
- 指定: 「CRON/Rate 式」を選び、
cron(0 2 ? * SUN *)を入力する(毎週日曜日の 02:00 UTC。「CRON スケジュールビルダー」で組み立ててもよい)
その他の項目はデフォルトのままにし、「関連付けの作成」をクリックします。


関連付けは作成した直後に 1 回実行されます。ここでは次の週を待たずに、この最初の実行で承認の流れを確かめます。
手順 4: 承認待ちになったことを確かめる
左側ナビゲーションの「変更管理ツール」→「オートメーション」を選択します。ドキュメント名が soa-MaintenanceWithApproval の実行が「待機中」になっています。実行 ID をクリックすると、「実行したステップ」の approveMaintenance が待機中で、runHealthCheck はまだ実行されていないことが分かります。





当番表どおりに手順書は動き出したでござるが、長老の判子が押されるまで扉の前で待っているのでござるな。勝手に倉庫へ入らないのが、この仕掛けの肝でござる。
手順 5: コンソールで承認する
実行の詳細の画面で「アクション」→「承認/拒否」を選択します。承認の画面に「リクエスタからのメッセージ」(ランブックの Message)が表示されます。以下を入力して「送信」をクリックします。
- 決定事項: 「承認」
- コメント – オプション:
週次ヘルスチェックを承認


手順 6: ヘルスチェックまで進んだことを確かめる
10 秒ほど待ってから実行の詳細を更新します。実行ステータスが「成功」になり、「実行したステップ」の approveMaintenance と runHealthCheck がどちらも「成功」になっていることを確認します。


runHealthCheck のステップ ID をクリックすると、出力に uptime・df -h /・free -m の結果が表示されます。


State Manager に戻って soa-weekly-maintenance を開くと、「実行履歴」タブにこの実行が記録されています。次からは毎週日曜日の 02:00(UTC)に同じ流れで実行され、そのたびに承認を待ちます。



「定期的に動かす」は State Manager、「承認を挟む」は aws:approve、「記録を残す」は Automation の実行の履歴。それぞれの役目を言い分けられれば、メンテナンス自動化の問いで迷わぬでござるよ。
まとめ
| 要件 | 使うもの |
|---|---|
| メンテナンスの手順を定義する | Automation のランブック(aws:runCommand、aws:executeAwsApi など) |
| 実行の前に承認を挟む | aws:approve(コンソールで承認・拒否。SNS 通知は任意) |
| 定期的に実行する | State Manager の関連付け(cron 式・rate 式) |
| 実行を記録する | Automation の実行の履歴、関連付けの実行履歴 |
aws:approveに来たオートメーションは待機中になり、Approversに指定したプリンシパルが承認すると次のステップへ進むApproversには IAM ユーザー、IAM ロールの ARN、引き受けたロールの ARN を指定できる。承認の待機の既定のタイムアウトは 7 日- State Manager の関連付けにランブックを登録すると、cron 式・rate 式で定期実行できる。関連付けは作成直後にも 1 回実行される
- 関連付けでランブックを実行するときは、
AutomationAssumeRoleにランブックが引き受けるロールを指定する aws:approveは、マルチアカウント・マルチリージョンのオートメーションではサポートされない
参照先
- aws:approve – 手動承認のためにオートメーションを一時停止する – AWS Systems Manager
- aws:runCommand – マネージドインスタンスでコマンドを実行する – AWS Systems Manager
- State Manager 関連付けでのオートメーションのスケジュール設定 – AWS Systems Manager
- 複数の AWS リージョン とアカウントでのオートメーションの実行 – AWS Systems Manager
- ランブック作成のためのドキュメントビルダーの使用 – AWS Systems Manager














