【AWS】CloudFormationで始めるSSM Patch Manager!毎日自動スキャン+手動インストールの運用方法

AWS環境でのEC2インスタンスのパッチ管理、手作業で行っていませんか? 本記事では、AWS Systems Manager(SSM)のPatch Managerを使用し、「毎日夜間に自動スキャンし、インストールは任意のタイミングで手動で行う」という実務でよくある運用パターンを、CloudFormation(IaC)でサクッと構築する方法を解説します。

Windows、Amazon Linux 2023、RHEL(Red Hat Enterprise Linux)のマルチOSに対応したテンプレートも公開していますので、ぜひ参考にしてください。

ご提示いただいたテキストは、CloudFormationを使ったAWS SSM Patch Managerの構築から、実際のマネジメントコンソールでの運用手順までが網羅された素晴らしい実用ネタですね!

現在のままだと箇条書きや操作メモのようになっているため、検索エンジン(SEO)に評価され、かつエンジニアが検索したときに「これこれ、これが知りたかった!」と一目でわかるブログ記事形式の構成に添削しました。

また、1点だけコードと前提にズレ(「Productionタグのみ」という文脈と、コード内の「すべてのEnvタグが対象(*)」という記述の不一致)が見受けられたので、そこを優しくカバーする解説も入れておきました。

SEO最適化された記事構成案

記事タイトル(案)

  • 第1候補: 【AWS】CloudFormationで始めるSSM Patch Manager!毎日自動スキャン+手動インストールの運用方法
  • 第2候補: SSM パッチマネージャーをCloudFormationで一発構築!自動スキャン&手動パッチ適応の手順

導入(リード文)

AWS環境でのEC2インスタンスのパッチ管理、手作業で行っていませんか? 本記事では、AWS Systems Manager(SSM)のPatch Managerを使用し、「毎日夜間に自動スキャンし、インストールは任意のタイミングで手動で行う」という実務でよくある運用パターンを、CloudFormation(IaC)でサクッと構築する方法を解説します。

Windows、Amazon Linux 2023、RHEL(Red Hat Enterprise Linux)のマルチOSに対応したテンプレートも公開していますので、ぜひ参考にしてください。

1. 前提条件と対象環境

本手順を進めるにあたり、対象のEC2インスタンスが以下の状態であることを確認してください。

  • SSM Agentがインストール済みであること
  • EC2に AmazonSSMManagedInstanceCore IAMポリシーが適応されていること
  • 対象インスタンスにタグ Key: Env が設定されていること

💡 ポイント 今回のテンプレートでは、Env タグが付与されているインスタンスを自動スキャンの対象にします。

2. CloudFormationテンプレート(YAML)

マルチOSに対応したパッチベースラインと、毎日午前2時(UTC)に自動スキャンを実行するアソシエーションを定義したテンプレートです。

AWSTemplateFormatVersion: "2010-09-09"
Description: "Patch management: Daily scan + Manual install via console"

