0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWSパッチマネージャーとCloudFormation_後編

Last updated at Posted at 2025-05-05

はじめに

前編記事では、先人のテンプレートを使ってパッチマネージャーに関するリソースを作成し、
たしかにテンプレート通りのリソースが配置されていることをGUIで確認した

今回はそのテンプレートを自分なりに改変してみる

具体的には以下の仕様でパッチ適用環境を構築する
もちろんリソース配置は CloudFormation によって行う

  • Windowsサーバ向けにする
    • 2月にリリースされたWinSrv2019のAMIに対して、4月度パッチを適用してみる
  • EC2のタグにPG_WINDOWSが付いているものを対象とする

成果物であるCloudFormationのYAMLファイルは巻末にまとめて記載する。

記事の構成

  1. パッチマネージャーのYAMLをWindows仕様にしてデプロイ。
  2. 検証用にEC2を2台たてる。1台はパッチ適用、もう1台はパッチ適用せず。
  3. パッチが適用された/されていないことを確認する。

2台のEC2を同時にたてることで、パッチを適用した場合と、適用しなかった場合との
挙動の違いを観察する

手順1. Windowsサーバ用のパッチマネージャーをたてる

パッチマネージャーをCloudFormationで配置する。

  • パッチベースライン
  • メンテナンスウィンドウ
  • メンテナンスウィンドウターゲット
  • メンテナンスウィンドウタスク

の4つで構成される
これらの要素の関係性についてはこちらを参照

AWS::SSM::PatchBaseline

AWS::SSM::PatchBaseline

公式の例に合わせて記述順序を直した
先に名前や説明があったほうがわかりやすい
※以下、ほかのリソースについても同じ考え

また、今回対象はWindowsサーバなので、パッチグループ名をPG_WINDOWSとした
大事なのはPatchRules以下であり、なんのパッチを当てるかを定めている
承認日は、そのパッチがリリースされてから何日経過してからあてるかを定めている

  # ------------------------------------------------------------#
  # PatchBaseline
  # ------------------------------------------------------------#
  PatchBaseline:
    Type: AWS::SSM::PatchBaseline
    Properties:
      Name: WindowsPatchBaseline
      Description: "PatchBaseline for Windows created by CloudFormation"
      OperatingSystem: WINDOWS
      PatchGroups:
        - "PG_WINDOWS" # ★★★
      ApprovalRules:
        PatchRules: # この下が重要
          - PatchFilterGroup:
              PatchFilters:
                - Values:
                    - SecurityUpdates
                    - CriticalUpdates
                  Key: CLASSIFICATION
                - Values:
                    - Critical
                    - Important
                  Key: MSRC_SEVERITY
            ApproveAfterDays: 7

AWS::SSM::MaintenanceWindow

AWS::SSM::MaintenanceWindow

AllowUnassociatedTargetsは安全の方向でfalse
無効化した場合 (false)は、事前にメンテナンスウィンドウにターゲットとして登録されたインスタンスでのみ実行される

スケジュールのcron文は理解しにくい文法なので、AIに頼むとよし

  # ------------------------------------------------------------#
  # MaintenanceWindow
  # ------------------------------------------------------------#
  MaintenanceWindow:
    Type: AWS::SSM::MaintenanceWindow
    Properties:
      Name: "MaintenanceWindows-PG_WINDOWS"
      Description: Maintenance Window to update Windows OS
      AllowUnassociatedTargets: false
      Cutoff: 1
      Duration: 2
      Schedule: "cron(00 13 ? * SUN *)" # AIにまかせる
      ScheduleTimezone: Asia/Tokyo

AWS::SSM::MaintenanceWindowTarget

AWS::SSM::MaintenanceWindowTarget

タグPatch Groupの値がPG_WINDOWSであるEC2が対象

  # ------------------------------------------------------------#
  # MaintenanceWindowTarget
  # ------------------------------------------------------------#
  MaintenanceWindowTarget:
    Type: AWS::SSM::MaintenanceWindowTarget
    Properties:
      Name: WindowsPatchTarget
      Description:  Target is PG_WINDOWS
      ResourceType: INSTANCE
      Targets:
        - Key: "tag:Patch Group" # このタグをEC2に付与する
          Values:
            - "PG_WINDOWS"
      WindowId: !Ref MaintenanceWindow
    DependsOn: MaintenanceWindow

AWS::SSM::MaintenanceWindowTask

AWS::SSM::MaintenanceWindowTask

