Systems Manager Automation に承認ステップを入れる方法 ── aws:approve と State Manager で定期メンテナンスを回す
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
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を選択
- InstanceId:
「スケジュールを指定」で、以下を設定します。
- 「スケジュールあり」を選択
- 指定: 「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)に同じ流れで実行され、そのたびに承認を待ちます。