はじめに
前編記事では、先人のテンプレートを使ってパッチマネージャーに関するリソースを作成し、
たしかにテンプレート通りのリソースが配置されていることをGUIで確認した
今回はそのテンプレートを自分なりに改変してみる
具体的には以下の仕様でパッチ適用環境を構築する
もちろんリソース配置は CloudFormation によって行う
- Windowsサーバ向けにする
- 2月にリリースされたWinSrv2019のAMIに対して、4月度パッチを適用してみる
- EC2のタグに
PG_WINDOWS
が付いているものを対象とする
成果物であるCloudFormationのYAMLファイルは巻末にまとめて記載する。
記事の構成
- パッチマネージャーのYAMLをWindows仕様にしてデプロイ。
- 検証用にEC2を2台たてる。1台はパッチ適用、もう1台はパッチ適用せず。
- パッチが適用された/されていないことを確認する。
2台のEC2を同時にたてることで、パッチを適用した場合と、適用しなかった場合との
挙動の違いを観察する
手順1. Windowsサーバ用のパッチマネージャーをたてる
パッチマネージャーをCloudFormationで配置する。
- パッチベースライン
- メンテナンスウィンドウ
- メンテナンスウィンドウターゲット
- メンテナンスウィンドウタスク
の4つで構成される
これらの要素の関係性についてはこちらを参照
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
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_COMMAND
でAWS-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
実行履歴の例
手順2.検証用EC2をたてる
パッチを適用する側の環境ができたので、次は適用対象のサーバを用意する
AWSのAMIには公式が日本語版のWinサーバOSを用意してくれている
しかも最新のものだけではなく、2019OSであったり、2月度のパッチまでしか適用されていないものなど
ある程度古いものまでそろっている。ありがたい。
パッチあて検証にもってこいなので、2月度パッチまで適用されたWinSrv2019を使う
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しかなかったら、手動でパッチをアンインストールする手間があった)
パッチの最終確認日は2018年だった
Windows Updateの自動更新が無効化されているが、これはPatch Group
タグの有無によらず、2台とも自動更新が無効化されていた
ちなみにグルポリの設定でこうなるらしい
参考)Windows Update 自動更新を無効化・停止する方法
スケジュールでパッチ適用後
先にデプロイしたパッチマネージャーのスケジュールに則り
自動的にパッチが適用されるのを待った
※日曜まで待てないので、スケジュールは一時的に変更している
結果、PG_WINDOWS
タグを付けているマシンだけがアップデートされた
図左がタグあり、図右がタグなし
Windows Server 2019 の累積更新プログラム (KB5055519)が左のマシンにだけインストールされていることがわかる
パッチ適用後はマシン再起動
今回、再起動オプションの有無について検証を忘れていた
パッチが適用されたマシンは再起動がかかっていた
なお、GUI上の「更新プログラムのチェック」は最終チェック日が2018年のままであった
再起動オプション
再起動オプションは以下のように書く
パラメータ名: RebootOption
デフォルトでは再起動することになっているから、可用性を重視するEC2を対象とする場合は
再起動なしにするよう注意が必要
TaskInvocationParameters:
MaintenanceWindowRunCommandParameters:
TimeoutSeconds: 600
Parameters:
"Operation": ["Install"]
"RebootOption": ["RebootIfNeeded"]
パッチマネージャーを確認
EC2台あるうち、1台は準拠(緑)、もう1台は非準拠(黄色)になっている
コンプライアンスレポートとしては2台ともスキャンされていることがわかる
すぐにパッチのインストールを走らせたいとき
奥の手として以下のコマンドで該当するタグのEC2にパッチを走らせることができる
aws ssm send-command \
--targets "Key=tag:Patch Group,Values=PG_WINDOWS" \
--document-name "AWS-RunPatchBaseline" \
--parameters "Operation=Install" \
--region ap-northeast-1
リファレンス
参考
- 検証・本番環境を考慮した EC2インスタンスへのパッチ適用環境を作ってみる【SSMメンテナンスウィンドウ編】
- 【AWS Systems Manager】パッチマネージャー + メンテナンスウインドウの構成をCloudFormationテンプレート化してみた
- 【AWS Patch Manager】OSパッチ適用を自動化しよう
- 日本語パッケージ版EC2をデプロイする
成果物
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