

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# IAM 政策疑難排解
<a name="troubleshoot_policies"></a>

[政策](access_policies.md)是 中的實體，當連接到身分或資源時， AWS 會定義其許可。當委託人如使用者提出請求時， 會 AWS 評估這些政策。政策中的許可決定是否允許或拒絕請求。政策會以 JSON 文件 AWS 形式存放在 中，這些文件會以*身分型政策*的形式連接至主體，或以*資源型政策*的形式連接至資源。您可以連接以身分為基礎的政策到主體 (或身分)，例如 IAM 群組、使用者或角色。以身分為基礎的政策包括 AWS 受管政策、客戶受管政策以及內嵌政策。您可以使用**視覺化**和 **JSON** 編輯器選項 AWS 管理主控台 ，在 中建立和編輯客戶受管政策。當您在 中檢視政策時 AWS 管理主控台，您可以看到該政策授予的許可摘要。您可以使用視覺化編輯器和政策摘要幫助診斷並修正在管理 IAM 政策時遇到的常見錯誤。

請記住，所有 IAM 政策是使用以 [JavaScript Object Notation (JavaScript 物件註釋) (JSON)](http://www.json.org) 規則開頭的語法所儲存的。您不需要了解該語法即可建立或管理您政策。您可以在 AWS 管理主控台中使用視覺化編輯器來建立和編輯政策。若要進一步了解 IAM 中 JSON 語法的詳細資訊，請參閱 [IAM JSON 政策語言的文法](reference_policies_grammar.md)。

**針對 IAM 政策主題進行故障診斷**
+ [使用視覺化編輯器進行故障排除](#troubleshoot_policies-viseditor)
  + [政策結構調整](#troubleshoot_viseditor-restructure)
  + [在視覺化編輯器中選擇資源 ARN](#troubleshoot_policies-resource-arn)
  + [在視覺化編輯器中拒絕許可](#troubleshoot_policies-switch-deny)
  + [在視覺化編輯器中指定多個服務](#troubleshoot_policies-multiple-services)
  + [在視覺化編輯器中縮減政策大小](#troubleshoot_policy-size)
  + [在視覺化編輯器中修正無法識別的服務、動作或資源類型](#troubleshoot_policies-unrecognized-visual)
+ [使用政策摘要進行疑難排解](#troubleshoot_policies-polsum)
  + [缺少政策摘要](#missing-policy-summary)
  + [政策摘要包含無法識別的服務、動作或資源類型](#unrecognized-services-actions)
  + [服務不支援 IAM 政策摘要](#unsupported-services-actions)
  + [我的政策未授與預期的許可](#policy-summary-not-grant-permissions)
+ [故障排除政策管理](#troubleshoot_policies-policy-manage)
  + [在 IAM 帳戶中連接或分開政策](#troubleshoot_roles_cant-attach-detach-policy)
  + [根據 IAM 身分的活動來變更其政策](#troubleshoot_change-policies-based-on-activity)
+ [JSON 政策文件故障排除](#troubleshoot_policies-json)
  + [驗證您的政策](#usepolicyvalidation)
  + [我在 JSON 編輯器中沒有政策驗證的許可](#nopermsforpolicyvalidation)
  + [多個 JSON 政策物件](#morethanonepolicyblock)
  + [多個 JSON 陳述式元素](#morethanonestatement)
  + [在 JSON 陳述式元素中具有多個效果、動作或資源元素](#duplicateelement)
  + [缺少 JSON 版本元素](#missing-version)

## 使用視覺化編輯器進行故障排除
<a name="troubleshoot_policies-viseditor"></a>

在建立或編輯客戶管理政策時，您可以使用**視覺化**編輯器中的資訊，來協助您針對政策中的錯誤進行故障排除。若要檢視使用視覺化編輯器建立政策的範例，請參閱 [控制對身分的存取](access_controlling.md#access_controlling-identities)。

### 政策結構調整
<a name="troubleshoot_viseditor-restructure"></a>

當您建立政策時， 會在儲存政策之前 AWS 驗證、處理和轉換政策。擷取政策時， 會將政策 AWS 轉換回人類可讀取的格式，而不會變更許可。這會導致您在政策視覺化編輯器或 **JSON** 索引標籤中看到的內容有所不同。
+ 可以新增、移除或重新排序視覺化編輯器許可區塊，而且區塊內的內容可以最佳化。
+ 在 **JSON** 標籤中，可以移除較不重要的空格，並且可以將 JSON 映射中的元素重新排序。此外，委託人元素中的 AWS 帳戶 IDs 可以由 的 Amazon Resource Name (ARN) 取代 AWS 帳戶根使用者。

由於可能發生這些更改，不應以字串形式來比較 JSON 政策文件。

當您在 中建立客戶受管政策時 AWS 管理主控台，您可以選擇在 **JSON** 編輯器中完全運作。如果從未在**視覺化**編輯器中變更政策，並在 **JSON** 編輯器中選擇**下一步**，則不太可能會調整政策結構。當您使用**視覺化**編輯器時，IAM 可能會調整政策結構，以最佳化其外觀。此結構調整僅在您的編輯工作階段中進行，不會自動儲存。

如果您的政策在編輯工作階段中進行結構調整，則 IAM 會根據以下情況確定是否儲存結構調整：


| 使用此編輯器選項 | 若您編輯政策 | 然後從該索引標籤選擇***下一步*** | 當您選擇 ***Save changes (儲存變更)*** 時 | 
| --- | --- | --- | --- | 
| 視覺化 | 已編輯 | 視覺化 | 對政策進行結構調整 | 
| 視覺化 | 已編輯 | JSON | 對政策進行結構調整 | 
| 視覺化 | 未編輯 | 視覺化 | 對政策進行結構調整 | 
| JSON | 已編輯 | 視覺化 | 對政策進行結構調整 | 
| JSON | 已編輯 | JSON | 此政策結構未變更 | 
| JSON | 未編輯 | JSON | 此政策結構未變更 | 

IAM 可能會對複雜政策或具有允許多個服務、資源類型或條件金鑰的許可區塊或陳述式之政策進行結構調整。

### 在視覺化編輯器中選擇資源 ARN
<a name="troubleshoot_policies-resource-arn"></a>

在使用視覺化編輯器建立或編輯政策時，您必須先選擇一個服務，然後從該服務中選擇動作。如果選取的服務和動作支援選擇的[特定資源](access_controlling.md#access_controlling-resources)，視覺化編輯器將列出支援的資源類型。然後您可以選擇 **Add ARN (新增 ARN)** 來提供關於資源的詳細資訊。您可以從以下選項中進行選擇以新增資源類型的 ARN。
+ **使用 ARN 產生器**：根據資源類型，您可能會看到用於建置 ARN 的不同欄位。您也可以選擇 **Any (任意)** 來為指定設定的任何值提供許可。例如，若您選取了 Amazon EC2 **Read (讀取)** 存取等級群組，那麼您政策中的動作便支援 `instance` 資源類型。提供**區域**、**帳戶**以及資源的 **InstanceId** 值。如果提供帳戶 ID 並為區域和執行個體 ID 選擇**任意**，則政策會為您帳戶中的任何執行個體授予許可。
+ **輸入或貼上 ARN**：[您可以根據資源的 Amazon Resource Name (ARN)](reference_identifiers.md#identifiers-arns) 來指定資源。您也可以在 ARN 的任何欄位中包含萬用字元 (**\$1**) (在每組冒號之間)。如需詳細資訊，請參閱[IAM JSON 政策元素：Resource](reference_policies_elements_resource.md)。

### 在視覺化編輯器中拒絕許可
<a name="troubleshoot_policies-switch-deny"></a>

預設情況下，您使用視覺化編輯器建立的政策允許執行您選擇的動作。若要拒絕選擇的動作，請選擇 **Switch to deny permissions (切換為拒絕許可)**。由於*預設會拒絕*請求，建議您僅允許使用者所需動作和資源的許可。只有在要覆蓋其他陳述式或政策單獨允許的許可時，才應建立拒絕陳述式。我們建議您將拒絕許可數限制為最低，因為它們可能會增加解決許可問題的難度。如需 IAM 評估政策邏輯之方法的詳細資訊，請參閱 [政策評估邏輯](reference_policies_evaluation-logic.md)。

**注意**  
根據預設，只有 AWS 帳戶根使用者 可以存取該帳戶中的所有資源。因此，如果未以根使用者登入，您必須具有政策授與的許可。

### 在視覺化編輯器中指定多個服務
<a name="troubleshoot_policies-multiple-services"></a>

在使用視覺化編輯器建構政策時，您每次只能選擇一個服務。這是一項最佳實務，因為視覺化編輯器允許您從該服務的動作中進行選擇。然後，您可以從該服務和選定的動作支援的資源中進行選擇。如此一來就可以更輕鬆地建立政策和進行故障排除。

還可以使用萬用字元 (\$1) 手動指定多個服務。例如，輸入 **Code\$1**，以便為以 `Code` 開頭的所有服務 (如 `CodeBuild` 與 `CodeCommit`) 提供許可。不過，您必須接著輸入動作和資源 ARN 以完成您的政策。此外，在儲存您的政策時，可能會進行[結構調整](#troubleshoot_viseditor-restructure)，以在單獨的許可區塊中包含每個服務。

或者，若要在服務中使用 JSON 語法 (如萬用字元)，請使用 **JSON** 編輯器選項來建立、編輯和儲存政策。

### 在視覺化編輯器中縮減政策大小
<a name="troubleshoot_policy-size"></a>

在使用視覺化編輯器建立政策時，IAM 將建立一個 JSON 文件來存放您的政策。您可以切換到 **JSON** 編輯器選項來檢視該文件。如果該 JSON 文件超過政策的大小限制，視覺化編輯器將顯示錯誤訊息。您將無法檢閱和儲存政策。若要查看 IAM 對於受管政策的大小限制，請參閱 [IAM 和 STS 字元限制](reference_iam-quotas.md#reference_iam-quotas-entity-length)。

若要在視覺化編輯器中縮減您的政策大小，請編輯您的政策或將許可區塊移到另一個政策。錯誤訊息包括政策文件所包含的字元數。可以使用此資訊來協助縮減政策的大小。

### 在視覺化編輯器中修正無法識別的服務、動作或資源類型
<a name="troubleshoot_policies-unrecognized-visual"></a>

在視覺化編輯器可能會看到一條警告，指出您的政策包含無法識別的服務、動作或資源類型。

**注意**  
IAM 對支援政策摘要的服務檢閱服務名稱、動作和資源類型。不過，您的政策摘要可能包含不存在資源值或條件。請一律使用[政策模擬器](access_policies_testing-policies.md)來測試政策。

如果您的政策包含無法識別的服務、動作或資源類型，則存在以下錯誤之一：
+ **預覽服務**：處於預覽狀態的服務不支援視覺化編輯器。如果您參與預覽，則必須手動輸入動作和資源 ARN 以完成您的政策。可以忽略任何警告並繼續。或者，您可以選擇 **JSON** 編輯器選項，來輸入或貼上 JSON 政策文件。
+ **自訂服務**：自訂服務不支援視覺化編輯器。如果您使用自訂服務，則必須手動輸入動作和資源 ARN 以完成您的政策。可以忽略任何警告並繼續。或者，您可以選擇 **JSON** 編輯器選項，來輸入或貼上 JSON 政策文件。
+ **服務不支援視覺化編輯器**：如果您的政策包含不支援視覺化編輯器的公開提供 (GA) 服務，則必須手動輸入動作和資源 ARN 以完成您的政策。可以忽略任何警告並繼續。或者，您可以選擇 **JSON** 編輯器選項，來輸入或貼上 JSON 政策文件。

  公開提供服務是公開發佈的服務，不是預覽或自訂服務。如果無法識別的服務是公開提供的，並且名稱拼寫正確，則該服務不支援視覺化編輯器。若要了解如何請求 GA 服務的視覺化編輯器或政策摘要支援，請參閱 [服務不支援 IAM 政策摘要](#unsupported-services-actions)。
+ **動作不支援視覺化編輯器**：如果您政策包含的受支援服務具有不支援的動作，則必須手動輸入動作和資源 ARN 以完成您的政策。可以忽略任何警告並繼續。或者，您可以選擇 **JSON** 編輯器選項，來輸入或貼上 JSON 政策文件。

  如果您的政策包含的受支援服務具有不支援的動作，則該服務不完全支援視覺化編輯器。若要了解如何請求 GA 服務的視覺化編輯器或政策摘要支援，請參閱 [服務不支援 IAM 政策摘要](#unsupported-services-actions)。
+ **資源類型不支援視覺化編輯器**：如果您的政策包含的受支援動作具有不支援的資源類型，您可以忽略該警告並繼續。不過，IAM 無法確認是否包含所有選定動作的資源，且您可能會看到額外的警告。
+ **拼寫錯誤**：在視覺化編輯器中手動輸入服務、動作或資源時，您建立的政策可能會包含拼寫錯誤。建議您從服務和動作清單中進行選取，以使用視覺化編輯器。然後，根據提示完成資源區段。如果服務不完全支援視覺化編輯器，您可能需要手動輸入某些政策部分。

  如果您確定自己的政策不包含上述任何錯誤，那麼您的政策可能包含拼寫錯誤。檢查是否有下列問題：
  + 拼寫錯誤的服務、動作和資源類型名稱，例如 `s2` 而非 `s3` 或 `ListMyBuckets` 而非 `ListAllMyBuckets`
  + ARN 中不必要的文字，例如 `arn:aws:s3: : :*`
  + 動作中缺少冒號，例如 `iam.CreateUser`

  您可以透過選擇**下一步**來檢視政策摘要，從而對可能包含拼寫錯誤的政策進行評估。然後，確認政策是否提供預期的許可。

## 使用政策摘要進行疑難排解
<a name="troubleshoot_policies-polsum"></a>

您可以診斷並解決與政策摘要相關的問題。

### 缺少政策摘要
<a name="missing-policy-summary"></a>

IAM 主控台中提供了*政策摘要*表，這些表總結政策中對每個服務允許或拒絕的存取級別、資源和條件。政策摘要列於三個表中：[政策摘要](access_policies_understand-policy-summary.md)、[服務摘要](access_policies_understand-service-summary.md)以及[動作摘要](access_policies_understand-action-summary.md)。*政策摘要*表包括由所選政策定義的服務清單和許可摘要。您可以在該政策的**政策詳細資訊**頁面上，檢視連接至實體之任何政策的[政策摘要](access_policies_understand.md)。您可以在 **Policies** (政策) 頁面上檢視受管政策的政策摘要。如果 AWS 無法轉譯政策的摘要，您會看到 JSON 政策文件和下列錯誤：

**A summary for this policy cannot be generated. (無法產生此政策的摘要。) You can still view or edit the JSON policy document.** (您仍可以檢視或編輯 JSON 政策文件。)

如果您的政策不包含摘要，則已發生下列錯誤之一：
+ **不支援的政策元素**：IAM 不支援為包含以下其中一項[政策元素](reference_policies_elements.md)的政策產生政策摘要：
  + `Principal`
  + `NotPrincipal`
  + `NotResource`
+ **無政策許可**：如果政策不提供任何有效許可，則無法產生政策摘要。例如，如果政策包含元素 `"NotAction": "*"` 的單一陳述式，則它將授與對於除「所有動作」(\$1) 之外的所有動作的存取權。這代表它未授與對任何內容的 `Deny` 或 `Allow` 的存取權。
**注意**  
請謹慎使用 `NotPrincipal`、`NotAction` 和 `NotResource` 等政策元素。如需使用政策元素的資訊，請參閱 [IAM JSON 政策元素參考](reference_policies_elements.md)。

  如果提供不相符的服務和資源，則可能會建立一個不提供有效許可的政策。指定一個服務中的動作和另一個服務中的資源時可能會發生這種情況。在這種情況下，仍然會出現政策摘要。唯一顯示出有問題的跡象是摘要中的資源列可能包含來自不同服務的資源。如果此欄位包含不相符的資源，則您應該檢閱您的政策錯誤。使用[政策模擬器](access_policies_testing-policies.md)來測試政策，從而更好地了解政策。

### 政策摘要包含無法識別的服務、動作或資源類型
<a name="unrecognized-services-actions"></a>

在 IAM 主控台中，若[政策摘要](access_policies_understand.md)包含警告符號 (![\[Warning hazard sign icon with yellow triangle background.\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/console-alert-icon.console.png))，則政策可能包含無法識別的服務、動作或資源類型。若要了解政策摘要中的警示，請參閱 [政策摘要 (服務清單)](access_policies_understand-policy-summary.md)。

**注意**  
IAM 會對支援政策摘要的服務檢閱服務名稱、動作和資源類型。不過，您的政策摘要可能包含不存在資源值或條件。請一律使用[政策模擬器](access_policies_testing-policies.md)來測試政策。

如果您的政策包含無法識別的服務、動作或資源類型，則存在以下錯誤之一：
+ **預覽服務**：處於預覽狀態的服務不支援政策摘要。
+ **自訂服務**：自訂服務不支援政策摘要。
+ **服務不支援摘要**：如果您的政策包括不支援政策摘要的公開提供 (GA) 服務，則該服務將包含在政策摘要表的 **Unrecognized services (無法識別的服務)** 部分。公開提供服務是公開發佈的服務，不是預覽或自訂服務。如果無法識別的服務是公開提供的，並且名稱拼寫正確，則該服務不支援 IAM 政策摘要。若要了解如何請求 GA 服務的政策摘要支援，請參閱 [服務不支援 IAM 政策摘要](#unsupported-services-actions)。
+ **動作不支援摘要**：如果您的政策包含的受支援服務具有不受支援的動作，則該動作將包含在服務摘要表的 **Unrecognized actions (無法識別的動作)** 部分。若要了解服務摘要中的警示，請參閱 [服務摘要 (動作清單)](access_policies_understand-service-summary.md)。
+ **資源類型不支援摘要**：如果您政策包含的受支援動作具有不受支援的資源類型，則該資源將包含在服務摘要表的 **Unrecognized resource types (無法識別的資源類型)** 部分。若要了解服務摘要中的警示，請參閱 [服務摘要 (動作清單)](access_policies_understand-service-summary.md)。
+ **Typo** – AWS 檢查 JSON 在語法上是否正確，並且政策不包含錯別字或其他錯誤作為[政策驗證](access_policies_policy-validator.md)的一部分。

**注意**  
作為[最佳實務](best-practices.md)，我們會建議使用您 IAM Access Analyzer 驗證 IAM 政策，確保許可安全且可正常運作。我們建議您開啟現有政策並檢閱並解決任何政策驗證建議。

### 服務不支援 IAM 政策摘要
<a name="unsupported-services-actions"></a>

IAM 政策摘要或視覺化編輯器可能不支援一般可用 (GA) 的服務或動作。公開提供服務是公開發佈的服務而非預覽或自訂服務。如果無法識別的服務是公開提供的，並且名稱拼寫正確，則該服務不支援這些功能。如果您的政策包含的受支援服務具有不支援的動作，則該服務不完全支援 IAM 政策摘要。

**請求服務新增 IAM 政策摘要或視覺化編輯器支援**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 找到包含不受支援服務的政策：
   + 若政策為受管政策，請在導覽窗格中選擇 **Policies** (政策)。在政策清單中，選擇您要檢視的政策名稱。
   + 如果該政策是連接到使用者的內嵌政策，請在導覽窗格中選擇 **Users** (使用者)。在使用者清單中，選擇要檢視其政策的使用者的名稱。在使用者的政策表中，展開您要查看政策摘要的標題。

1. 在 AWS 管理主控台 頁尾的左側，選擇**意見回饋**。在 **IAM 的意見反應**方塊中，輸入 **I request that the <ServiceName> service add support for IAM policy summaries and the visual editor**。若您希望一個以上的服務支援摘要，請輸入 **I request that the <ServiceName1>, <ServiceName2>, and <ServiceName3> services add support for IAM policy summaries and the visual editor**。

**請求服務新增對缺漏動作的 IAM 政策摘要支援**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 找到包含不受支援服務的政策：
   + 若政策為受管政策，請在導覽窗格中選擇 **Policies** (政策)。在政策清單中，選擇您要檢視的政策名稱。
   + 如果該政策是連接到使用者的內嵌政策，請在導覽窗格中選擇 **Users** (使用者)。在使用者清單中，選擇要檢視其政策的使用者的名稱。在使用者的政策表中，選擇您要檢視的政策名稱來展開政策摘要。

1. 在政策摘要中，選擇包含不支援動作的服務的名稱。

1. 在 AWS 管理主控台 頁尾的左側，選擇**意見回饋**。在 **IAM 的意見反應**方塊中，輸入 **I request that the <ServiceName> service add IAM policy summary and the visual editor support for the <ActionName> action**。若您希望報告超過一個未受支援的動作，請輸入 **I request that the <ServiceName> service add IAM policy summary and the visual editor support for the <ActionName1>, <ActionName2>, and <ActionName3> actions**。

若要請求包含缺少之動作的不同服務，請重複最後三個步驟。

### 我的政策未授與預期的許可
<a name="policy-summary-not-grant-permissions"></a>

若要指派許可給使用者、群組、角色或資源，您必須建立一個*政策*，其為一個定義許可的文件。政策文件包含下列元素：
+ **效果**：政策是否允許或拒絕存取
+ **動作**：政策允許或拒絕的動作清單
+ **資源**：動作可在其中發生的資源清單
+ **條件**：(選擇性) 政策授與許可的條件

若要了解這些內容與其他政策元素，請參閱 [IAM JSON 政策元素參考](reference_policies_elements.md)。

若要授與存取，您的政策必須定義含有支援的資源之動作。如果您的政策也包含條件，則該條件必須包含一個[全域條件鍵](reference_policies_condition-keys.md)或者必須套用到動作。若要了解受動作支援的資源，請參閱您服務的 [AWS 文件](https://docs.aws.amazon.com/)。若要了解 動作支援的條件，請參閱 [AWS 服務的動作、資源和條件金鑰](reference_policies_actions-resources-contextkeys.html)。

檢查您的政策是否定義不會授予許可的動作、資源或條件。使用 IAM 主控台 (網址為 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) 檢視政策的[政策摘要](access_policies_understand-policy-summary.md)。您可以使用政策摘要來辨識並修正政策中的問題。

對於元素不依照 IAM 政策中的定義授與許可的情況，原因可能有：
+ [**定義了動作，但是沒有適用的資源**](#mismatch_action-no-resource)
+ [**定義了資源，但是沒有適用的動作**](#mismatch_resource-no-action)
+ [**定義了條件，但是沒有適用的動作**](#mismatch_condition-no-match)

若要檢視包含警告的政策摘要的範例，請參閱 [政策摘要 (服務清單)](access_policies_understand-policy-summary.md)。

#### 已定義動作，但是沒有適用的資源
<a name="mismatch_action-no-resource"></a>

下方的政策定義了所有 `ec2:Describe*` 動作和一個特定資源。這些動作都不支援資源級許可，因而未授與任何 `ec2:Describe` 動作。資源級許可表示動作使用政策的 [`Resource`](reference_policies_elements_resource.md) 元素中的 [ARN](reference_identifiers.md#identifiers-arns) 來支援資源。如果動作不支援資源層級許可，則政策中的陳述式必須在 `Resource` 元素中使用萬用字元 (`*`)。若要了解哪些服務支援資源層級的許可，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:Describe*",
            "Resource": "arn:aws:ec2:us-east-2:111122223333:instance/*"
        }
    ]
}
```

------

此政策不提供任何許可，而政策摘要包含下列錯誤：

`This policy does not grant any permissions. To grant access, policies must have an action that has an applicable resource or condition.`

若要修正此政策，您必須使用 `Resource` 元素中的 `*`。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Effect": "Allow",
        "Action": "ec2:Describe*",
        "Resource": "*"
    }]
}
```

------

#### 已定義資源，但是沒有適用的動作
<a name="mismatch_resource-no-action"></a>

下面的政策定義了 Amazon S3 儲存貯體資源，但不包含可在該資源上執行的 S3 動作。此政策也會授與完整存取權限給所有 Amazon CloudFront 動作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
        "Effect": "Allow",
        "Action": "cloudfront:*",
        "Resource": [
            "arn:aws:cloudfront:*",
            "arn:aws:s3:::amzn-s3-demo-bucket"
        ]
        }
    ]
}
```

------

此政策為所有 CloudFront 動作提供許可。但是，因為政策定義 S3 `amzn-s3-demo-bucket` 資源卻未定義任何 S3 動作，政策摘要包含下列警告：

`This policy defines some actions, resources, or conditions that do not provide permissions. To grant access, policies must have an action that has an applicable resource or condition.`

若要修正此政策以提供 S3 儲存貯體許可，您必須定義可在儲存貯體資源上執行的 S3 動作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudfront:*",
                "s3:CreateBucket",
                "s3:ListBucket*",
                "s3:PutBucket*",
                "s3:GetBucket*"
            ],
            "Resource": [
                "arn:aws:cloudfront:*",
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        }
    ]
}
```

------

或者，若要修正此政策僅提供 CloudFront 許可，請移除 S3 資源。

#### 已定義條件，但是沒有適用的動作
<a name="mismatch_condition-no-match"></a>

如果 S3 字首等同於 `custom` 而版本 ID 等同於 `1234`，下列政策會為所有 S3 資源定義兩項 Amazon S3 動作。但是，`s3:VersionId` 條件金鑰用於物件版本標記，不受所定義的儲存貯體動作的支援。若要了解 動作支援的條件，請參閱 [AWS 服務的動作、資源和條件金鑰](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html)，然後選擇 服務以檢視條件金鑰的服務文件。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketVersions",
                "s3:ListBucket"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "custom"
                    ],
                    "s3:VersionId": [
                        "1234"
                    ]
                }
            }
        }
    ]
}
```

------

如果儲存貯體名稱包含 `s3:ListBucketVersions` 字首，此政策為 `s3:ListBucket` 動作和 `custom` 動作提供許可。但是，由於 `s3:VersionId` 條件不受任何定義的動作支援，政策摘要包含下列錯誤：

`This policy does not grant any permissions. To grant access, policies must have an action that has an applicable resource or condition.`

若要修正此政策來使用 S3 物件版本標記，您必須定義支援 `s3:VersionId` 條件金鑰的 S3 動作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketVersions",
                "s3:ListBucket",
                "s3:GetObjectVersion"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "custom"
                    ],
                    "s3:VersionId": [
                        "1234"
                    ]
                }
            }
        }
    ]
}
```

------

此政策為政策中的每個動作和條件提供許可。但由於不存在單一動作符合兩個條件的情況，政策仍不提供任何許可。為解決這一問題，您必須建立兩個單獨的陳述式，每個陳述式只包含具有套用條件的動作。

若要修正此政策，請建立兩個陳述式。第一個陳述式包含支援 `s3:prefix` 條件的動作，第二個陳述式包含支援 `s3:VersionId` 條件的動作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketVersions",
                "s3:ListBucket"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:prefix": "custom"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObjectVersion",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:VersionId": "1234"
                }
            }
        }
    ]
}
```

------

## 故障排除政策管理
<a name="troubleshoot_policies-policy-manage"></a>

您可以診斷並解決與政策管理相關的問題。

### 在 IAM 帳戶中連接或分開政策
<a name="troubleshoot_roles_cant-attach-detach-policy"></a>

有些 AWS 受管政策會連結至 服務。這些政策僅用於該服務的某個[服務連結角色](id_roles.md#iam-term-service-linked-role)。在 IAM 主控台中，當您檢視**政策詳細資訊**頁面時，該頁面會包含一個橫幅，顯示該政策已與服務建立關聯。您不可將此政策連接到 IAM 中的使用者、群組或角色。當您為服務建立與服務相關的角色時，該政策會自動連接到您的新角色。由於政策是必要的您無法將政策與服務相關角色分開。

### 根據 IAM 身分的活動來變更其政策
<a name="troubleshoot_change-policies-based-on-activity"></a>

您可以為您的 IAM 身分 (使用者、群組和角色) 根據其活動更新政策。若要這麼做，請在 CloudTrail 中檢視您帳戶的事件**事件歷史記錄 (Event istory)**。CloudTrail 事件日誌包含可供您用來變更政策之許可的詳細事件資訊。

**使用者或角色正在嘗試在 中執行動作， AWS 而該請求遭拒。**  
考慮使用者或角色是否應該有執行該動作的許可。若是如此，您可以在其政策中新增動作，甚至其所嘗試存取資源的 ARN。

**使用者或角色具有他們未使用的許可。**  
考慮從其政策中移除這些許可。請確定您的政策僅授與執行必要動作所需的[最低權限](best-practices.md#grant-least-privilege)。

如需使用 CloudTrail 的詳細資訊，請參閱 *AWS CloudTrail 使用者指南*中的[在 CloudTrail 主控台中檢閱 CloudTrail 事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events-console.html)。

## JSON 政策文件故障排除
<a name="troubleshoot_policies-json"></a>

您可以診斷並解決與 JSON 政策文件相關的問題。

### 驗證您的政策
<a name="usepolicyvalidation"></a>

 當您建立或編輯 JSON 政策時，IAM 可以執行政策驗證以協助您建立有效的政策。IAM 會識別 JSON 語法錯誤，而 IAM Access Analyzer 會提供額外的政策檢查及建議，協助您進一步改良政策。若要進一步了解政策驗證的資訊，請參閱 [IAM 政策驗證](access_policies_policy-validator.md)。若要進一步了解 IAM Access Analyzer 政策檢查和可動作的建議，請參閱 [IAM Access Analyzer 政策驗證](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。

### 我在 JSON 編輯器中沒有政策驗證的許可
<a name="nopermsforpolicyvalidation"></a>

在 中 AWS 管理主控台，如果您沒有檢視 IAM Access Analyzer 政策驗證結果的許可，您可能會收到下列錯誤：

`You need permissions. You do not have the permissions required to perform this operation. Ask your administrator to add permissions.`

若要修正此錯誤，請要求管理員為您新增 `access-analyzer:ValidatePolicy` 許可。

### 多個 JSON 政策物件
<a name="morethanonepolicyblock"></a>

IAM 政策必須僅包含一個 JSON 物件。可在兩旁放置 \$1 \$1 括弧來表示物件。透過在外層括號對中嵌入額外的 \$1 \$1 括號，將其他物件嵌套到 JSON 物件中。政策只能包含一對最外層的 \$1 \$1 括號。以下範例不正確，因為它在最上層包含兩個物件 (以*紅色*標示)：

------
#### [ JSON ]

****  

```
{
      "Version":"2012-10-17",		 	 	 
      "Statement": 
      {
         "Effect":"Allow",
         "Action":"ec2:Describe*",
         "Resource":"*"
      }
    }
    { 
      "Statement": {
         "Effect": "Allow",
         "Action": "s3:*",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
      }
    }
```

------

不過，您可以使用正確的政策語法來達成上面範例的意圖。可以將兩個區塊合併到單個 `Statement` 元素中，而非包含兩個各自擁有 `Statement` 元素的完整政策物件。`Statement` 元素將有兩個物件的陣列做為其值，如以下範例所示 (以**粗體**標示)：

------
#### [ JSON ]

****  

```
{
      "Version":"2012-10-17",		 	 	 
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "ec2:Describe*",
          "Resource":"*"
        },
        {
          "Effect": "Allow",
          "Action": "s3:*",
          "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        }
      ]
    }
```

------

### 多個 JSON 陳述式元素
<a name="morethanonestatement"></a>

此錯誤乍看可能會像是前一章節中錯誤的變形。但是，它在語法上是不同類型的錯誤。在以下範例中，頂層只有一個政策物件，由單一 \$1 \$1 括弧對表示。但是，該物件包含兩個 `Statement` 元素。

 一個 IAM 政策只能包含一個 `Statement` 元素，包含在冒號左側的名稱 (`Statement`) 和跟隨其後在冒號右側的值。`Statement` 元素的值必須是物件，以 \$1 \$1 括弧表示，其中包含一個 `Effect` 元素、一個 `Action` 元素和一個 `Resource` 元素。以下範例不正確，因為它在政策物件中包含兩個 `Statement` 元素 (以*紅色*標示)：

------
#### [ JSON ]

****  

```
{
      "Version":"2012-10-17",		 	 	 
      "Statement": {
        "Effect": "Allow",
        "Action": "ec2:Describe*",
        "Resource": "*"
      },
      "Statement": {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
      }
    }
```

------

值物件可以是多個值物件組成的陣列。若要解決此問題，可使用物件陣列將兩個 `Statement` 元素合併為一個元素，如以下範例所示 (以**粗體**標示)：

------
#### [ JSON ]

****  

```
{
      "Version":"2012-10-17",		 	 	 
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "ec2:Describe*",
          "Resource":"*"
        },
        {
          "Effect": "Allow",
          "Action": "s3:*",
          "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        }
     ]
    }
```

------

`Statement` 元素的值是一種物件陣列。此示例中的陣列包含兩個物件，每個物件本身是 `Statement` 元素的正確值。陣列中的每個物件之間用逗號隔開。

### 在 JSON 陳述式元素中具有多個效果、動作或資源元素
<a name="duplicateelement"></a>

在 `Statement` 名稱/值對的值側，物件只能包含一個 `Effect` 元素、一個 `Action` 元素和一個 `Resource` 元素。以下政策不正確，因為在 `Effect` 中有兩個 `Statement` 元素：

------
#### [ JSON ]

****  

```
{
      "Version":"2012-10-17",		 	 	 
      "Statement": {
        "Effect": "Deny",
        "Effect": "Allow",     
        "Action": "ec2:* ",
        "Resource": "*"
      }
    }
```

------

**注意**  
政策引擎不允許新的或再編輯的政策中出現此類錯誤。但是，政策引擎會繼續允許在引擎更新之前儲存的政策。現有包含錯誤的政策之行為如下所示：  
多個 `Effect` 元素：僅遵循最後一個 `Effect` 元素。忽略其他元素。
多個 `Action` 元素：所有 `Action` 元素進行內部合併，被視為單一列表。
多個 `Resource` 元素：所有 `Resource` 元素進行內部合併，被視為單一列表。
政策引擎不允許您儲存任何有語法錯誤的政策。在儲存之前修正政策中的錯誤。檢閱並糾正政策的任何[政策驗證](access_policies_policy-validator.md)建議。

 在每種情況下，解決方案都是刪除不正確的多餘元素。針對 `Effect` 元素，這十分簡單：若您希望先前的範例*拒絕*針對 Amazon EC2 執行個體的許可，您必須從政策移除 `"Effect": "Allow",` 一行，如下所示：

------
#### [ JSON ]

****  

```
{
      "Version":"2012-10-17",		 	 	 
      "Statement": {
        "Effect": "Deny",
        "Action": "ec2:*",
        "Resource": "*"
      }
    }
```

------

但是，如果重複元素是 `Action` 或 `Resource`，則解決方法可能會更加複雜。您可能需要提供多個動作允許 (或拒絕) 許可，或者需要控制對多個資源的存取。例如，以下範例不正確，因為它有多個 `Resource` 元素 (以*紅色*標示)：

------
#### [ JSON ]

****  

```
{
      "Version":"2012-10-17",		 	 	 
      "Statement": {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
      }
    }
```

------

`Statement` 元素的值物件中的每個必要元素都只能出現一次。解決方案是將每個值置於陣列中。以下範例運用將兩個單獨資源元素合併為一個以陣列為值物件的 `Resource` 元素，來對此進行說明 (以**粗體**標示)：

------
#### [ JSON ]

****  

```
{	
      "Version":"2012-10-17",		 	 	 
      "Statement": {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
          "arn:aws:s3:::amzn-s3-demo-bucket",
          "arn:aws:s3:::amzn-s3-demo-bucket/*"
        ]
      }
    }
```

------

### 缺少 JSON 版本元素
<a name="missing-version"></a>

`Version` 政策元素與政策版本不同。`Version` 政策元素是在政策內使用，並定義政策語言的版本。相比之下，當您在 IAM 中變更客戶管理政策時會建立政策版本。變更的政策不會覆寫現有的政策。IAM 反而會建立新版本的受管政策。若要進一步了解 `Version` 政策元素，請參閱 [IAM JSON 政策元素：Version](reference_policies_elements_version.md)。若要進一步了解政策版本，請參閱 [版本控制 IAM 政策](access_policies_managed-versioning.md)。

隨著 AWS 功能演進，新的功能會新增至 IAM 政策以支援這些功能。有時，政策語法更新包括新版本編號。如果您在政策中使用政策語法的較新功能，則必須告知政策分析引擎所使用的版本。預設政策版本是「2008-10-17」。如果要使用之後推出的任何政策功能，則必須指定支援所需功能的版本編號。我們建議您*一律*包含最新的政策語法版本編號 (目前為 `"Version": "2012-10-17"`)。例如，以下政策不正確，因為它在資源 ARN 中使用政策變數 `${...}`。但是，它沒有指定支援政策變數的政策語法版本 (以*紅色*標示)：

```
{
  "Statement": 
  {
    "Action": "iam:*AccessKey*",
    "Effect": "Allow",
    "Resource": "arn:aws:iam::123456789012:user/${aws:username}"
  }
}
```

透過在政策頂層新增值 `2012-10-17` (支援政策變數的第一個 IAM API 版本) 的 `Version` 元素，可解決此問題 (以**粗體**標示)：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": 
  {
    "Action": "iam:*AccessKey*",
    "Effect": "Allow",
    "Resource": "arn:aws:iam::123456789012:user/${aws:username}"
  }
}
```

------