我嘗試編輯 AWS Identity and Access Management (IAM) 身分使用者或角色的信任政策,但收到下列錯誤: "Failed to update trust policy.Invalid principal in policy." (無法更新信任政策。政策中的主體無效。)
簡短說明
此錯誤訊息指出在您的 IAM 信任政策中的主體元素的值無效。若要解決此錯誤,請確認下列項目:
- 您的 IAM 角色信任政策會將正確格式的支援值用於主體元素。
- 如果 IAM 角色信任原則使用 IAM 使用者或角色作為主體,請確認尚未刪除該使用者或角色。
注意: 如果標準 AWS 帳戶嘗試新增 AWS GovCloud (美國) 帳戶號碼,AWS GovCloud (美國) 帳戶可能也會收到此錯誤。您無法建立角色,委派在 AWS GovCloud (美國) 帳戶與標準 AWS 帳戶之間的存取權。如需詳細資訊,請參閱 AWS GovCloud (美國) 的 IAM 如何不同。
解決方法
驗證主體元素的支援值
在您角色的 IAM 信任政策中的主體元素必須包含下列支援的值。
-
請確定 IAM 政策包含正確的 AWS 12 位數 AWS 帳戶 ID (類似於下列內容):
"Principal":
{"AWS": "123456789012"
}
注意: 您也可以使用根使用者 Amazon Resource Name (ARN) 來指定 AWS 帳戶。例如,arn:aws:iam::123456789012:root。
-
如果 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-*"
}
若要使用萬用字元搭配部分主體名稱,請使用具有全域條件金鑰 [aws:PrincipalArn 的條件元素。]() 然後使用萬用字元指定 ARN。若要從所有 AWS 帳戶指定身分,請使用與下列項目相似的萬用字元:
"Principal": {
"AWS": "*"
}
重要: 如果主體元素在信任政策中具有允許效果,則可以在該主體元素中使用萬用字元。但是,這可讓在同一分割區中任一 AWS 帳戶的任何 IAM 使用者、擔任的角色工作階段或聯合身分使用者存取您的角色。AWS 帳戶中的 IAM 使用者和角色主體不需要任何其他許可。其他 AWS 帳戶中的主體必須具有身分型許可,才能擔任您的 IAM 角色。此方法不允許 Web 身分工作階段主體、SAML 工作階段主體或服務主體存取您的資源。最佳實務為僅使用此方法搭配條件元素和條件金鑰 (例如 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 工作階段主體來驗證 IAM 使用者。IAM 角色的信任政策必須具有類似於下列內容的主體元素:
"Principal": {
"Federated": "arn:aws:iam::123456789012:saml-provider/provider-name"
}
-
您可以使用 Web 身分工作階段主體來驗證 IAM 使用者。提供存取權之 IAM 角色的信任政策必須具有類似於下列內容的主體元素:
"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 的主體元素,則 ARN 在儲存時會變更為唯一的主體 ID。這個唯一的主體 ID 對 IAM 使用者具有前綴 AIDA,對 IAM 角色具有前綴 AROA,類似於下列:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"AIDAW4GTDFISYQEXAMPLE",
"AROAW4GTDFISYQEXAMPLE"
]
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
以信任政策中的唯一主體 ID 表示 IAM 使用者或角色已刪除。主體 ID 會出現,因為 AWS 無法將其對應回有效的 ARN。如果您編輯信任政策,則必須移除主體 ID,或以有效的主體 ARN 取代它。儲存政策後,ARN 會變更為使用者或角色的新唯一 ID。
如需更多資訊,請參閱為什麼我的以 IAM 資源為基礎的政策中具有未知的主體格式?
相關資訊
如何使用 IAM 允許使用者存取資源?
如何使用 AWS IAM 存取另一個 AWS 帳戶中的資源?