最後にタスクを定義する
やることはRUN_COMMANDAWS-RunPatchBaselineをしているだけ
その制御パラメータとして、先に定義したメンテナンスウィンドウとメンテナンスウィンドウターゲットを用いる

  # ------------------------------------------------------------#
  # MaintenanceWindowTask
  # ------------------------------------------------------------#
  MaintenanceWindowTask:
    Type: AWS::SSM::MaintenanceWindowTask
    Properties:
      Name: WinOS-PatchTask
      MaxConcurrency: 50
      MaxErrors: 0
      Priority: 1
      Targets: #-----------------------------ここから
        - Key: WindowTargetIds
          Values:
            - !Ref MaintenanceWindowTarget
      TaskArn: AWS-RunPatchBaseline
      TaskType: RUN_COMMAND
      WindowId: !Ref MaintenanceWindow #---ここまでが重要
      TaskInvocationParameters:
        MaintenanceWindowRunCommandParameters:
          TimeoutSeconds: 600
          Parameters: { "Operation": ["Install"] }
    DependsOn: MaintenanceWindowTarget

RUN_COMMAND実行履歴の例

image.png

手順2.検証用EC2をたてる

パッチを適用する側の環境ができたので、次は適用対象のサーバを用意する

AWSのAMIには公式が日本語版のWinサーバOSを用意してくれている
しかも最新のものだけではなく、2019OSであったり、2月度のパッチまでしか適用されていないものなど
ある程度古いものまでそろっている。ありがたい。

パッチあて検証にもってこいなので、2月度パッチまで適用されたWinSrv2019を使う

image.png

CloudFormationでEC2を配置する(2台)

EC2をデプロイしたYAMLは巻末にまとめて記載する

EC2は全部で2台配置した

  • タグにPatch Groupを付与したEC2を1台配置
  • もう1台はPatch Groupタグを付与せず、パッチ適用の対象から意図して外す
      Tags:
        - Key: Name
          Value: WinSrv-201902-PatchOn
        - Key: Patch Group # ★このタグの有無でパッチ適用する/しないを制御
          Value: PG_WINDOWS

手順3.パッチ適用検証

パッチマネージャーとEC2それぞれのリソースを配置し終えた
ここから実際にパッチ適用された様子を観察する

起動したWindowsサーバにログイン

CloudformationでEC2を配置したら、RDP接続する
たしかに2月分のパッチまでしか適用されていないことがわかる
(もし最新版のAMIしかなかったら、手動でパッチをアンインストールする手間があった)

image.png

パッチの最終確認日は2018年だった
Windows Updateの自動更新が無効化されているが、これはPatch Groupタグの有無によらず、2台とも自動更新が無効化されていた

image.png

ちなみにグルポリの設定でこうなるらしい
参考)Windows Update 自動更新を無効化・停止する方法

スケジュールでパッチ適用後

先にデプロイしたパッチマネージャーのスケジュールに則り
自動的にパッチが適用されるのを待った
※日曜まで待てないので、スケジュールは一時的に変更している

結果、PG_WINDOWSタグを付けているマシンだけがアップデートされた
図左がタグあり、図右がタグなし
Windows Server 2019 の累積更新プログラム (KB5055519)が左のマシンにだけインストールされていることがわかる
image.png

パッチ適用後はマシン再起動

今回、再起動オプションの有無について検証を忘れていた

パッチが適用されたマシンは再起動がかかっていた
なお、GUI上の「更新プログラムのチェック」は最終チェック日が2018年のままであった

image.png

再起動オプション

再起動オプションは以下のように書く
パラメータ名: RebootOption
デフォルトでは再起動することになっているから、可用性を重視するEC2を対象とする場合は
再起動なしにするよう注意が必要

      TaskInvocationParameters:
        MaintenanceWindowRunCommandParameters:
          TimeoutSeconds: 600
          Parameters: 
            "Operation": ["Install"]
            "RebootOption": ["RebootIfNeeded"]

パッチマネージャーを確認

EC2台あるうち、1台は準拠(緑)、もう1台は非準拠(黄色)になっている
コンプライアンスレポートとしては2台ともスキャンされていることがわかる
image.png

すぐにパッチのインストールを走らせたいとき

奥の手として以下のコマンドで該当するタグのEC2にパッチを走らせることができる

aws ssm send-command \
    --targets "Key=tag:Patch Group,Values=PG_WINDOWS" \
    --document-name "AWS-RunPatchBaseline" \
    --parameters "Operation=Install" \
    --region ap-northeast-1

リファレンス

参考

成果物

