管理アカウントからメンバーアカウントにSSMオートメーションを実行し、実行結果詳細を確認する方法

管理アカウントからメンバーアカウントにSSMオートメーションを実行し、実行結果詳細を確認する方法

管理アカウントのコンソール上で、メンバーアカウントのSSMオートメーションの実行結果詳細を確認する方法を紹介します。
Clock Icon2025.01.23

はじめに

前回の記事では、以下の構成を用いて、管理アカウントからSSMオートメーションを使用し、複数のメンバーアカウントのEC2インスタンスで実行する方法をご紹介しました。

automation-multi-region-and-multi-account (1)
引用元

https://dev.classmethod.jp/articles/ssm-automation-multi-account-ec2/

記事でも紹介していますが、問題点として、管理アカウントのマネジメントコンソール上で、メンバーアカウントのコマンド実行結果が確認できない点がありました。

問題点である事象を説明します。

管理アカウントからSSMオートメーションを実行すると、まずExecution IDが作成されます。

cm-hirai-screenshot 2025-01-22 17.34.06

Execution IDをクリックすると、対象メンバーアカウントごとにStep IDが作成されます。

cm-hirai-screenshot 2025-01-22 15.49.38
Step IDをクリックすると、実行詳細ページに遷移します。しかし、ExecutionIdはメンバーアカウントのExecutionIdに紐づいており、以下のスクリーンショットに示されているExecutionId(例: 8df83893-10ba-4fa6-8e7f-1520667bbc34)を選択しても、実行結果内容(コマンド実行結果)は確認できません。

cm-hirai-screenshot 2025-01-22 15.51.53

クリックすると、以下のエラーになります。

The execution role arn:aws:iam::メンバーアカウントID:role/AWS-SystemsManager-AutomationExecutionRole in the target location is unable to be assumed.

cm-hirai-screenshot 2025-01-22 16.14.36

オートメーション自体の成功可否は管理アカウントからステータスで確認できますが、コマンド実行結果については管理アカウントから直接確認することはできません。
これらの詳細な情報を確認するには、メンバーアカウントにログインして確認する必要がありました。

今回は、エラーを解消し、管理アカウントからコマンド実行結果を確認する方法をご紹介します。

背景

解決方法を説明する前に、SSMオートメーションを実行するために必要なIAMロールについて説明します。

管理アカウントからメンバーアカウントにSSMオートメーションを実行するには、管理アカウントとメンバーアカウントの両方にIAMロールを作成する必要があります。

以下のAWSドキュメントでは、IAMロールを作成するための2種類のCloudFormationテンプレートが提供されています。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/running-automations-multiple-accounts-regions.html#setup-management-account-iam-roles

記事内でも紹介していますが、以下のIAMロールをそれぞれのアカウントで作成済みです。

  • 管理アカウント
    • 作成されるIAMロール:AWS-SystemsManager-AutomationAdministrationRole
    • 利用したテンプレート名:AWS-SystemsManager-AutomationAdministrationRole (org).yml
    • 作成方法:管理アカウントからCloudFormationスタックを作成
  • メンバーアカウント
    • 作成されるIAMロール:AWS-SystemsManager-AutomationExecutionRole
    • 利用したテンプレート名:AWS-SystemsManager-AutomationExecutionRole (org).yml
    • 作成方法:管理アカウントからメンバーアカウントに対して、CloudFormation StackSetsを作成

SSMオートメーションを実行する際、管理アカウントのAWS-SystemsManager-AutomationAdministrationRoleがメンバーアカウントのAWS-SystemsManager-AutomationExecutionRoleにAssumeRoleし、メンバーアカウントのEC2インスタンスでオートメーションランブックを実行します。

エラー原因

エラー原因は、メンバーアカウントのAWS-SystemsManager-AutomationExecutionRoleに、管理アカウントにログイン中のIAMロールやIAMユーザーに対するAssumeRoleの許可が設定されていないためです。

今回のエラー発生の流れは以下の通りです。

  1. 別アカウントでIAMユーザーとしてログインする
  2. 管理アカウントにスイッチロール(test-user)でログインしている
  3. IAMロール(test-user)からAWS-SystemsManager-AutomationExecutionRoleにAssumeRoleし、メンバーアカウントの実行結果を確認しようとしますが、AssumeRoleできずエラーが発生する

解決方法

メンバーアカウントのAWS-SystemsManager-AutomationExecutionRoleに以下のように信頼ポリシーを追加することで、管理アカウントにログイン中のIAMロール(例:test-user)がAssumeRoleできるようになり、管理アカウントからメンバーアカウントのコマンド実行結果を確認できるようになります。

AWS-SystemsManager-AutomationExecutionRoleの信頼ポリシー
{
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Principal": {
        "AWS": "arn:aws:iam::管理アカウントID:role/test-user"
    }
}

管理アカウント内のすべてのIAMロールやIAMユーザーからのAssumeRoleを許可する場合は、以下の設定を追加します。

AWS-SystemsManager-AutomationExecutionRoleの信頼ポリシー
{
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Principal": {
        "AWS": "arn:aws:iam::管理アカウントID:root"
    }
}

