SSM Automationを使ってWindows Update実行を自動化

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井です。

今回は依頼を受けて SSM Automation を触ってみます。

突然ですが、ご自身が管理している Windows サーバーのパッチ管理はどうされていますか?
私は基幹系システムを担当することがほとんどだったので、アプリケーションに影響が出る可能性を考慮して Windows Update は無効にしているシステムが多かったように記憶しています。

しかし、クラウド移行を機に、パッチ運用を見直したい、最新パッチを適用していきたいという話をよく頂戴します。

そんな要望に応えるべく SSM Automation で Windows Update を実行する自動化オペレーションを実装します。

動作概要

今回作成する Automation は以下の要領で動作します。

  1. EC2 の起動状態をチェック
  2. 停止の場合
    1. EC2 を起動
    2. Windows Update を実行
    3. EC2 を停止
  3. 起動中の場合
    1. Windows Update を実行

Windows Update を定期実行するだけであれば、
Windows のコントロールパネルから設定すれば良いですが、
今回は停止状態の EC2 を起動させる処理を入れています。

これは常時起動ではない EC2 を対象にするための処理です。
特定用途で日に数時間、週に数時間しか起動しない EC2 に対して
Windows Update を実行する目的です。

前提

SSM セットアップ

この処理は SSM を使います。
SSM のセットアップを行ってください。
手順は本エントリでは割愛します。公式ドキュメントを参照ください。

AWS Systems Manager のセットアップ

SSM Automation の設定

Automation も設定しておきます。
手順は本エントリでは割愛します。公式ドキュメントを参照ください。

Systems Manager 自動化へのアクセスの設定

タグ付け

Windows Update の実行対象とする EC2 にタグを付けます。
タグキー/タグバリューともに任意です。
例えば、キー:ForceWindowsUpdate、バリュー:true などにします。

実装

それでは実装します。
マネジメントコンソールへログインし Systems Manager を開きます。
左側メニューから ドキュメント をクリックします。
<ドキュメント>画面が表示されたら、ドキュメントの作成 をクリックします。

<ドキュメントの作成>画面では、判別しやすい名前を入力します。

コンテンツの YAML にチェックを入れ、コンテンツは以下をコピー&ペーストします。
3行目の「your_role_arn」 には ”SSM Automation の設定” で作成したご自身のロールを記述します。

schemaVersion: "0.3"
description: "Force Run Windows Update."
assumeRole: your_role_arn
parameters: 
  InstanceId: 
    type: StringList
    description: "(Optional) EC2 Instance(s) to run"
mainSteps:
- name: checkInstancesState
  action: aws:changeInstanceState
  maxAttempts: 1
  timeoutSeconds: 30
  onFailure: step:runWindowsUpdateOnly
  inputs:
    InstanceIds: "{{InstanceId}}"
    CheckStateOnly: true
    DesiredState: stopped
  isCritical: false
- name: startInstance
  action: aws:changeInstanceState
  maxAttempts: 1
  timeoutSeconds: 600
  onFailure: Abort
  inputs:
    InstanceIds: "{{InstanceId}}"
    CheckStateOnly: false
    DesiredState: running
- name: runWindowsUpdate
  action: aws:runCommand
  maxAttempts: 1
  timeoutSeconds: 3600
  onFailure: Abort
  inputs:
    DocumentName: AWS-InstallWindowsUpdates
    InstanceIds: "{{InstanceId}}"
    Parameters: 
      Action: Install
      AllowReboot: 'True'
- name: stopInstance
  action: aws:changeInstanceState
  maxAttempts: 1
  timeoutSeconds: 600
  onFailure: Abort
  inputs:
    InstanceIds: "{{InstanceId}}"
    CheckStateOnly: false
    DesiredState: stopped
  isEnd: true
- name: runWindowsUpdateOnly
  action: aws:runCommand
  maxAttempts: 1
  timeoutSeconds: 3600
  onFailure: Abort
  inputs:
    DocumentName: AWS-InstallWindowsUpdates
    InstanceIds: "{{InstanceId}}"
    Parameters: 
      Action: Install
      AllowReboot: 'True'

コンテンツの貼り付けが終わったらページ下部の ドキュメントの作成 をクリックします。

オペレーション

作成したドキュメントを実行します。
左側メニューから オートメーション をクリックします。

<自動化の実行>画面で オートメーションの実行 をクリックします。
<ドキュメントの選択>画面のフィルター欄で 所有者:自己所有 を選択し絞り込みます。
前の手順で作成したドキュメントにチェックを入れ 次へ をクリックします。

<自動化ドキュメントの実行>画面で レートの制御 を選択します。
ターゲットのパラメータ選択では InstanceId
ターゲットは Tags を選択します。
タグには前提で設定したタグを入力します。
Rate Control で任意の値を指定したら ページ下部の 実行 をクリックします。

実行の詳細が表示されるので成功することを確認します。

さいごに

Windows Update を実行する自動化オペレーションを紹介しました。
パッチを適用することのリスクとしないことのリスクは、システムの特性に合わせて判断すべきだと考えます。
可能な限りパッチは最新化するという方針を立てたお客様のお役に立てれば幸いです。

参考

Systems Manager Automation アクションのリファレンス
SSM ドキュメントプラグインの参照
AWS Systems Manager オートメーション