SSM Quick Setup の Patch Manager が削除できなくなったので IAM ロールを復元してみた

SSM Quick Setup の Patch Manager が削除できなくなったので IAM ロールを復元してみた

Quick Setup で作成した構成を削除する前に、関連する IAM ロールやポリシーを削除していないか確認する
2026.01.20

はじめに

テクニカルサポートの 片方 です。
SSM の Quick Setup は、Patch Manager を含む各種設定を手軽に展開できて便利ですよね。
本機能を利用する際に内部では CloudFormation StackSets や IAM ロールが利用されており、構成を把握していない場合、意図しない挙動に遭遇することがあります。
今回、検証環境で Quick Setup を使って構成した Patch Manager を削除しようとしたところ、削除処理が失敗し、コンソールからも API からも削除できない状態となる事象を確認しました。

調査したところ、Quick Setup が内部で使用している Patch Policy 用の IAM ロールおよび管理ポリシーを事前に削除していたことが原因でした。
Quick Setup は CloudFormation StackSets を使って構成を管理しているため、作成時だけでなく削除時にも実行ロールと管理ロールが必要になるようです。

本記事では、

  • Quick Setup(Patch Manager)が削除できなくなった事象の概要
  • 削除に必要な IAM ロール/ポリシーの構成
  • 削除できない状態から、IAM ロールを復元して削除できるようになるまでの手順

について、実際に検証した内容をもとに整理していきます。

同じように 「Quick Setup で作った Patch Manager が削除できない」 や 「IAM ロールを整理したら Quick Setup の操作に失敗するようになった」 といった状況で困っている方の参考になれば幸いです。

事象の詳細(エラーメッセージ)

Quick Setup で構成した Patch Manager を削除しようとしたところ、削除処理が失敗しました。
コンソール上では削除処理が失敗した状態となります。また、再試行しても同様に失敗する状態です。

  • 後述する AWS-QuickSetup-PatchPolicy-LocalAdministrationRole のみ又は、両方削除されている場合
    001

  • AWS-QuickSetup-PatchPolicy-LocalExecutionRole のみ削除されている場合
    002

Quick Setup の内部構成(IAM ロールの関係)

Quick Setup(Patch Manager)は、内部的には CloudFormation StackSets を利用して構成されています。
削除時の実行フローを簡略化すると、以下のようになります。

Quick Setup
  → CloudFormation StackSet
    → AWS-QuickSetup-PatchPolicy-LocalAdministrationRole
      → sts:AssumeRole
        → AWS-QuickSetup-PatchPolicy-LocalExecutionRole
          → SSM / Patch / CloudFormation リソース操作

なお、それぞれのロールの役割は以下のとおりです。

  • AWS-QuickSetup-PatchPolicy-LocalAdministrationRole
    CloudFormation(StackSet)から引き受けられる管理ロール
    実行ロール(LocalExecutionRole)を AssumeRole する権限のみを持つ

  • AWS-QuickSetup-PatchPolicy-LocalExecutionRole
    Patch Manager の構成・削除を実際に行う実行ロール
    AWSQuickSetupPatchPolicyDeploymentRolePolicy がアタッチされている

これらの IAM ロールを削除していた環境では、削除処理時に CloudFormation がロールを引き受けられず、削除に失敗することを確認しました。
Quick Setup はロールが削除されていても自動で再作成は行わないため、手動での復元が必要となります。

復元した IAM ロールの具体例

今回は、削除に必要な最小構成として、Patch Policy 用の管理ロール・実行ロールを以下の内容で復元しました。

AWS-QuickSetup-PatchPolicy-LocalAdministrationRole

信頼ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudformation.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        },
        "StringLike": {
          "aws:SourceArn": "arn:aws:cloudformation:*:123456789012:stackset/AWS-QuickSetup-*"
        }
      }
    }
  ]
}

インラインポリシー(AssumeExecutionRolePermissions)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::123456789012:role/AWS-QuickSetup-PatchPolicy-LocalExecutionRole"
    }
  ]
}

※ 適宜修正してください。

003

AWS-QuickSetup-PatchPolicy-LocalExecutionRole

信頼ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/AWS-QuickSetup-PatchPolicy-LocalAdministrationRole"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

※ 適宜修正してください。

アタッチする管理ポリシー

004

この構成で IAM ロールを復元したところ、以下のように Quick Setup の Patch Manager を問題なく削除できることを確認できました。

005
006

補足:CloudFormation StackSet のテンプレートについて

Quick Setup では、Patch Policy 用の IAM ロールを CloudFormation StackSet AWS-QuickSetup-PatchPolicy-LocalDeploymentRolesStack を使って作成しています。
今回復元した IAM ロールは、この StackSet で定義されている構成を参考にしています。
ロールの信頼ポリシーや管理ポリシーの定義を確認したい場合は、以下のテンプレートをご確認ください。