CloudformationにアップロードしたYAMLファイルを記載する

パッチマネージャー

EC2を再起動したくない場合は、前述のオプションを有効にすべし
また、4つあるリソースの関係性はこちら(再掲)を参照

AWSTemplateFormatVersion: "2010-09-09"
Description: "Create PatchBaseline for Windows"

Resources:
  # ------------------------------------------------------------#
  # PatchBaseline
  # ------------------------------------------------------------#
  PatchBaseline:
    Type: AWS::SSM::PatchBaseline
    Properties:
      Name: WindowsPatchBaseline
      Description: "PatchBaseline for Windows created by CloudFormation"
      OperatingSystem: WINDOWS
      PatchGroups:
        - "PG_WINDOWS"
      ApprovalRules:
        PatchRules:
          - PatchFilterGroup:
              PatchFilters:
                - Values:
                    - SecurityUpdates
                    - CriticalUpdates
                  Key: CLASSIFICATION
                - Values:
                    - Critical
                    - Important
                  Key: MSRC_SEVERITY
            ApproveAfterDays: 7
  # ------------------------------------------------------------#
  # MaintenanceWindow
  # ------------------------------------------------------------#
  MaintenanceWindow:
    Type: AWS::SSM::MaintenanceWindow
    Properties:
      Name: "MaintenanceWindows-PG_WINDOWS"
      Description: Maintenance Window to update Windows OS
      AllowUnassociatedTargets: false
      Cutoff: 1
      Duration: 2
      Schedule: "cron(00 03 ? * MON *)"
      ScheduleTimezone: Asia/Tokyo
  # ------------------------------------------------------------#
  # MaintenanceWindowTarget
  # ------------------------------------------------------------#
  MaintenanceWindowTarget:
    Type: AWS::SSM::MaintenanceWindowTarget
    Properties:
      Name: WindowsPatchTarget
      Description:  Target is PG_WINDOWS
      ResourceType: INSTANCE
      Targets:
        - Key: "tag:Patch Group"
          Values:
            - "PG_WINDOWS"
      WindowId: !Ref MaintenanceWindow
    DependsOn: MaintenanceWindow
  # ------------------------------------------------------------#
  # MaintenanceWindowTask
  # ------------------------------------------------------------#
  MaintenanceWindowTask:
    Type: AWS::SSM::MaintenanceWindowTask
    Properties:
      Name: WinOS-PatchTask
      MaxConcurrency: 50
      MaxErrors: 0
      Priority: 1
      Targets:
        - Key: WindowTargetIds
          Values:
            - !Ref MaintenanceWindowTarget
      TaskArn: AWS-RunPatchBaseline
      TaskType: RUN_COMMAND
      WindowId: !Ref MaintenanceWindow
      TaskInvocationParameters:
        MaintenanceWindowRunCommandParameters:
          TimeoutSeconds: 600
          Parameters: { "Operation": ["Install"] }
    DependsOn: MaintenanceWindowTarget

検証用EC2

Patch Groupタグの有無でEC2を2つに分けた
この記事を投稿したのは2025年5月であるが、パッチ適用検証のため
あえてWin2019の2月版AMIを使っている
いずれ2月版AMIはなくなると思うので、AMI-IDは適宜変更のこと

AWSTemplateFormatVersion: '2010-09-09'
Description: Create TWO EC2s for Windows Server 2019 Mo-02

Resources:
  EC2Instance201902n1:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-033b26e504cfde89c
      KeyName: mykey
      SecurityGroupIds:
        - sg-010831940c566d1c6
      SubnetId: subnet-0273f8bda45f19219
      Tags:
        - Key: Name
          Value: WinSrv-201902-PatchOn
        - Key: Patch Group
          Value: PG_WINDOWS
        - Key: OS
          Value: Windows_Server-2019-Japanese-Full-Base-2025.02.13
      IamInstanceProfile: EC2SSMManagementRole
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 15
            VolumeType: gp2
    DeletionPolicy: Delete
  
  EC2Instance201902n2:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-033b26e504cfde89c
      KeyName: mykey
      SecurityGroupIds:
        - sg-010831940c566d1c6
      SubnetId: subnet-0273f8bda45f19219
      Tags:
        - Key: Name
          Value: WinSrv-201902-PatchOff
        - Key: OS
          Value: Windows_Server-2019-Japanese-Full-Base-2025.02.13
      IamInstanceProfile: EC2SSMManagementRole
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 15
            VolumeType: gp2
    DeletionPolicy: Delete

糸冬了!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?