Amazon Web Services ブログ

AWS Systems Manager Automation を使用したマルチアカウントおよびマルチリージョン環境のパッチ管理

AWS Systems Manager Automation は AWS リソースを集中管理するためにマルチアカウントおよびマルチリージョンを対象としたアクションを実行することができます。この機能を活用することでアカウント全体への設定の適用、運用アクション、コンプライアンス管理、に必要な時間とオーバーヘッドを減らすことができます。

このブログ記事では、AWS Systems Manager Automation を使用して、マルチアカウントおよびマルチリージョン環境のマネージドインスタンスにパッチを適用する方法を紹介します。またパッチ適用のために、インスタンス管理にどのようにリソースグループを活用するか説明します。例えば、開発、テスト、および本番などのさまざまな環境用のリソースグループを作成できます。そして Patch Manager を活用したカスタム自動化ドキュメントの作成方法と、カスタム自動化ドキュメントを実行してマネージドインスタンスにパッチを適用する方法を説明します。

この記事では、マルチアカウントでパッチを適用するために、管理アカウントとターゲットアカウントを設定するための4つの手順を説明します。

手順1:マネージドインスタンスを論理的にグループ化するリソースグループを作成

手順2:IAM ロールを設定

手順3:パッチベースラインを実行する自動化ドキュメントを作成

手順4:自動化ドキュメントを実行してマルチアカウントのリソースにパッチを適用

手順1 : リソースグループの作成

リソースグループは AWS リソースを整理するオプションの機能です。リソースグループを使用すると、多数のリソースに実行するタスクの管理と自動化が容易になります。リソースグループは、サーバの機能(例えば、Web サーバやデータベースなど)に基づいて作成することができます。また、リソースグループは、間違ったインスタンスへのパッチ適用を避けることに役立ちます。

AWS Systems Manager コンソールを開き、左側のナビゲーションペインで Find Resources を選択します。次の例では、パッチを適用するインスタンスのグループにはName:WebServersがタグづけされているものとします。このタグを持つインスタンスにパッチを適用します。 Find Resources ページで、リソースタイプを AWS :: EC2 :: Instance、タグキーを Name、タグ値を WebServers と指定し、View query results を選択します。検索結果が適切であることを確認した後、Save query as group を選択し、Group Name とオプションで Group description を入力します。

CLI Command:

aws resource-groups create-group --name WebServers --resource-query '{"Type":"TAG_FILTERS_1_0","Query":"{\"ResourceTypeFilters\":[\"AWS::EC2::Instance\"],\"TagFilters\":[{\"Key\":\"Name\",\"Values\":[\"WebServers\"]}]}"}'

手順2: IAM ロール を設定

まず、管理アカウントとして1つのアカウントを選択し、管理リージョンとしてリージョンを選択する必要があります。この管理場所(管理アカウントと管理リージョン)から、他の AWS アカウントと他のリージョンをターゲットとする自動化タスクを実行できます。

管理アカウント

管理アカウントで、管理者の自動化用のIAMロールを作成します。この IAM ロールは、ここでダウンロードできる AWS CloudFormation テンプレートを使用して作成できます。 このブログの例では、IAM ロールの AWS-SystemsManager-AutomationAdministrationRole を呼び出します。作成するIAMポリシーの例を次に示します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": "arn:aws:iam::*:role/AWS-SystemsManager-AutomationExecutionRole",
            "Effect": "Allow"
        },
        {
            "Action": [
                "organizations:ListAccountsForParent"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }
    ]
}

次に、管理アカウントで AmazonSSMAutomationRole のポリシーをアタッチした IAM ユーザを作成します。リソースグループを対象とするために、AmazonSSMAutomationRole ポリシーに加えて、iam:PassRole とresource-groups:ListGroupResources アクションを許可するためのインラインポリシーを追加します。作成するインラインポリシーの例を次に示します。

{
   "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "resource-groups:ListGroupResources",
                "iam:PassRole"
            ],
            "Resource": "*"
        }
    ]
}

ターゲットアカウント

ターゲットにしたいアカウントでターゲット用の IAM ロールを作成します。この IAM ロールは、ここでダウンロードできる AWS CloudFormation テンプレートを使用して作成できます。このブログの例では、IAM ロールの AWS-SystemsManager-AutomationExecutionRole を呼び出します。作成するIAMポリシーの例を次に示します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "*",
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::<TargetAccountId>:role/AWS-SystemsManager-AutomationExecutionRole",
            "Effect": "Allow"
        },
        {
            "Action": [
                "iam:ChangePassword",
                "iam:Create*",
                "iam:Delete*",
                "iam:Detach*",
                "iam:Remove*",
                "iam:Update*",
                "iam:Upload*"
            ],
            "Resource": "*",
            "Effect": "Deny"
        }
    ]
}

上記ポリシーのロール ARN はターゲットアカウントのアカウントID に更新してください。また、IAM ロールの信頼できるエンティティとして、管理アカウントIDとssm.amazonaws.com を次のように設定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<ManagementAccountId>:root"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ssm.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

手順3: パッチベースラインを実行する自動化ドキュメントを作成

