Windows パッチは、すべての Windows 管理者にとって不幸な要件です。パッチ・チューズデーは、終わることなく巡ってきます。
Windows サーバーのパッチ適用を続けるためには、多くの人が Windows Server Update Services (WSUS) を使用しています。WSUS は無料で特に問題なく使えます。ただ、ちょっとやっかいな問題があって、それはWSUSも管理しなければならないサーバーだということです。また、通常は Active Directory に依存し、グループ・ポリシー・オブジェクト(GPO)がサーバーとしてWSUSをポイントするよう設定しなければなりません。WSUSのこれらの問題は、AWS Systems Manager を使用することでほぼ解消することができます。
AWS Systems Manager(略称SSM)は、AWSによって提供される無料のサービスで、AWS EC2インスタンスとオンプレミスノードを、軽量エージェントを使用して管理できます。パッチ適用のために、EC2インスタンスとオンプレミスノードの両方が組み込まれているため、1つのコンソールからすべてのパッチを適用できます。
このブログでは、AWS Systems Manager を Windows サーバーにセットアップして実行する方法を説明します。これを行うには、まずエージェントが既にセットアップされていることを確認する必要があります。その方法については、AWSのマニュアルを参照してください。Windows サーバーに SSM agent (←クリックすると AmazonSSMAgentSetup.exe がダウンロードされます。) をセットアップしたら、準備は完了です。
パッチベースラインの作成
最初にパッチベースラインを作成します。パッチベースラインを使用すると、サーバーにインストールするパッチの種類を設定できます。パッチのカテゴリ、重大度などによって異なる基準を設定できます。
今回は、重要な更新について7日間の遅延期間で自動承認が行われる Windows サーバーにのみ適用されるベースラインを作成します。これを PowerShell で実行しましょう。
残念ながら、これを行うための PowerShell のコードはあまり美しくありませんが、だからこそ私がここで代行しているわけです。これをコピーして実行してください。以下のコードでは Critical-Updates の名前でベースラインを作成します。
$autoApproveInDays = 7
$rule = New-Object Amazon.SimpleSystemsManagement.Model.PatchRule
$rule.ApproveAfterDays = $autoApproveInDays
$ruleFilters = New-Object Amazon.SimpleSystemsManagement.Model.PatchFilterGroup
$patchFilter = New-Object Amazon.SimpleSystemsManagement.Model.PatchFilter
$severityFilter = New-Object Amazon.SimpleSystemsManagement.Model.PatchFilter
$severityFilter.Key = 'MSRC_SEVERITY'
$severityFilter.Values.Add('Critical')
$classificationFilter = New-Object Amazon.SimpleSystemsManagement.Model.PatchFilter
$classificationFilter.Key = 'CLASSIFICATION'
$classificationFilter.Values.Add( 'CriticalUpdates' )
$ruleFilters.PatchFilters.Add($severityFilter)
$ruleFilters.PatchFilters.Add($classificationFilter)
$rule.PatchFilterGroup = $ruleFilters
New-SSMPatchBaseline -Name 'Critical-Updates' -Description 'Baseline containing all critical update' -ApprovalRules_PatchRule $rule
pb-07fadfc632e491110
マネージドインスタンスをパッチグループに追加
次に、パッチグループを作ってインスタンスをパッチグループに追加します。パッチグループを作成すると、異なるパッチを異なるインスタンスに簡単に配信できます。これを行うには、インスタンスにタグを付ける必要があります。この例では、本番環境にあるサーバーを使うことを想定しているので、Production というパッチグループにします。
まずマネージドインスタンスIDを取得する必要があります。その後、そのIDを使用してタグを割り当てます。
PS C:\Users\adam> Get-SSMInstanceInformation
ActivationId : 1c6f3fac-0cdd-4d9e-a32e-c7cae4231495
AgentVersion : 2.2.493.0
AssociationOverview :
AssociationStatus :
ComputerName : SRV1.WORKGROUP
IamRole : SSMServiceRole
InstanceId : mi-07fae420a558c8281
IPAddress : 10.0.0.9
IsLatestVersion : True
LastAssociationExecutionDate : 1/1/0001 12:00:00 AM
LastPingDateTime : 4/27/2018 5:01:07 PM
LastSuccessfulAssociationExecutionDate : 1/1/0001 12:00:00 AM
Name : SRV1
PingStatus : Online
PlatformName : Microsoft Windows Server 2016 Datacenter
PlatformType : Windows
PlatformVersion : 10.0.14393
RegistrationDate : 4/27/2018 4:53:27 PM
ResourceType : ManagedInstance
PS> $tag = New-Object Amazon.SimpleSystemsManagement.Model.Tag
>> $tag.Key = 'Patch Group'
>> $tag.Value = 'Production'
>> Add-SSMResourceTag -ResourceType 'ManagedInstance' -ResourceId 'mi-07fae420a558c8281' -Tag $tag
メンテナンスウィンドウの作成
SSM経由でパッチをインストールするには、メンテナンスウィンドウが必要です。メンテナンスウィンドウへのアクセスをコントロールするにはIAMロールを使いますが、ここでは C:.json と呼ぶ JSON ファイルを使用して PowerShell で作成します。
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"Service":[
"ssm.amazonaws.com",
"ec2.amazonaws.com",
"sns.amazonaws.com"
]
},
"Action":"sts:AssumeRole"
}
]
}
ロールを作成します。いくつかの方法がありますが、PowerShell では次のようになります。
PS C:\Users\adam> New-IAMRole -RoleName 'mw-task-role' -AssumeRolePolicyDocument (Get-Content -Raw C:\MaintenanceWindowRole.json)
Path RoleName RoleId CreateDate Description
---- -------- ------ ---------- -----------
/ mw-task-role AROAIBV5ZRXZCOXC535PQ 4/27/2018 4:27:14 PM
次に、New-SSMMaintenanceWindow コマンドを使用してメンテナンスウィンドウを作成します。この例では、毎週火曜日午後4時にトリガーされて4時間継続し、有効期限が切れる1時間前に新しいタスクをすべて停止するメンテナンスウィンドウを作成しています。
PS> New-SSMMaintenanceWindow -Name 'EveryTuesday' -Duration 4 -Cutoff 1 -Schedule 'cron(0 16 ? * TUE *)'
メンテナンスウィンドウにパッチグループを登録
メンテナンスウィンドウができたら、パッチグループを登録します。
## Find the maintenance window ID
PS> Get-SSMMaintenanceWindowList
Cutoff : 1
Description :
Duration : 4
Enabled : True
Name : EveryTuesday
WindowId : mw-01d06df5638742bb4
## Build the target query
PS> $target = @{Key="tag:Patch Group";Values=@("Production")}
## Register the target
PS> Register-SSMTargetWithMaintenanceWindow -WindowId 'mw-01d06df5638742bb4' -Target $target -ResourceType INSTANCE
70c354c1-3d71-4626-9742-8d962a9ce568
メンテナンスウィンドウにインストールタスクを設定
メンテナンスウィンドウにパッチグループを登録したら、必要な更新プログラムをスキャンしてインストールするタスクをセットアップできます。
PS> $maintenanceWindowId = (Get-SSMMaintenanceWindowList | Where-Object {$_.Name -eq 'EveryTuesday'}).WindowId
PS> $windowTargetId = (Get-SSMMaintenanceWindowTarget -WindowId $maintenanceWindowId).WindowTargetId
PS> $windowRoleArn = (Get-IAMRole -RoleName mw-task-role).Arn
PS> $parameters = @{}
PS> $parameterValues = New-Object Amazon.SimpleSystemsManagement.Model.MaintenanceWindowTaskParameterValueExpression
PS> $parameterValues.Values = @("Install")
PS> $parameters.Add("Operation", $parameterValues)
PS> Register-SSMTaskWithMaintenanceWindow -WindowId $maintenanceWindowId -TaskArn 'AWS-ApplyPatchBaseline' -Target @{ Key="WindowTargetIds";Values=$windowTargetId } -TaskType "RUN_COMMAND" -TaskParameter $parameters -ServiceRoleArn $windowRoleArn -MaxConcurrency 1 -MaxError 1
4999e319-b6cd-49f3-a526-23fe08c1f1cd
まとめ
インストールタスクを設定したら、完了です! 最初は、特にAWSの経験があまりない場合は、SSMはとっつきにくい面倒なものに思えるかもしれませんが、ここに示した PowerShell コードをコピーしてペーストすることで手間暇をかけることなくスムーズに試してみていただけるのではないかと思います。
Adam Bertram
Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.