はじめに
こんにちは、SREチームの大槻です。
パッチマネージャーで「grub2(Linuxのブートローダー)」のパッチ適用が失敗した際、
複合ドキュメントを活用して対処しました。
簡単にですが、その際の対処方法を忘備録として残そうと思います!
エラー内容
パッチマネージャーの実行履歴よりエラーを確認しました。
[ERROR]: yum update failed with result code: 1, message: [u'1:grub2-tools-2.06-14.amzn2.x86_64 requires grub2-common = 1:2.06-14.amzn2']
どうやらyumパッケージ(「grub2-tools」「grub2-common」)依存関係の解決失敗が原因のようです。
よくある対処方法
ググったところ、grub2関連パッケージの手動更新で、パッチマネージャーにてエラーが出なくなるようです。
$ sudo yum update grub2
それだと手間
ただ、よくある対処方法(手動更新)だと以下2点で手間がかかるという課題がありました。
・EC2はAutoScalingで管理しており、イメージ元であるAMIに対して手動更新&置き換える必要がある。
・管理しているAMIの数が2桁台ある。
そこでの対処方法
そこで手間のかからないSSMの複合ドキュメントを利用しました。
自前で作成した、「 grub2」の更新を実施するカスタムドキュメント(LspAdvanceUpdate)と
パッチマネージャーで利用してる、パブリックドキュメント(AWS-RunPatchBaseline)を
合わしたものが複合ドキュメント(LspExpansionRunPatchBaseline)です。
こうすることでパッチマネージャーやステートマネージャー使用時に、
毎回自動で対処してくれるので負担がかかりません。
参考までに
参考までにCloudFormationで使用したyamlテンプレートを紹介ます。
カスタムドキュメント
LspAdvanceUpdate: Type: "AWS::SSM::Document" Properties: Name: "LSP-AdvanceUpdate" Content: | { "schemaVersion": "2.2", "description": "Scans for or installs patches from a patch baseline to a Linux", "mainSteps": [ { "precondition": { "StringEquals": [ "platformType", "Linux" ] }, "action": "aws:runShellScript", "name": "PatchLinux", "inputs": { "timeoutSeconds": 7200, "runCommand": [ "#!/bin/bash", "", "sudo yum update grub2 -y", "" ] } } ] } DocumentType: "Command" UpdateMethod: NewVersion
複合ドキュメント
LspExpansionRunPatchBaseline: Type: "AWS::SSM::Document" Properties: Name: "LSP-ExpansionRunPatchBaseline" Content: | { "schemaVersion" : "2.2", "description" : "Shared inputs example", "parameters" : { "Operation" : { "type" : "String", "description" : "(Required) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.", "allowedValues" : [ "Scan", "Install" ] }, "SnapshotId" : { "type" : "String", "description" : "(Optional) The snapshot ID to use to retrieve a patch baseline snapshot.", "allowedPattern" : "(^$)|^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", "default" : "" }, "InstallOverrideList" : { "type" : "String", "description" : "(Optional) An https URL or an Amazon S3 path-style URL to the list of patches to be installed. This patch installation list overrides the patches specified by the default patch baseline.", "allowedPattern" : "(^$)|^https://([^/]+)/(.*?([^/]+))$|^s3://([^/]+)/(.*?([^/]+))$", "default" : "" }, "AssociationId" : { "type" : "String", "description" : "(Optional) The Association ID of the State Manager Association executing the document.", "allowedPattern" : "^((([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}){0,1})$", "default" : "" }, "BaselineOverride" : { "type" : "String", "description" : "(Optional) An https URL or an Amazon S3 path-style URL to a list of baseline objects. These baselines override the default baseline and any baselines used by Patch Groups.", "allowedPattern" : "(^$)|^https://([^/]+)/(.*?([^/]+))$|^s3://([^/]+)/(.*?([^/]+))$", "default" : "" }, "RebootOption" : { "type" : "String", "description" : "(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.", "allowedValues" : [ "RebootIfNeeded", "NoReboot" ], "default" : "RebootIfNeeded" } }, "mainSteps" : [ { "name" : "PreparationPatch", "action" : "aws:runDocument", "inputs" : { "documentType" : "SSMDocument", "documentPath" : "LSP-AdvanceUpdate" } }, { "name" : "AWSRunPatchBaseline", "action" : "aws:runDocument", "inputs" : { "documentType" : "SSMDocument", "documentPath" : "AWS-RunPatchBaseline", "documentParameters" : "{\"Operation\": \"{{Operation}}\", \"SnapshotId\": \"{{SnapshotId}}\", \"InstallOverrideList\": \"{{InstallOverrideList}}\", \"AssociationId\": \"{{AssociationId}}\", \"BaselineOverride\": \"{{BaselineOverride}}\", \"RebootOption\": \"{{RebootOption}}\"}" } } ] } DocumentType: "Command" UpdateMethod: NewVersion
※ 動作保証するものではございません。あくまで参考までにお使いください。
おわりに
同様のエラー報告事例はいくつか検索でヒットしますが、
手動更新での対処方法しか見当りませんでした、、
なので今回は複合ドキュメントを活用した対処方法をご紹介させていただきました。
場合によっては有効な選択肢のひとつになり得るんじゃないかと思います!
本ブログが少しでも皆様のお役に立れれば幸いです。