管理アカウントでコマンドドキュメント AWS-RunPatchBaseline を実行するカスタム自動化ドキュメントを作成します。管理アカウントの AWS Systems Manager コンソールを開き、左側のナビゲーションペインから Documents を選択します。

  1. Create document を選択します。
  2. 任意のドキュメント名を入力します。この例では、Automation-RunPatchBaseline と入力します。
  3. Document type のリストから、Automation document を選択します。
  4. コンテンツフィールド内のデフォルトのコンテンツを削除し、次のJSONコンテンツを貼り付けます。
  5.  Create Document を選択します。
{
    "outputs": [
        "runPatchBaseline.Output"
    ],
    "description": "Automation document to execute the Command document AWS-RunPatchBaseline",
    "schemaVersion": "0.3",
    "assumeRole": "{{AutomationAssumeRole}}",
    "parameters": {
        "AutomationAssumeRole": {
            "type": "String",
            "description": "(Optional) The ARN of the role that allows Automation to perform the actions on your behalf.",
            "default": ""
        },
        "Operation": {
            "allowedValues": [
                "Scan",
                "Install"
            ],
            "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.",
            "type": "String"
        },
        "SnapshotId": {
            "default": "",
            "description": "(Optional) The snapshot ID to use to retrieve a patch baseline snapshot.",
            "type": "String",
            "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}$"
        },
        "InstanceId": {
            "description": "(Required) EC2 InstanceId to which we apply the patch-baseline",
            "type": "String"
        },
        "InstallOverrideList": {
            "default": "",
            "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.",
            "type": "String",
            "allowedPattern": "(^$)|^https://.+$|^s3://([^/]+)/(.*?([^/]+))$"
        }
    },
    "mainSteps": [
        {
            "maxAttempts": 3,
            "inputs": {
                "Parameters": {
                    "SnapshotId": "{{SnapshotId}}",
                    "InstallOverrideList": "{{InstallOverrideList}}",
                    "Operation": "{{Operation}}"
                },
                "InstanceIds": [
                    "{{InstanceId}}"
                ],
                "DocumentName": "AWS-RunPatchBaseline"
            },
            "name": "runPatchBaseline",
            "action": "aws:runCommand",
            "timeoutSeconds": 7200,
            "onFailure": "Abort"
        }
    ]
}

手順4: ターゲットアカウントのリソースにパッチを適用するために自動化タスクを実行する

管理アカウントの AWS Systems Manager コンソールで、左側のナビゲーションペインから Automation を選択し、Execute automation を選択します。

  1. Choose document から手順 3 で作成した Automation-RunPatchBaseline を選択し、Nextをクリックします。
  2. Multi-account and Region を選択します。
  3. Target accounts and Regions のセクション:
    1. 対象アカウントのアカウントIDを入力し、対象のEC2インスタンスが起動しているリージョンを選択します。
    2. (オプション)同時にタスクを実行する場所(アカウントとリージョンのペア)の数または割合を指定します。
    3. (オプション)特定の数または割合の場所でタスクが失敗した後にタスクを停止するエラーのしきい値を指定します。
  4. Targets のセクション:
    1. Targets で Resource Group を選択します。
    2. ParameterInstanceId を選択します。
    3. Resource group で WebServers を選択します。
  5. Input parameters セクション:
    1. Operation Install と入力します。
    2. (オプション)InstallOverrideList にインストールするパッチのリストを入力します。このパッチインストールリストは、デフォルトのパッチベースラインで指定されたパッチを上書きします。
    3. (オプション)パッチベースラインスナップショットの取得に使用するスナップショット ID を入力します。
  6. Rate control セクション:
    1. 同時にタスクを実行するターゲットインスタンスの数またはパーセンテージを入力します。
    2. ターゲットインスタンスの特定の数または割合でタスクが失敗した後にタスクを停止するエラーのしきい値を入力します。

CLI command:

aws ssm start-automation-execution
–document-name Automation-RunPatchBaseline
–parameters AutomationAssumeRole=arn:aws:iam::<ManagementAccountId>:role/AWS-SystemsManager-AutomationAdministrationRole,Operation=Install
–target-parameter-name InstanceId
–targets Key=ResourceGroup,Values=WebServers
–target-locations Accounts=<TargetAccountId>,Regions=<TargetAccountRegion>,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole

Conclusion

このブログ記事では、AWS Systems Manager Automation を使用してマルチアカウントおよびマルチリージョン環境のマネージドインスタンスにパッチを適用する方法を紹介しました。まず、管理アカウントおよびターゲットアカウントでオートメーションが使用するIAMロールについて説明しました。 IAMロールを作成した後、パッチベースライン操作を実行するための自動化ドキュメントを作成する方法を説明しました。そして、ターゲットアカウントのリソースグループを使用してマネージインスタンスへ自動化ドキュメントを実行する方法を説明しました。

また、AWS-PatchInstanceWithRollback というドキュメントをベースとしてカスタム自動化ドキュメントを作成することで、ワークフローをさらにカスタマイズすることができます。詳細については、こちらのドキュメントを参照してください。ドキュメントを作成したら、追加のステップを記述してワークフローに追加することができます。

手順の例を次に示します。

  • パッチを適用するためにターゲットインスタンスをALBのターゲットグループからデタッチするように更新し、パッチ適用が完了したらターゲットグループに追加し直します(aws:executeAwsApi アクション)
  • AWS-RunPowerShellScriptまたはAWS-RunShellScriptドキュメント(aws:runCommand アクション)で OS レベルのアプリケーション状態を確認します。
  • パッチが適用されたマネージドインスタンスからAMIを作成します(aws:createImageアクション)

著者について

Erik Weber はAWS Premium Supportのサポートエンジニアです。AWS Systems Manager、Amazon EC2 Windows、Microsoft PowerShellを専門としています。趣味は散歩、料理、ダンスです。

 

 

 

飜訳はSA三上が担当しました。原文はこちら