なお、すべてのIAMロールを対象に*を使用することはできないため、以下の設定は無効です。

{
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Principal": {
        "AWS": "arn:aws:iam::管理アカウントID:role/*"
    }
}

管理アカウントからCloudFormation StackSetsを使用してメンバーアカウントに作成したテンプレート「AWS-SystemsManager-AutomationExecutionRole (org).yml」に、以下の設定を追加します。

AWS-SystemsManager-AutomationExecutionRole (org).yml
        - Effect: Allow
          Principal:
            AWS:
              # Fn::Sub: "arn:aws:iam::${AdminAccountId}:root"
              Fn::Sub: "arn:aws:iam::${AdminAccountId}:role/test-user"
          Action: sts:AssumeRole

AWS-SystemsManager-AutomationExecutionRole (org).ymlの全体のテンプレートは以下の通りです。

AWS-SystemsManager-AutomationExecutionRole (org).ymlのベースはドキュメントのものです。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/running-automations-multiple-accounts-regions.html#setup-management-account-iam-roles

AWS-SystemsManager-AutomationExecutionRole (org).yml
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Configure the AWS-SystemsManager-AutomationExecutionRole.'
Parameters:
  AdminAccountId:
    Type: String
    Description: "The ID of the primary account from which automations will be initiated for your organization."
    MaxLength: 12
    MinLength: 12
  OrganizationID:
    Type: String
    Description: AWS Organizations ID.
    AllowedPattern: "^o-[a-z0-9]{10,32}$"
Resources:
  AWSSystemsManagerAutomationExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: AWS-SystemsManager-AutomationExecutionRole
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            AWS:
              Fn::Sub:
              - arn:${AWS::Partition}:iam::${AdminAccountId}:role/AWS-SystemsManager-AutomationAdministrationRole
              - AdminAccountId:
                  Ref: AdminAccountId
          Action: sts:AssumeRole
          Condition:
            StringEquals:
              aws:PrincipalOrgID:
                Ref: OrganizationID
        - Effect: Allow
          Principal:
            Service: ssm.amazonaws.com
          Action:
          - sts:AssumeRole
          Condition:
            StringEquals:
              aws:SourceAccount: 
                Fn::Sub: ${AWS::AccountId}
            ArnLike:
              aws:SourceArn: 
                Fn::Sub: arn:${AWS::Partition}:ssm:*:${AWS::AccountId}:automation-execution/*
        - Effect: Allow
          Principal:
            AWS:
              # Fn::Sub: "arn:aws:iam::${AdminAccountId}:root"
              Fn::Sub: "arn:aws:iam::${AdminAccountId}:role/test-user"
      ManagedPolicyArns:
      - Fn::Sub: arn:${AWS::Partition}:iam::aws:policy/service-role/AmazonSSMAutomationRole
      Path: "/"
      Policies:
      - PolicyName: ExecutionPolicy
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
          - Effect: Allow
            Action:
            - resource-groups:ListGroupResources
            - tag:GetResources
            - ec2:DescribeInstances
            Resource: "*"
          - Effect: Allow
            Action:
            - iam:PassRole
            Resource:
              Fn::Sub: arn:${AWS::Partition}:iam::${AWS::AccountId}:role/AWS-SystemsManager-AutomationExecutionRole

上記のテンプレートを利用し、作成済みのStackSetから[StackSet の詳細を編集]を選択し、テンプレートを更新します。
cm-hirai-screenshot 2025-01-23 8.13.44

IAMロール修正後

テンプレート修正後、再度、確認を行います。

管理アカウントからSSMオートメーションを実行した後に作成されたExecution IDをクリックします。

cm-hirai-screenshot 2025-01-22 17.34.06

対象メンバーアカウントごとにStep IDが作成され、それをクリックします。

cm-hirai-screenshot 2025-01-22 15.49.38
メンバーアカウントの実行詳細ページで、ExecutionIdをクリックします。

cm-hirai-screenshot 2025-01-22 15.51.53

エラーは発生せず、選択した対象アカウントで実行された各EC2インスタンスごとに異なるStep IDが表示されました。次に、EC2インスタンスのStep IDをクリックします。

cm-hirai-screenshot 2025-01-22 15.52.32

Step execution IDをクリックします。
cm-hirai-screenshot 2025-01-22 15.52.53
EC2インスタンスで、オートメーションランブックの各Stepごとに実行されたコマンドの結果を確認できます。

cm-hirai-screenshot 2025-01-22 15.53.05

さらに、特定のStep execution IDを選択することで、そのStepで実行されたコマンドの詳細な結果を確認できます。

cm-hirai-screenshot 2025-01-22 15.53.25

最後に

今回は、管理アカウントからSSMオートメーションを使用し、複数のメンバーアカウントのEC2インスタンスで実行した後に、コマンド実行結果を確認する方法をご紹介しました。

確認するには、AWSドキュメントで提供されているAWS-SystemsManager-AutomationExecutionRole (org).ymlテンプレートに、管理アカウントにログイン中のIAMユーザーやIAMロールがAssumeRoleできるよう、信頼ポリシーの追加設定を行う必要があります。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.