AWS Identity and Access Management (IAM) ID ユーザーまたはロールの信頼ポリシーを編集しようとしましたが、次のエラーが発生しました。 「信頼ポリシーを更新できませんでした。ポリシーに無効なプリンシパルがあります。」
簡単な説明
このエラーメッセージは、IAM 信頼ポリシーの Principal 要素の値が無効であることを示しています。このエラーを解決するには、次のことを確認してください。
- IAM ロールの信頼ポリシーで、Principal 要素に正しい形式のサポートされている値を使用していること。
- IAM ロールの信頼ポリシーにおいて、プリンシパルに IAM ユーザーまたはロールを使用している場合は、そのユーザーまたはロールが削除されていないことを確認してください。
注: 標準の AWS アカウントで AWS GovCloud (米国) のアカウント番号を追加しようとすると、その AWS GovCloud (米国) アカウントでもこのエラーが発生する場合があります。AWS GovCloud (米国) アカウントと標準の AWS アカウントの間のアクセスを委任するロールを作成することはできません。詳細については、「AWS GovCloud (US) における IAM の相違点」を参照してください。
解決策
Principal 要素でサポートされる値の確認
ロールの IAM 信頼ポリシーでは、Principal 要素に、次のサポートされている値が必要です。
-
IAM ポリシーに、次のように正しい 12 桁の AWS アカウント ID が含まれていることを確認してください。
"Principal":
{"AWS": "123456789012"
}
注: root ユーザーの Amazon リソースネーム (ARN) を使用して AWS アカウントを指定することもできます。たとえば、arn:aws:iam::123456789012:root のように指定します。
-
IAM 信頼ポリシーのプリンシパルが IAM ユーザー、IAM ロール、またはフェデレーションユーザーである場合は、次のように ARN 全体を指定する必要があります。
"Principal":
{ "AWS": [
"arn:aws:iam::123456789012:user/user-name",
"arn:aws:iam::123456789012:role/role-name",
"arn:aws:sts::123456789012:assumed-role/role-name/role-session-name",
"arn:aws:sts::123456789012:federated-user/user-name"
]
}
-
IAM 信頼ポリシーにワイルドカードが含まれている場合は、次のガイドラインに従ってください。
注: プリンシパル名や ARN の一部に一致させるために、ワイルドカード "*" を使用することはできません。次の例では、IAM 信頼ポリシーでワイルドカードを不適切に使用しています。
"Principal":
{ "AWS": "arn:aws:iam::123456789012:user/user-*"
}
ワイルドカードを使用してプリンシパル名の一部に一致させるには、Condition 要素とグローバル条件キー aws:PrincipalArn を使用します。 次に、ワイルドカードを使用して ARN を指定します。すべての AWS アカウントのアイデンティティを指定するには、次のようにワイルドカードを使用します。
"Principal": {
"AWS": "*"
}
重要: 信頼ポリシーでは、Principal 要素でワイルドカードを使用し、Allow 効果を指定することができます。ただしこの場合、同じパーティション内のすべての AWS アカウントの IAM ユーザー、引き受けられたロールセッション、またはフェデレーションユーザーがロールにアクセスできるようになります。AWS アカウント内の IAM ユーザーおよびロールプリンシパルには、他のアクセス許可は不要です。他の AWS アカウントのプリンシパルが IAM ロールを引き受けるには、アイデンティティベースのアクセス許可が必要です。この方法では、ウェブ ID セッションプリンシパル、SAML セッションプリンシパル、またはサービスプリンシパルはリソースにアクセスできません。この方法は、Condition 要素と aws:PrincipalArn などの条件キーを使用してアクセス許可を制限する場合にのみ使用するのがベストプラクティスです。この信頼ポリシーの例では、aws:PrincipalArn 条件キーを使用して、一致するユーザー名を持つユーザーのみが IAM ロールを引き受けられるようにしています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringLike": {
"aws:PrincipalArn": "arn:aws:iam::123456789012:user/user-*"
}
}
}
]
}
-
IAM ロールが AWS サービスロールの場合は、サービスプリンシパル全体を次のように指定する必要があります。
"Principal": {
"Service": "ec2.amazonaws.com"
}
-
SAML セッションプリンシパルと外部 SAML ID プロバイダーを使用することで、IAM ユーザーを認証できます。IAM ロールの信頼ポリシーには、次のような Principal 要素が必要です。
"Principal": {
"Federated": "arn:aws:iam::123456789012:saml-provider/provider-name"
}
-
ウェブ ID セッションプリンシパルを使用して IAM ユーザーを認証することができます。アクセスを許可する IAM ロールの信頼ポリシーには、次のような Principal 要素が必要です。
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
}
-
単一のステートメント内で複数のプリンシパルタイプを使用する場合は、次のような形式で IAM 信頼ポリシーを指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/user-name",
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
信頼ポリシーに AIDA または AROA プレフィックスが含まれていないことを確認する
信頼ポリシーに IAM エンティティの ARN を含む Principal 要素がある場合、ARN は保存時に一意のプリンシパル ID に変更されます。この一意のプリンシパル ID には、IAM ユーザーの場合は AIDA、IAM ロールの場合は AROA というプレフィックスが付きます。例を次に示します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"AIDAW4GTDFISYQEXAMPLE",
"AROAW4GTDFISYQEXAMPLE"
]
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
信頼ポリシーのプリンシパル ID が一意であることは、IAM ユーザーまたはロールが削除されたことを示しています。AWS では有効な ARN にマッピングできない場合に、プリンシパル ID が表示されます。信頼ポリシーを編集する場合は、プリンシパル ID を削除するか、有効な Principal ARN に置き換える必要があります。ポリシーを保存すると、ARN はユーザーまたはロールの新しい固有 ID に変わります。
詳細については、「IAM リソースベースのポリシーに不明なプリンシパル形式がある理由を知りたいです」を参照してください。
関連情報
IAM を使用してリソースへのユーザーアクセスを許可するにはどうすればよいですか?
AWS IAM を使用して他の AWS アカウントのリソースにアクセスする方法を教えてください