Systems Manager Automation に承認ステップを入れる方法 ── aws:approve と State Manager で定期メンテナンスを回す

目次

概要

毎週のヘルスチェック、毎日のパッチ適用、異常時の修復。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 が要ります。

aws:approve で待機し、承認なら次のステップへ、拒否ならそこで止まる
aws:approve で待機し、承認なら次のステップへ、拒否ならそこで止まる
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

ハンズオンガイド8 ステップ画面 7 枚

コンソールの横に開いて、チェックしながら進めましょう。

ガイドを開く

別タブで開きます。チェックはこのブラウザに保存されます。

Systems Manager のマネージドノードになっている EC2 インスタンス soa-maint-web に対して、承認を挟んでヘルスチェックのコマンドを実行するカスタムランブック soa-MaintenanceWithApproval を作ります。週 1 回のスケジュールで State Manager の関連付け soa-weekly-maintenance に登録し、作成直後の実行が承認待ちで止まること、コンソールで承認するとヘルスチェックまで進むことを確かめます。

前提条件

  • リージョン: ap-northeast-1(東京)
  • 以下のリソースが作成済みであること

まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。

リソース種別リソース名内容作り方の参考
EC2 インスタンスsoa-maint-webSystems 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
ランブックのコードエディタ(aws:approve と aws:runCommand の 2 ステップ)
ランブックのコードエディタ(aws:approve と aws:runCommand の 2 ステップ)

画面上部の 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 を選択
関連付けの作成画面(ドキュメント・シンプルな実行・3 つの入力パラメータ)
関連付けの作成画面(ドキュメント・シンプルな実行・3 つの入力パラメータ)

「スケジュールを指定」で、以下を設定します。

  • 「スケジュールあり」を選択
  • 指定: 「CRON/Rate 式」を選び、cron(0 2 ? * SUN *) を入力する(毎週日曜日の 02:00 UTC。「CRON スケジュールビルダー」で組み立ててもよい)

その他の項目はデフォルトのままにし、「関連付けの作成」をクリックします。

関連付けのスケジュール設定(毎週日曜日の cron 式)
関連付けのスケジュール設定(毎週日曜日の cron 式)

関連付けは作成した直後に 1 回実行されます。ここでは次の週を待たずに、この最初の実行で承認の流れを確かめます。

手順 4: 承認待ちになったことを確かめる

左側ナビゲーションの「変更管理ツール」→「オートメーション」を選択します。ドキュメント名が soa-MaintenanceWithApproval の実行が「待機中」になっています。実行 ID をクリックすると、「実行したステップ」の approveMaintenance が待機中で、runHealthCheck はまだ実行されていないことが分かります。

soa-MaintenanceWithApproval の実行の詳細(approveMaintenance が待機中)
soa-MaintenanceWithApproval の実行の詳細(approveMaintenance が待機中)
クラウドおさる

当番表どおりに手順書は動き出したでござるが、長老の判子が押されるまで扉の前で待っているのでござるな。勝手に倉庫へ入らないのが、この仕掛けの肝でござる。

手順 5: コンソールで承認する

実行の詳細の画面で「アクション」→「承認/拒否」を選択します。承認の画面に「リクエスタからのメッセージ」(ランブックの Message)が表示されます。以下を入力して「送信」をクリックします。

  • 決定事項: 「承認」
  • コメント – オプション: 週次ヘルスチェックを承認
承認/拒否の画面(承認を選んでコメントを入力)
承認/拒否の画面(承認を選んでコメントを入力)

手順 6: ヘルスチェックまで進んだことを確かめる

10 秒ほど待ってから実行の詳細を更新します。実行ステータスが「成功」になり、「実行したステップ」の approveMaintenance と runHealthCheck がどちらも「成功」になっていることを確認します。

実行の詳細(全体ステータスが成功し、2 つのステップが成功)
実行の詳細(全体ステータスが成功し、2 つのステップが成功)

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

runHealthCheck のステップの詳細(uptime・df・free の出力)
runHealthCheck のステップの詳細(uptime・df・free の出力)

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 の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次