AWS IAM の信頼関係のプリンシパルに AWS アカウントを指定した際に作成や更新ができない場合の対処

本仕様を利用して AWS アカウント ID の存在確認が行えます
2024.01.15

こんにちは、CX 事業本部製造ビジネステクノロジー部の若槻です。

AWS IAM のロールやポリシーでは、信頼関係のプリンシパルに AWS アカウントを指定することができます。これにより AWS アカウントによるアクセス制御を行うことができます。

今回は、この IAM ロールやポリシーの信頼関係のプリンシパルに AWS アカウントを指定した際にエラーが発生する場合の対処について確認をしました。

事象

IAM ロールの作成時

マネジメントコンソールから IAM ロールを作成しようとすると、以下のようにエラーが発生します。

Failed to create role test-20240115-role.
Invalid principal in policy: "AWS":"123456789012"

IAM ロールの更新時

マネジメントコンソールから IAM ロールを更新しようとすると、以下のようにエラーが発生します。

Failed to update trust policy.
Invalid principal in policy: "AWS":"arn:aws:iam::123456789012:root"

S3 バケットポリシーの更新時

マネジメントコンソールから S3 バケットポリシーを更新しようとすると、以下のようにエラーが発生します。

Unknown Error
An unexpected error occurred.

API response
Invalid principal in policy

AWS CDK での IAM ロールの作成時

AWA CDK で次のような定義で IAM ロールを作成しようとしました。

lib/cdk-sample-stack.ts

import { aws_iam, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new aws_iam.Role(this, 'Role', {
      assumedBy: new aws_iam.AccountPrincipal('123456789012'),
    });
  }
}

しかし CDK デプロイを行うと、以下のようにエラーが発生します。

$ cdk deploy


✨  Synthesis time: 2.72s

CdkSampleStack:  start: Building 806f25da605f1e107b3216e1ffa2cd6934a7663a29c983364edff48c2769ad1e:current_account-current_region
CdkSampleStack:  success: Built 806f25da605f1e107b3216e1ffa2cd6934a7663a29c983364edff48c2769ad1e:current_account-current_region
CdkSampleStack:  start: Publishing 806f25da605f1e107b3216e1ffa2cd6934a7663a29c983364edff48c2769ad1e:current_account-current_region
CdkSampleStack:  success: Published 806f25da605f1e107b3216e1ffa2cd6934a7663a29c983364edff48c2769ad1e:current_account-current_region
CdkSampleStack: deploying... [1/1]
CdkSampleStack: updating stack...
2:51:41 AM | UPDATE_FAILED        | AWS::IAM::Role                | Role1ABCC5F0
Resource handler returned message: "Invalid principal in policy: "AWS":"arn:aws:iam::123456789012:root" (Servi
ce: Iam, Status Code: 400, Request ID: 8b5f8d1b-f3be-4782-9dee-13071ca246d5)" (RequestToken: b8083695-ac6c-905
b-d94b-e141c71058cf, HandlerErrorCode: InvalidRequest)

原因

エラーの原因は、プリンシパルに存在しない AWS アカウント ID を指定していたためでした。

存在しているアカウントを指定すると、エラーとならずに作成することができました。

おわりに

AWS IAM の信頼関係のプリンシパルに AWS アカウントを指定した際に作成や更新ができない場合の対処について確認してみました。

存在しないアカウントを意図的もしくは入力ミスにより指定していた場合に発生するエラーでした。同様のエラーが発生した場合は正しい AWS アカウントが指定されているか確認するようにしましょう。

もしくは、本仕様を利用して AWS アカウント ID の存在確認を行うこともできるでしょう。ユースケースはあまり思いつきませんが。

以上