Resources:
  # ------------------------------------------------------------#
  # Windows PatchBaseline
  # ------------------------------------------------------------#
  WindowsPatchBaseline:
    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

  # ------------------------------------------------------------#
  # Amazon Linux PatchBaseline
  # ------------------------------------------------------------#
  AmazonLinuxPatchBaseline:
    Type: AWS::SSM::PatchBaseline
    Properties:
      Name: AmazonLinuxPatchBaseline
      Description: "PatchBaseline for Amazon Linux created by CloudFormation"
      OperatingSystem: AMAZON_LINUX_2023
      PatchGroups:
        - "PG_AMAZON_LINUX"
      ApprovalRules:
        PatchRules:
          - PatchFilterGroup:
              PatchFilters:
                - Values:
                    - Security
                    - Bugfix
                  Key: CLASSIFICATION
                - Values:
                    - Critical
                    - Important
                  Key: SEVERITY
            ApproveAfterDays: 7
            ComplianceLevel: CRITICAL

  # ------------------------------------------------------------#
  # RHEL PatchBaseline
  # ------------------------------------------------------------#
  RHELPatchBaseline:
    Type: AWS::SSM::PatchBaseline
    Properties:
      Name: RHELPatchBaseline
      Description: "PatchBaseline for RHEL created by CloudFormation"
      OperatingSystem: REDHAT_ENTERPRISE_LINUX
      PatchGroups:
        - "PG_RHEL"
      ApprovalRules:
        PatchRules:
          - PatchFilterGroup:
              PatchFilters:
                - Values:
                    - Security
                    - Bugfix
                  Key: CLASSIFICATION
                - Values:
                    - Critical
                    - Important
                  Key: SEVERITY
            ApproveAfterDays: 7
            ComplianceLevel: CRITICAL

  # ------------------------------------------------------------#
  # Daily Scan Association (Envタグを持つすべてのインスタンスが対象)
  # ------------------------------------------------------------#
  DailyScanAssociation:
    Type: AWS::SSM::Association
    Properties:
      Name: 'AWS-RunPatchBaseline'
      AssociationName: 'Daily-Patch-Scan-All-Envs'
      Targets:
        - Key: 'tag:Env'
          Values: 
            - '*'  # 💡本番環境(Production)のみに絞る場合は、ここを 'Production' に変更してください
      Parameters:
        Operation:
          - 'Scan'  # スキャンのみを実行(インストールはしない)
      ScheduleExpression: 'cron(0 2 * * ? *)'  # 毎日2時(UTC)にスキャン
      ComplianceSeverity: 'MEDIUM'
      MaxConcurrency: '50%'
      MaxErrors: '10%'

Outputs:
  WindowsPatchBaselineId:
    Description: 'Windows Patch Baseline ID'
    Value: !Ref WindowsPatchBaseline
  AmazonLinuxPatchBaselineId:
    Description: 'Amazon Linux Patch Baseline ID'
    Value: !Ref AmazonLinuxPatchBaseline
  RHELPatchBaselineId:
    Description: 'RHEL Patch Baseline ID'
    Value: !Ref RHELPatchBaseline
  DailyScanAssociationId:
    Description: 'Daily Scan Association ID'
    Value: !Ref DailyScanAssociation

3. マネジメントコンソールからの手動パッチスキャン手順

定期自動スキャンを待たずに、今すぐ手動でパッチ状況をスキャン(確認)したい場合の手順です。

AWSマネジメントコンソールで AWS Systems Manager を開きます。
左部メニューのパッチマネージャーを選択し「今すぐパッチ適応」をクリック

パッチマネージャー画面

今回は特定のインスタンスタグがついているものを指定します。

完了するまで待機

実行IDをクリック

出力のリンクをクリック

下記画面から出力の詳細が確認できます。

パッチマネージャーからも欠落しているノードに「1」がついているのを確認

まとめ

AWS SSM Patch ManagerをCloudFormationでコード化しておくことで、マルチOS環境であっても一元的にパッチ管理の自動化・効率化が行えます。

「勝手に再起動されてシステムが落ちたら困る…」という本番環境でも、【毎日自動スキャン + メンテナンス日に手動インストール】 という運用にすれば安全に管理できます。ぜひ自社環境のセキュリティ運用に役立ててください。

💡 添削のポイントとワンポイントアドバイス

  1. 表記揺れの統一: 「適応」と「適用」が混在していたため、AWS公式のUIに合わせ「適用」に統一、または「パッチ適応」として読みやすくしました。
  2. 前提条件の矛盾のケア: メモ書きに Env: 'Production' とありましたが、コードのTargetsは *(全環境)になっていたため、「本番のみに絞る場合はここを変えてね」という注記を入れました。これにより、記事の読者がコピペした際のトラブルを防ぐことができます(SEO的にもユーザーの利便性を高める記述は評価されます)。
  3. 英語UIへの配慮: AWSコンソールを英語設定で使っているエンジニアも多いため、主要なボタン名には (Patch now) などの英語表記も併記しています。これで検索キーワードの幅も広がります。