AWS-QuickSetup-PatchPolicy-LocalDeploymentRolesStack
{
  "Parameters": {
    "QSConfigurationType": {
      "Type": "String",
      "Description": "(Required) QuickSetup Configuration type",
      "Default": ""
    },
    "OptInRegions": {
      "Type": "CommaDelimitedList",
      "Default": "",
      "Description": "Comma-separated list of opt-in regions"
    },
    "LocalAdministrationRoleName": {
      "Type": "String",
      "Description": "(Required) Local Administration role name"
    },
    "LocalExecutionRoleName": {
      "Type": "String",
      "Description": "(Required) Local Execution role name"
    },
    "UseAWSManagedPolicy": {
      "Type": "String",
      "Default": "true",
      "AllowedValues": [
        "true",
        "false"
      ],
      "Description": "(Optional) Whether to use local account policy or AWS managed one"
    }
  },
  "Conditions": {
    "ShouldUseAWSManagedPolicy": {
      "Fn::Equals": [
        {
          "Ref": "UseAWSManagedPolicy"
        },
        "true"
      ]
    },
    "IsSSMType": {
      "Fn::Equals": [
        {
          "Ref": "QSConfigurationType"
        },
        "SSM"
      ]
    }
  },
  "Resources": {
    "LocalAdministrationRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "RoleName": {
          "Ref": "LocalAdministrationRoleName"
        },
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": [
                  "cloudformation.amazonaws.com"
                ]
              },
              "Action": [
                "sts:AssumeRole"
              ],
              "Condition": {
                "StringEquals": {
                  "aws:SourceAccount": {
                    "Ref": "AWS::AccountId"
                  }
                },
                "StringLike": {
                  "aws:SourceArn": {
                    "Fn::Join": [
                      "",
                      [
                        "arn:",
                        {
                          "Ref": "AWS::Partition"
                        },
                        ":cloudformation:*:",
                        {
                          "Ref": "AWS::AccountId"
                        },
                        ":stackset/AWS-QuickSetup-*"
                      ]
                    ]
                  }
                }
              }
            }
          ]
        },
        "Policies": [
          {
            "PolicyName": "AssumeExecutionRolePermissions",
            "PolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": [
                    "sts:AssumeRole"
                  ],
                  "Resource": {
                    "Fn::Join": [
                      "",
                      [
                        "arn:",
                        {
                          "Ref": "AWS::Partition"
                        },
                        ":iam::",
                        {
                          "Ref": "AWS::AccountId"
                        },
                        ":role/",
                        {
                          "Ref": "LocalExecutionRoleName"
                        }
                      ]
                    ]
                  }
                }
              ]
            }
          }
        ]
      }
    },
    "LocalExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "RoleName": {
          "Ref": "LocalExecutionRoleName"
        },
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "AWS": {
                  "Fn::GetAtt": "LocalAdministrationRole.Arn"
                }
              },
              "Action": [
                "sts:AssumeRole"
              ]
            }
          ]
        },
        "ManagedPolicyArns": {
          "Fn::If": [
            "IsSSMType",
            {
              "Fn::If": [
                "ShouldUseAWSManagedPolicy",
                [
                  {
                    "Fn::Sub": "arn:${AWS::Partition}:iam::aws:policy/AWSQuickSetupSSMDeploymentRolePolicy"
                  },
                  {
                    "Fn::Sub": "arn:${AWS::Partition}:iam::aws:policy/AWSQuickSetupSSMDeploymentS3BucketRolePolicy"
                  }
                ],
                [
                  {
                    "Fn::Sub": "arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/AWSQuickSetupSSMDeploymentRolePolicy"
                  },
                  {
                    "Fn::Sub": "arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/AWSQuickSetupSSMDeploymentS3BucketRolePolicy"
                  }
                ]
              ]
            },
            {
              "Fn::If": [
                "ShouldUseAWSManagedPolicy",
                [
                  {
                    "Fn::Sub": "arn:${AWS::Partition}:iam::aws:policy/AWSQuickSetup${QSConfigurationType}DeploymentRolePolicy"
                  }
                ],
                [
                  {
                    "Fn::Sub": "arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/AWSQuickSetup${QSConfigurationType}DeploymentRolePolicy"
                  }
                ]
              ]
            }
          ]
        }
      }
    }
  },
  "Outputs": {
    "LocalAdministrationRoleARN": {
      "Description": "ARN of LocalAdministrationRole",
      "Value": {
        "Fn::GetAtt": "LocalAdministrationRole.Arn"
      }
    },
    "LocalExecutionRoleARN": {
      "Description": "ARN of LocalExecutionRole",
      "Value": {
        "Fn::GetAtt": "LocalExecutionRole.Arn"
      }
    }
  }
}

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/quick-setup-patch-manager.html

まとめ

Quick Setup は便利な反面、内部では CloudFormation StackSets と IAM ロールに依存した構成となっています。
Quick Setup で作成されたリソースを削除する際は、関連する IAM ロールやポリシーを削除しないように注意が必要です。
本ブログが誰かの参考になれば幸いです。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/best-practices.html#donttouch

スタックを起動した後、CloudFormation コンソール、API、AWS CLI を使用して、スタック内のリソースを更新します。スタックのリソースを CloudFormation 以外の方法で変更しないでください。変更するとスタックのテンプレートとスタックリソースの現在の状態の間で不一致が起こり、スタックの更新または削除でエラーが発生する場合があります。これをドリフトと呼びます。CloudFormation テンプレート外でリソースが変更され、その後にスタックを更新すると、リソースに直接行われた変更は破棄され、リソース設定はテンプレートの設定に戻ります。

参考資料

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

FacebookHatena blogX

関連記事