管理アカウントからメンバーアカウントにSSMオートメーションを実行し、実行結果詳細を確認する方法
はじめに
前回の記事では、以下の構成を用いて、管理アカウントからSSMオートメーションを使用し、複数のメンバーアカウントのEC2インスタンスで実行する方法をご紹介しました。
記事でも紹介していますが、問題点として、管理アカウントのマネジメントコンソール上で、メンバーアカウントのコマンド実行結果が確認できない点がありました。
問題点である事象を説明します。
管理アカウントからSSMオートメーションを実行すると、まずExecution IDが作成されます。
Execution IDをクリックすると、対象メンバーアカウントごとにStep IDが作成されます。
Step IDをクリックすると、実行詳細ページに遷移します。しかし、ExecutionId
はメンバーアカウントのExecutionId
に紐づいており、以下のスクリーンショットに示されているExecutionId
(例: 8df83893-10ba-4fa6-8e7f-1520667bbc34
)を選択しても、実行結果内容(コマンド実行結果)は確認できません。
クリックすると、以下のエラーになります。
The execution role arn:aws:iam::メンバーアカウントID:role/AWS-SystemsManager-AutomationExecutionRole in the target location is unable to be assumed.
オートメーション自体の成功可否は管理アカウントからステータスで確認できますが、コマンド実行結果については管理アカウントから直接確認することはできません。
これらの詳細な情報を確認するには、メンバーアカウントにログインして確認する必要がありました。
今回は、エラーを解消し、管理アカウントからコマンド実行結果を確認する方法をご紹介します。
背景
解決方法を説明する前に、SSMオートメーションを実行するために必要なIAMロールについて説明します。
管理アカウントからメンバーアカウントにSSMオートメーションを実行するには、管理アカウントとメンバーアカウントの両方にIAMロールを作成する必要があります。
以下のAWSドキュメントでは、IAMロールを作成するための2種類のCloudFormationテンプレートが提供されています。
記事内でも紹介していますが、以下の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の許可が設定されていないためです。
今回のエラー発生の流れは以下の通りです。
- 別アカウントでIAMユーザーとしてログインする
- 管理アカウントにスイッチロール(test-user)でログインしている
- IAMロール(test-user)からAWS-SystemsManager-AutomationExecutionRoleにAssumeRoleし、メンバーアカウントの実行結果を確認しようとしますが、AssumeRoleできずエラーが発生する
解決方法
メンバーアカウントのAWS-SystemsManager-AutomationExecutionRoleに以下のように信頼ポリシーを追加することで、管理アカウントにログイン中のIAMロール(例:test-user)がAssumeRoleできるようになり、管理アカウントからメンバーアカウントのコマンド実行結果を確認できるようになります。
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "arn:aws:iam::管理アカウントID:role/test-user"
}
}
管理アカウント内のすべてのIAMロールやIAMユーザーからのAssumeRoleを許可する場合は、以下の設定を追加します。
{
"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」に、以下の設定を追加します。
- 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のベースはドキュメントのものです。
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 の詳細を編集]を選択し、テンプレートを更新します。
IAMロール修正後
テンプレート修正後、再度、確認を行います。
管理アカウントからSSMオートメーションを実行した後に作成されたExecution IDをクリックします。
対象メンバーアカウントごとにStep IDが作成され、それをクリックします。
メンバーアカウントの実行詳細ページで、ExecutionIdをクリックします。
エラーは発生せず、選択した対象アカウントで実行された各EC2インスタンスごとに異なるStep IDが表示されました。次に、EC2インスタンスのStep IDをクリックします。
Step execution ID
をクリックします。
EC2インスタンスで、オートメーションランブックの各Stepごとに実行されたコマンドの結果を確認できます。
さらに、特定のStep execution ID
を選択することで、そのStepで実行されたコマンドの詳細な結果を確認できます。
最後に
今回は、管理アカウントからSSMオートメーションを使用し、複数のメンバーアカウントのEC2インスタンスで実行した後に、コマンド実行結果を確認する方法をご紹介しました。
確認するには、AWSドキュメントで提供されているAWS-SystemsManager-AutomationExecutionRole (org).ymlテンプレートに、管理アカウントにログイン中のIAMユーザーやIAMロールがAssumeRoleできるよう、信頼ポリシーの追加設定を行う必要があります。