

 **協助改進此頁面** 

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

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

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

# 了解存取控制在 Amazon EKS 中的運作方式
<a name="cluster-auth"></a>

了解如何管理對 Amazon EKS 叢集的存取權限。使用 Amazon EKS 需要了解 Kubernetes 和 AWS Identity and Access Management (AWS IAM) 如何處理存取控制。

 **本節包括：**

 **[授予 IAM 使用者和角色對 Kubernetes APIs存取權](grant-k8s-access.md)**：了解如何讓應用程式或使用者對 Kubernetes API 進行身分驗證。您可使用存取項目、aws-auth ConfigMap 或外部 OIDC 提供商。

 ** [在 中檢視 Kubernetes 資源 AWS 管理主控台](view-kubernetes-resources.md) ** — 了解如何設定 AWS 管理主控台 以與您的 Amazon EKS 叢集通訊。使用主控台檢視叢集中的 Kubernetes 資源，如命名空間、節點和 Pod。

 ** [授予 AWS 服務對 Kubernetes APIs寫入存取權](mutate-kubernetes-resources.md) ** — 了解修改 Kubernetes 資源所需的許可。

 **[透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集](create-kubeconfig.md)**：了解如何設定 kubectl 以與您的 Amazon EKS 叢集進行通訊。使用 AWS CLI 建立 kubeconfig 檔案。

 ** [藉助 Kubernetes 服務帳戶向 AWS 授予 Kubernetes 工作負載存取權](service-accounts.md) ** — 了解如何將 Kubernetes 服務帳戶與 IAM AWS 角色建立關聯。您可以使用 Pod 身分識別或服務帳戶的 IAM 角色 (IRSA)。

## 一般任務
<a name="_common_tasks"></a>
+ 授予開發人員對 Kubernetes API 的存取權限。在 中檢視 Kubernetes 資源 AWS 管理主控台。
  + 解決方案：[使用存取項目](access-entries.md)將 Kubernetes RBAC 許可與 IAM AWS 使用者或角色建立關聯。
+ 設定 kubectl 以使用 AWS 登入資料與 Amazon EKS 叢集通訊。
  + 解決方案：使用 AWS CLI [建立 kubeconfig 檔案](create-kubeconfig.md)。
+ 使用外部身分識別提供商 (例如 Ping Identity) 來驗證使用者對 Kubernetes API 的存取。
  + 解決方案：[連結外部 OIDC 提供商](authenticate-oidc-identity-provider.md)。
+ 授予 Kubernetes 叢集上的工作負載呼叫 AWS APIs的能力。
  + 解決方案：[使用 Pod Identity](pod-identities.md) 將 AWS IAM 角色與 Kubernetes 服務帳戶建立關聯。

## 背景介紹
<a name="_background"></a>
+  [了解 Kubernetes 服務帳戶的工作原理。](https://kubernetes.io/docs/concepts/security/service-accounts/)
+  [檢閱 Kubernetes 角色型存取控制 (RBAC) 模型](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) 
+ 如需管理 AWS 資源存取權的詳細資訊，請參閱 [AWS IAM 使用者指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html)。或者，[使用 IAM 在 AWS 上進行免費入門訓練](https://explore.skillbuilder.aws/learn/course/external/view/elearning/120/introduction-to-aws-identity-and-access-management-iam)。

## EKS 自動模式的考量事項
<a name="_considerations_for_eks_auto_mode"></a>

EKS 自動模式與 EKS Pod 身分識別和 EKS 存取項目整合。
+ EKS 自動模式使用存取項目來授予 EKS 控制平面 Kubernetes 許可。例如，存取政策讓 EKS 自動模式能夠讀取有關網路端點和服務的資訊。
  + 您無法在 EKS 自動模式叢集上停用存取項目。
  + 您可選擇性啟用 `aws-auth` `ConfigMap`。
  + EKS 自動模式的存取項目將會自動設定。您可以檢視這些存取項目，但無法進行修改。
  + 如果您使用 NodeClass 建立自訂節點 IAM 角色，則需要使用 AmazonEKSAutoNodePolicy 存取政策為該角色建立存取項目。
+ 如果您想要授予 AWS 服務的工作負載許可，請使用 EKS Pod Identity。
  + 您無需在 EKS 自動模式叢集上安裝 Pod 身分識別代理程式。

# 授予 IAM 使用者和角色對 Kubernetes APIs存取權
<a name="grant-k8s-access"></a>

您的叢集具有 Kubernetes API 端點。Kubectl 會使用此 API。您可以使用兩種類型的身分來驗證此 API：
+  ** AWS Identity and Access Management (IAM) *主體* （角色或使用者）** – 此類型需要對 IAM 進行身分驗證。使用者可以 AWS 使用透過身分來源提供的憑證，以 [IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) [使用者身分或使用聯合](https://aws.amazon.com/identity/federation/)身分登入 。如果管理員先前已設定使用 IAM 角色的聯合身分，則使用者只能夠以聯合身分登入。當使用者使用聯合 AWS 存取 時，他們間接[擔任角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/when-to-use-iam.html#security-iam-authentication-iamrole)。當使用者使用此類身分時，您：
  + 可以為其指派 Kubernetes 許可，從而讓其能夠使用您叢集上的 Kubernetes 物件。如需如何向 IAM 主體指派許可以便相應主體能夠存取您叢集上的 Kubernetes 物件的詳細資訊，請參閱 [使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md)。
  + 可以指派 IAM 許可給他們，讓他們可以使用 Amazon EKS API、 AWS CLI AWS 管理主控台、 AWS CloudFormation 或 與您的 Amazon EKS 叢集及其資源搭配使用`eksctl`。如需詳細資訊，請參閱《服務授權參考》中的 [Amazon Elastic Kubernetes Service 定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-actions-as-permissions)一節。
  + 節點透過承擔 IAM 角色來加入叢集。[適用於 Kubernetes 的AWS IAM 驗證器](https://github.com/kubernetes-sigs/aws-iam-authenticator#readme)在 Amazon EKS 控制平面上執行，讓使用者能夠使用 IAM 主體存取您的叢集。
+  **您自己的 OpenID Connect (OIDC) 提供商中的使用者**：此類型需要向 [OIDC](https://openid.net/connect/) 提供商進行身分驗證。如需向 Amazon EKS 叢集設定您自己的 OIDC 提供商的詳細資訊，請參閱 [透過外部 OIDC 提供商授予使用者存取 Kubernetes 的權限](authenticate-oidc-identity-provider.md)。當使用者使用此類身分時，您：
  + 可以為其指派 Kubernetes 許可，從而讓其能夠使用您叢集上的 Kubernetes 物件。
  + 無法為他們指派 IAM 許可，讓他們可以使用 Amazon EKS API、 AWS CLI AWS 管理主控台、 AWS CloudFormation 或 來使用您的 Amazon EKS 叢集及其資源`eksctl`。

您可以在叢集中使用這兩種類型的身分。IAM 身分驗證方法無法停用。OIDC 身分驗證方法為選用。

## 建立 IAM 身分與 Kubernetes 許可的關聯
<a name="authentication-modes"></a>

[適用於 Kubernetes 的AWS IAM 驗證器](https://github.com/kubernetes-sigs/aws-iam-authenticator#readme)安裝在叢集的控制平面上。它啟用您允許存取叢集上的 Kubernetes 資源的 [AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) (IAM) 主體 (角色和使用者)。您可以使用以下方法之一允許 IAM 主體存取叢集上的 Kubernetes 物件：
+  **建立存取項目**：如果叢集版本等於或高於叢集 Kubernetes 版本[先決條件](access-entries.md)部分中列出的平台版本，則建議您使用此選項。

  使用*存取項目*，從叢集外部管理 IAM 主體的 Kubernetes 許可。您可以使用 EKS API、 AWS 命令列界面、 AWS SDKs、 AWS CloudFormation 和 來新增和管理對叢集的存取 AWS 管理主控台。這意味著您可以使用建立叢集時使用的工具來管理使用者。

  若要開始使用，請依照[變更身分驗證模式來使用存取項目](setting-up-access-entries.md)，然後[遷移現有的 aws-auth ConfigMap 項目來存取項目](migrating-access-entries.md)。
+  **新增項目到 `aws-auth` `ConfigMap`**：如果叢集的平台版本低於[先決條件](access-entries.md)部分中列出的版本，則必須使用此選項。如果叢集的平台版本等於或高於叢集 Kubernetes 版本[先決條件](access-entries.md)部分中列出的平台版本，並且您已將項目新增至 `ConfigMap`，則建議您將這些項目移轉到存取項目。但是，您無法移轉 Amazon EKS 新增至 `ConfigMap` 的項目，例如用於受管節點群組或 Fargate 設定檔的 IAM 角色項目。如需詳細資訊，請參閱[授予 IAM 使用者和角色對 Kubernetes APIs存取權](#grant-k8s-access)。
  + 如果必須使用 `aws-auth` `ConfigMap` 選項，則可以使用 `eksctl create iamidentitymapping` 命令將項目新增至 `ConfigMap`。如需詳細資訊，請參閱 `eksctl` 文件中的 [Manage IAM users and roles](https://eksctl.io/usage/iam-identity-mappings/) 一節。

## 設定叢集驗證模式
<a name="set-cam"></a>

每個叢集都有自己的*身分驗證模式*。身分驗證模式決定您可以使用哪些方法來允許 IAM 主體存取叢集上的 Kubernetes 物件。身分驗證模式有 3 種。

**重要**  
啟用存取項目方法後，即無法將其停用。  
如果在叢集建立期間未啟用 `ConfigMap` 方法，則稍後無法啟用。在引入存取項目之前建立的所有叢集均已啟用 `ConfigMap` 方法。  
如果您搭配叢集使用混合節點，則必須使用 `API` 或 `API_AND_CONFIG_MAP` 叢集身分驗證模式。

 **叢集內的 `aws-auth` `ConfigMap`**   
這是 Amazon EKS 叢集的原始身分驗證模式。建立叢集的 IAM 主體是可以使用 `kubectl` 存取叢集的初始使用者。初始使用者必須將其他使用者新增至 `aws-auth` `ConfigMap` 的清單中，並為這些使用者指派相應許可。其他使用者無法管理或移除初始使用者，因為 `ConfigMap` 中沒有要管理的項目。

 **`ConfigMap` 和存取項目**   
使用這種身分驗證模式時，您可以使用這兩種方法將 IAM 主體新增至叢集。請注意，每個方法都會存放個別的項目；例如，如果您從 AWS CLI 新增存取項目，`aws-auth``ConfigMap`則不會更新 。

 **僅存取項目**   
透過此身分驗證模式，您可以使用 EKS API、 AWS 命令列界面、 AWS SDKs、 AWS CloudFormation 和 AWS 管理主控台 來管理 IAM 主體對叢集的存取。  
每個存取項目都有一個*類型*，您可以使用*存取範圍*的組合將主體限制為特定命名空間，並使用*存取政策*來設定預先設定的可重複使用許可政策。您也可以使用 STANDARD 類型和 Kubernetes RBAC 群組來指派自訂許可。


| 身分驗證方式 | 方法 | 
| --- | --- | 
|   僅 `ConfigMap` (`CONFIG_MAP`)  |   `aws-auth` `ConfigMap`   | 
|  EKS API 和 `ConfigMap` (`API_AND_CONFIG_MAP`)  |  EKS API、 AWS 命令列界面、 AWS SDKs、 AWS CloudFormation 和 AWS 管理主控台 中的存取項目 `aws-auth` `ConfigMap`   | 
|  僅 EKS API (`API`)  |  EKS API、 AWS 命令列界面、 AWS SDKs、 AWS CloudFormation 和 中的存取項目 AWS 管理主控台   | 

**注意**  
Amazon EKS 自動模式需要存取項目。

# 使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權
<a name="access-entries"></a>

本節旨在說明如何使用存取項目與政策，管理 Amazon Elastic Kubernetes Service (EKS) 中 IAM 主體對 Kubernetes 叢集的存取權。您將找到有關變更驗證模式、從舊版 `aws-auth` ConfigMap 項目移轉、建立、更新、刪除存取項目、將政策與項目關聯、檢閱預先定義政策許可，以及安全存取管理之重要先決條件與考量事項的詳細資訊。

## 概觀
<a name="_overview"></a>

EKS 存取項目是授予使用者存取 Kubernetes API 的最佳方式。例如，您可使用存取項目授予開發人員使用 kubectl 的權限。本質上，EKS 存取項目會將一組 Kubernetes 許可與 IAM 身分 (如 IAM 角色) 建立關聯。例如，開發人員可擔任某個 IAM 角色，並使用該角色向 EKS 叢集進行身分驗證。

## 功能
<a name="_features"></a>
+  **集中式身分驗證與授權**：直接透過 Amazon EKS API 控制對 Kubernetes 叢集的存取，無需在 AWS 和 Kubernetes API 之間切換，以管理使用者許可。
+  **精細許可管理**：使用存取項目與政策為 AWS IAM 主體定義精細許可，包括修改或撤銷建立者的叢集管理員存取權。
+  **IaC 工具整合**：支援 AWS CloudFormation、Terraform 與 AWS CDK 等基礎結構即程式碼工具，以便在叢集建立期間定義存取組態。
+  **錯誤設定復原**：可透過 Amazon EKS API 復原叢集存取權，無需直接存取 Kubernetes API。
+  **降低負擔並增強安全性**：集中化作業以降低管理負擔，同時運用 AWS IAM 功能 (如 CloudTrail 稽核日誌與多因素驗證)。

## 附加許可的方式
<a name="_how_to_attach_permissions"></a>

您可透過兩種方式將 Kubernetes 許可附加至存取項目：
+ 使用存取政策。存取政策是由 AWS 維護的預先定義 Kubernetes 許可範本。如需詳細資訊，請參閱 [檢閱存取政策許可](access-policy-permissions.md)。
+ 引用 Kubernetes 群組。若您將 IAM 身分與 Kubernetes 群組建立關聯，即可建立授予該群組許可的 Kubernetes 資源。如需詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。

## 考量事項
<a name="_considerations"></a>

在現有叢集上啟用 EKS 存取項目時，請留意下列事項：
+  **舊版叢集行為**：對於在存取項目引入前建立的叢集 (其初始平台版本早於[平台版本需求](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html)中指定的版本)，EKS 會自動建立反映既有許可的存取項目。此項目包含了最初建立叢集的 IAM 身分，以及在叢集建立期間授予該身分的管理許可。
+  **處理舊版 `aws-auth` ConfigMap**：若您的叢集依賴舊版 `aws-auth` ConfigMap 進行存取管理，則在啟用存取項目時，僅會自動建立原叢集建立者的存取項目。新增至 ConfigMap 的其他角色或許可 (如供開發人員或服務使用的自訂 IAM 角色) 不會自動移轉。為了解決這個問題，請手動建立對應的存取項目。

## 開始使用
<a name="_get_started"></a>

1. 確定您要使用的 IAM 身分和存取政策。
   +  [檢閱存取政策許可](access-policy-permissions.md) 

1. 在您的叢集上啟用 EKS 存取項目。確認您擁有受支援的平台版本。
   +  [變更驗證模式以使用存取項目](setting-up-access-entries.md) 

1. 建立存取項目，將 IAM 身分與 Kubernetes 許可建立關聯。
   +  [建立存取項目](creating-access-entries.md) 

1. 使用該 IAM 身分向叢集進行驗證。
   +  [設定 AWS CLI](install-awscli.md) 
   +  [設定 `kubectl` 和 `eksctl`](install-kubectl.md) 

# 將存取政策與存取項目相關聯
<a name="access-policies"></a>

您可以向*類型*為 `STANDARD` 的*存取項目*指派一個或多個存取政策。Amazon EKS 會自動向其他類型的存取項目授予在叢集中正常運作所需的許可。Amazon EKS 存取政策包含 Kubernetes 許可，而不是 IAM 許可。在將存取政策與存取項目關聯之前，請確認您熟悉每個存取政策中包含的 Kubernetes 許可。如需詳細資訊，請參閱 [檢閱存取政策許可](access-policy-permissions.md)。如果沒有一個存取政策符合您的要求，則不要將存取政策與存取項目關聯。而是為存取項目指定一個或多個*群組名稱*，並建立和管理 Kubernetes 角色型存取控制物件。如需詳細資訊，請參閱 [建立存取項目](creating-access-entries.md)。
+ 現有的存取項目。若要建立服務角色，請參閱[建立存取項目](creating-access-entries.md)。
+ 具有下列許可的 AWS Identity and Access Management 角色或使用者：`ListAccessEntries`、`DescribeAccessEntry`、`UpdateAccessEntry`、`ListAccessPolicies`、`AssociateAccessPolicy` 和 `DisassociateAccessPolicy`。如需詳細資訊，請參閱《*服務授權參考*》中的 [Amazon Elastic Kubernetes Service](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-actions-as-permissions) 定義的動作一節。

在將存取政策與存取項目關聯之前，請考量以下要求：
+ 每個存取項目可以關聯多個存取政策，但只能將每個政策與一個存取項目關聯一次。如果您將一個存取項目與多個存取政策關聯，則該存取項目的 IAM 主體擁有所有關聯的存取政策中包含的所有許可。
+ 您可以將存取政策的適用範圍限定為叢集上的所有資源，或透過指定一個或多個 Kubernetes 命名空間的名稱來限制其適用範圍。您可以將萬用字元用於命名空間名稱。例如，如果要將存取政策的適用範圍限定為以 `dev-` 開頭的所有命名空間，則可以指定 `dev-*` 作為命名空間名稱。確認叢集上存在相應命名空間，並且拼字與叢集上的實際命名空間名稱相符。Amazon EKS 不會確認叢集上命名空間的拼字或命名空間是否存在。
+ 將存取政策關聯到存取項目後，您可以變更存取政策的*存取範圍*。如果您已將存取政策的適用範圍限定為 Kubernetes 命名空間，則可以根據需要新增和移除關聯的命名空間。
+ 如果您將存取政策關聯到也指定了*群組名稱*的存取項目，則相應 IAM 主體擁有所有關聯存取政策中的所有許可。它還擁有在指定群組名稱的任何 `Role` 和 `RoleBinding` 物件中指定的任何 `Role` 或 `ClusterRole` 物件中的所有許可。
+ 如果您執行 `kubectl auth can-i --list` 命令，您不會看到與您在執行該命令時所使用的 IAM 主體的存取項目關聯的存取政策指派的任何 Kubernetes 許可。只有當您已在繫結至為存取項目指定的群組名稱或使用者名稱的 Kubernetes `Role` 或 `ClusterRole` 物件中授予 Kubernetes 許可時，此命令才會顯示相應許可。
+ 如果您在與叢集上的 Kubernetes 物件互動時模擬 Kubernetes 使用者或群組，例如將 `kubectl` 命令與 `--as username ` 或 `--as-group group-name ` 結合使用，則將強制使用 RBAC 授權。因此，相應 IAM 主體沒有與相應存取項目關聯的任何存取政策指派的許可。相應 IAM 主體模擬的使用者或群組擁有的 Kubernetes 許可，僅限於您在繫結到該群組名稱或使用者名稱的 Kubernetes `Role` 或 `ClusterRole` 物件中授予的 Kubernetes 許可。為了讓相應 IAM 主體擁有關聯的存取政策中的許可，請勿模擬 Kubernetes 使用者或群組。相應 IAM 主體還將擁有您在繫結至為存取項目指定的群組名稱或使用者名稱的 Kubernetes `Role` 或 `ClusterRole` 物件中授予的任何許可。如需詳細資訊，請參閱 Kubernetes 文件中的[使用者模擬](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation)一節。

您可以使用 AWS 管理主控台 或 AWS CLI 將存取政策與存取項目關聯。

## AWS 管理主控台
<a name="access-associate-console"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇要將存取政策關聯到的存取項目所在的叢集的名稱。

1. 選擇**存取**索引標籤。

1. 如果存取項目的類型為**標準**，則可以將 Amazon EKS**存取政策**與之關聯或取消關聯。如果存取項目的類型不為**標準**，則此選項不可用。

1. 選擇**關聯存取政策**。

1. 對於**政策名稱**，選取具有您希望相應 IAM 主體擁有的許可的政策。若要查看每個政策包含的許可，請參閱 [檢閱存取政策許可](access-policy-permissions.md)。

1. 對於**存取範圍**，選擇存取範圍。如果您選擇**叢集**，則該存取政策中的許可將授予相應 IAM 主體對所有 Kubernetes 命名空間中的資源的存取權。如果您選擇 **Kubernetes 命名空間**，則可以選擇**新增命名空間**。在顯示的**命名空間**欄位中，您可以輸入叢集上的 Kubernetes 命名空間的名稱。如果您希望相應 IAM 主體擁有跨多個命名空間的許可，則可以輸入多個命名空間。

1. 選擇**新增存取政策**。

## AWS CLI
<a name="access-associate-cli"></a>

1. 已在裝置或 AWS CloudShell 上安裝和設定 AWS 命令列介面 (AWS CLI) 版本 `2.12.3` 或更新版本，或是版本 `1.27.160` 或更新版本。若要檢查您目前的版本，請使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。如 `yum`、`apt-get` 或適用於 macOS 的 Homebrew 等套件管理工具通常比最新版本的 AWS CLI 落後數個版本之多。若要安裝最新版本，請參閱《*AWS 命令列介面使用者指南*》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)與[使用 aws configure 的快速組態](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安裝的 AWS CLI 版本也可能比最新版本落後數個版本。若要更新，請參閱《*AWS CloudShell 使用者指南*》中的[安裝 AWS CLI 至您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。

1. 檢視可用的存取政策。

   ```
   aws eks list-access-policies --output table
   ```

   範例輸出如下。

   ```
   ---------------------------------------------------------------------------------------------------------
   |                                          ListAccessPolicies                                           |
   +-------------------------------------------------------------------------------------------------------+
   ||                                           accessPolicies                                            ||
   |+---------------------------------------------------------------------+-------------------------------+|
   ||                                 arn                                 |             name              ||
   |+---------------------------------------------------------------------+-------------------------------+|
   ||  {arn-aws}eks::aws:cluster-access-policy/AmazonEKSAdminPolicy        |  AmazonEKSAdminPolicy         ||
   ||  {arn-aws}eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy |  AmazonEKSClusterAdminPolicy  ||
   ||  {arn-aws}eks::aws:cluster-access-policy/AmazonEKSEditPolicy         |  AmazonEKSEditPolicy          ||
   ||  {arn-aws}eks::aws:cluster-access-policy/AmazonEKSViewPolicy         |  AmazonEKSViewPolicy          ||
   |+---------------------------------------------------------------------+-------------------------------+|
   ```

   若要查看每個政策包含的許可，請參閱 [檢閱存取政策許可](access-policy-permissions.md)。

1. 檢視現有的存取項目。使用您叢集的名稱取代 *my-cluster*。

   ```
   aws eks list-access-entries --cluster-name my-cluster
   ```

   範例輸出如下。

   ```
   {
       "accessEntries": [
           "arn:aws:iam::111122223333:role/my-role",
           "arn:aws:iam::111122223333:user/my-user"
       ]
   }
   ```

1. 將存取政策與存取項目關聯。以下範例將 `AmazonEKSViewPolicy` 存取政策與一個存取項目關聯。每當 *my-role* IAM 角色嘗試存取叢集上的 Kubernetes 物件時，Amazon EKS 將授權該角色使用政策中的許可來存取且僅存取 *my-namespace1* 和 *my-namespace2* Kubernetes 命名空間中的 Kubernetes 物件。用您的叢集名稱取代 *my-cluster*，用您的 AWS 帳戶 ID 取代 *111122223333*，並用您想要讓 Amazon EKS 為其授予對 Kubernetes 叢集上物件之存取權的 IAM 角色取代 *my-role*。

   ```
   aws eks associate-access-policy --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role \
       --access-scope type=namespace,namespaces=my-namespace1,my-namespace2 --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicy
   ```

   如果您希望相應 IAM 主體擁有適用於整個叢集的許可，請用 `type=cluster` 取代 `type=namespace,namespaces=my-namespace1,my-namespace2 `。如果要將多個存取政策關聯到該存取項目，請多次執行該命令，並每次使用不同的存取政策。每個關聯的存取政策都有自身的適用範圍。
**注意**  
如果您稍後想要變更關聯的存取政策的適用範圍，請再次執行先前的命令並指定新的適用範圍。例如，如果您想要移除 *my-namespace2*，則只需使用 `type=namespace,namespaces=my-namespace1 ` 再次執行命令。如果您想將適用範圍從 `namespace` 變更為 `cluster`，您需要使用 `type=cluster` 再次執行該命令，而不使用 `type=namespace,namespaces=my-namespace1,my-namespace2 `。

1. 確定哪些存取政策與某個存取項目關聯。

   ```
   aws eks list-associated-access-policies --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role
   ```

   範例輸出如下。

   ```
   {
       "clusterName": "my-cluster",
       "principalArn": "arn:aws:iam::111122223333",
       "associatedAccessPolicies": [
           {
               "policyArn": "arn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicy",
               "accessScope": {
                   "type": "cluster",
                   "namespaces": []
               },
               "associatedAt": "2023-04-17T15:25:21.675000-04:00",
               "modifiedAt": "2023-04-17T15:25:21.675000-04:00"
           },
           {
               "policyArn": "arn:aws:eks::aws:cluster-access-policy/AmazonEKSAdminPolicy",
               "accessScope": {
                   "type": "namespace",
                   "namespaces": [
                       "my-namespace1",
                       "my-namespace2"
                   ]
               },
               "associatedAt": "2023-04-17T15:02:06.511000-04:00",
               "modifiedAt": "2023-04-17T15:02:06.511000-04:00"
           }
       ]
   }
   ```

   在前面的範例中，相應存取項目的 IAM 主體擁有相應叢集上所有命名空間的檢視許可，以及兩個 Kubernetes 命名空間的管理員許可。

1. 將存取政策與存取項目取消關聯。在此範例中，`AmazonEKSAdminPolicy` 政策與存取項目取消關聯。但是，相應 IAM 主體保留 `AmazonEKSViewPolicy` 存取政策中對 *my-namespace1* 和 *my-namespace2* 命名空間中物件的許可，因為該存取政策並未與該存取項目取消關聯。

   ```
   aws eks disassociate-access-policy --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role \
       --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSAdminPolicy
   ```

要列出所有可用的存取政策，請參閱 [檢閱存取政策許可](access-policy-permissions.md)。

# 遷移現有 `aws-auth ConfigMap` 項目至存取項目
<a name="migrating-access-entries"></a>

如果您已將項目新增至叢集上的 `aws-auth` `ConfigMap`，則建議您為 `aws-auth` `ConfigMap` 中的現有項目建立存取項目。建立存取項目後，您可以從 `ConfigMap` 中移除對應項目。您無法將[存取政策](access-policies.md)與 `aws-auth` `ConfigMap` 中的項目建立關聯。如果您想要將存取政策與 IAM 主體相關聯，則請建立存取項目。

**重要**  
當叢集處於 `API_AND_CONFIGMAP` 身分驗證模式，且在 `aws-auth` `ConfigMap` 和存取項目中具有相同 IAM 角色的映射時，該角色將會使用存取項目的映射進行身分驗證。存取項目的優先順序高於相同 IAM 主體的 `ConfigMap` 項目。
在將 Amazon EKS 為[受管節點群組](managed-node-groups.md)或 [Fargate 設定檔](fargate-profile.md)建立的現有 `aws-auth` `ConfigMap` 項目移除至您的叢集之前，請仔細檢查 Amazon EKS 叢集中是否存在這些特定資源的正確存取項目。如果您在沒有相同存取項目的情況下移除 Amazon EKS 在 `ConfigMap` 中建立的項目，叢集將無法正常運作。

## 先決條件
<a name="migrating_access_entries_prereq"></a>
+ 熟悉存取項目和存取政策。如需詳細資訊，請參閱[使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md)及[將存取政策與存取項目相關聯](access-policies.md)。
+ 現有叢集的平台版本等於或高於 [使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md) 物件主題之「先決條件」部分中列出的版本。
+ 裝置或 AWS CloudShell 上安裝的`eksctl`命令列工具版本 `0.215.0`或更新版本。如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的[安裝](https://eksctl.io/installation)一節。
+ 修改 `kube-system` 命名空間中的 `aws-auth` `ConfigMap` 的 Kubernetes 許可。
+ Identity AWS and Access Management 角色或具有下列許可的使用者： `CreateAccessEntry`和 `ListAccessEntries`。如需詳細資訊，請參閱《服務授權參考》中的 [Amazon Elastic Kubernetes Service 定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-actions-as-permissions)一節。

## `eksctl`
<a name="migrating_access_entries_eksctl"></a>

1. 檢視 `aws-auth ConfigMap` 中的現有項目。使用您叢集的名稱取代 *my-cluster*。

   ```
   eksctl get iamidentitymapping --cluster my-cluster
   ```

   範例輸出如下。

   ```
   ARN                                                                                             USERNAME                                GROUPS                                                  ACCOUNT
   arn:aws: iam::111122223333:role/EKS-my-cluster-Admins                                            Admins                                  system:masters
   arn:aws: iam::111122223333:role/EKS-my-cluster-my-namespace-Viewers                              my-namespace-Viewers                    Viewers
   arn:aws: iam::111122223333:role/EKS-my-cluster-self-managed-ng-1                                 system:node:{{EC2PrivateDNSName}}       system:bootstrappers,system:nodes
   arn:aws: iam::111122223333:user/my-user                                                          my-user
   arn:aws: iam::111122223333:role/EKS-my-cluster-fargateprofile1                                   system:node:{{SessionName}}             system:bootstrappers,system:nodes,system:node-proxier
   arn:aws: iam::111122223333:role/EKS-my-cluster-managed-ng                                        system:node:{{EC2PrivateDNSName}}       system:bootstrappers,system:nodes
   ```

1.  為在上一個輸出中傳回的您建立的任何 `ConfigMap` 項目的 [建立存取項目](creating-access-entries.md)。建立存取項目時，請確保為 `ARN`、`USERNAME`、`GROUPS` 和 `ACCOUNT` 指定與輸出中傳回的值相同的值。在範例輸出中，您將為最後兩個項目之外的所有項目建立存取項目，因為這些項目是由 Amazon EKS 為 Fargate 描述檔和受管節點群組建立的。

1. 從 `ConfigMap` 中刪除您建立的任何存取項目對應的項目。如果您沒有從 `ConfigMap` 中刪除對應項目，則對應 IAM 主體 ARN 的存取項目的設定將覆寫 `ConfigMap` 項目。將 *111122223333* 取代為 AWS 您的帳戶 ID，並將 *EKS-my-cluster-my-namespace-Viewers* 取代為 中項目中角色的名稱`ConfigMap`。如果您要移除的項目用於 IAM 使用者而不是 IAM 角色，請用 `user` 取代 `role`，並用使用者名稱取代 *EKS-my-cluster-my-namespace-Viewers*。

   ```
   eksctl delete iamidentitymapping --arn arn:aws: iam::111122223333:role/EKS-my-cluster-my-namespace-Viewers --cluster my-cluster
   ```

# 檢閱存取政策許可
<a name="access-policy-permissions"></a>

存取政策包含 `rules`，其中包含 Kubernetes `verbs` (許可) 和 `resources`。存取政策不包含 IAM 許可或資源。與 Kubernetes `Role` 和 `ClusterRole` 物件類似，存取政策僅包含 `allow` `rules`。您無法修改存取政策的內容。您無法建立自己的存取政策。如果存取政策中的許可無法滿足您的需求，您可以建立 Kubernetes RBAC 物件並為存取項目指定*群組名稱*。如需詳細資訊，請參閱[建立存取項目](creating-access-entries.md)。存取政策中包含的許可類似於 Kubernetes 面向使用者之叢集角色中的許可。如需詳細資訊，請參閱 Kubernetes 文件中的 [User-facing roles](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles) 一節。

## 列出所有政策
<a name="access-policies-cli-command"></a>

使用此頁面列出的任一存取政策，或使用 CLI AWS 擷取所有可用存取政策的清單：

```
aws eks list-access-policies
```

預期輸出應如下所示 (為簡潔起見已省略部分內容)：

```
{
    "accessPolicies": [
        {
            "name": "AmazonAIOpsAssistantPolicy",
            "arn": "arn:aws:eks::aws:cluster-access-policy/AmazonAIOpsAssistantPolicy"
        },
        {
            "name": "AmazonARCRegionSwitchScalingPolicy",
            "arn": "arn:aws:eks::aws:cluster-access-policy/AmazonARCRegionSwitchScalingPolicy"
        },
        {
            "name": "AmazonEKSAdminPolicy",
            "arn": "arn:aws:eks::aws:cluster-access-policy/AmazonEKSAdminPolicy"
        },
        {
            "name": "AmazonEKSAdminViewPolicy",
            "arn": "arn:aws:eks::aws:cluster-access-policy/AmazonEKSAdminViewPolicy"
        },
        {
            "name": "AmazonEKSAutoNodePolicy",
            "arn": "arn:aws:eks::aws:cluster-access-policy/AmazonEKSAutoNodePolicy"
        }
        // Additional policies omitted
    ]
}
```

## AmazonEKSAdminPolicy
<a name="access-policy-permissions-amazoneksadminpolicy"></a>

此存取政策包含向相應 IAM 主體授予對資源的大部分許可的許可。當將之與某個存取項目關聯時，其存取範圍通常是一個或多個 Kubernetes 命名空間。如果您希望相應 IAM 主體對叢集上的所有資源具有管理員存取權，請將 [AmazonEKSClusterAdminPolicy](#access-policy-permissions-amazoneksclusteradminpolicy) 存取政策與相應存取項目關聯。

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSAdminPolicy` 


| Kubernetes API 群組 | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | 
|   `apps`   |   `daemonsets`, `deployments`, `deployments/rollback`, `deployments/scale`, `replicasets`, `replicasets/scale`, `statefulsets`, `statefulsets/scale`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `apps`   |   `controllerrevisions`, `daemonsets`, `daemonsets/status`, `deployments`, `deployments/scale`, `deployments/status`, `replicasets`, `replicasets/scale`, `replicasets/status`, `statefulsets`, `statefulsets/scale`, `statefulsets/status`   |   `get`, `list`, `watch`   | 
|   `authorization.k8s.io`   |   `localsubjectaccessreviews`   |   `create`   | 
|   `autoscaling`   |   `horizontalpodautoscalers`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `autoscaling`   |   `horizontalpodautoscalers`, `horizontalpodautoscalers/status`   |   `get`, `list`, `watch`   | 
|   `batch`   |   `cronjobs`, `jobs`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `batch`   |   `cronjobs`, `cronjobs/status`, `jobs`, `jobs/status`   |   `get`, `list`, `watch`   | 
|   `discovery.k8s.io`   |   `endpointslices`   |   `get`, `list`, `watch`   | 
|   `extensions`   |   `daemonsets`, `deployments`, `deployments/rollback`, `deployments/scale`, `ingresses`, `networkpolicies`, `replicasets`, `replicasets/scale`, `replicationcontrollers/scale`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `extensions`   |   `daemonsets`, `daemonsets/status`, `deployments`, `deployments/scale`, `deployments/status`, `ingresses`, `ingresses/status`, `networkpolicies`, `replicasets`, `replicasets/scale`, `replicasets/status`, `replicationcontrollers/scale`   |   `get`, `list`, `watch`   | 
|   `networking.k8s.io`   |   `ingresses`, `ingresses/status`, `networkpolicies`   |   `get`, `list`, `watch`   | 
|   `networking.k8s.io`   |   `ingresses`, `networkpolicies`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `policy`   |   `poddisruptionbudgets`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `policy`   |   `poddisruptionbudgets`, `poddisruptionbudgets/status`   |   `get`, `list`, `watch`   | 
|   `rbac.authorization.k8s.io`   |   `rolebindings`, `roles`   |   `create`, `delete`, `deletecollection`, `get`, `list`, `patch`, `update`, `watch`   | 
|  |   `configmaps`, `endpoints`, `persistentvolumeclaims`, `persistentvolumeclaims/status`, `pods`, `replicationcontrollers`, `replicationcontrollers/scale`, `serviceaccounts`, `services`, `services/status`   |   `get`,`list`, `watch`   | 
|  |   `pods/attach`, `pods/exec`, `pods/portforward`, `pods/proxy`, `secrets`, `services/proxy`   |   `get`, `list`, `watch`   | 
|  |   `configmaps`, `events`, `persistentvolumeclaims`, `replicationcontrollers`, `replicationcontrollers/scale`, `secrets`, `serviceaccounts`, `services`, `services/proxy`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|  |   `pods`, `pods/attach`, `pods/exec`, `pods/portforward`, `pods/proxy`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|  |   `serviceaccounts`   |   `impersonate`   | 
|  |   `bindings`, `events`, `limitranges`, `namespaces/status`, `pods/log`, `pods/status`, `replicationcontrollers/status`, `resourcequotas`, `resourcequotas/status`   |   `get`, `list`, `watch`   | 
|  |   `namespaces`   |   `get`,`list`, `watch`   | 

## AmazonEKSClusterAdminPolicy
<a name="access-policy-permissions-amazoneksclusteradminpolicy"></a>

此存取政策包含授予相應 IAM 主體對叢集的管理員存取權的許可。當將之與某個存取項目關聯時，其存取範圍通常是叢集，而不是某個 Kubernetes 命名空間。如果您希望限制相應 IAM 主體的管理範圍，請考慮將 [AmazonEKSAdminPolicy](#access-policy-permissions-amazoneksadminpolicy) 存取政策與相應存取項目關聯。

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy` 


| Kubernetes API 群組 | Kubernetes nonResourceURLs | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | --- | 
|   `*`   |  |   `*`   |   `*`   | 
|  |   `*`   |  |   `*`   | 

## AmazonEKSAdminViewPolicy
<a name="access-policy-permissions-amazoneksadminviewpolicy"></a>

此存取政策包含授予相應 IAM 主體在叢集中列出/檢視所有資源的許可。請注意，這包含 [Kubernetes 秘密。](https://kubernetes.io/docs/concepts/configuration/secret/)

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSAdminViewPolicy` 


| Kubernetes API 群組 | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | 
|   `*`   |   `*`   |   `get`, `list`, `watch`   | 

## AmazonEKSEditPolicy
<a name="access-policy-permissions-amazonekseditpolicy"></a>

此存取政策包含允許相應 IAM 主體編輯大多數 Kubernetes 資源的許可。

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSEditPolicy` 


| Kubernetes API 群組 | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | 
|   `apps`   |   `daemonsets`, `deployments`, `deployments/rollback`, `deployments/scale`, `replicasets`, `replicasets/scale`, `statefulsets`, `statefulsets/scale`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `apps`   |   `controllerrevisions`, `daemonsets`, `daemonsets/status`, `deployments`, `deployments/scale`, `deployments/status`, `replicasets`, `replicasets/scale`, `replicasets/status`, `statefulsets`, `statefulsets/scale`, `statefulsets/status`   |   `get`, `list`, `watch`   | 
|   `autoscaling`   |   `horizontalpodautoscalers`, `horizontalpodautoscalers/status`   |   `get`, `list`, `watch`   | 
|   `autoscaling`   |   `horizontalpodautoscalers`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `batch`   |   `cronjobs`, `jobs`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `batch`   |   `cronjobs`, `cronjobs/status`, `jobs`, `jobs/status`   |   `get`, `list`, `watch`   | 
|   `discovery.k8s.io`   |   `endpointslices`   |   `get`, `list`, `watch`   | 
|   `extensions`   |   `daemonsets`, `deployments`, `deployments/rollback`, `deployments/scale`, `ingresses`, `networkpolicies`, `replicasets`, `replicasets/scale`, `replicationcontrollers/scale`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `extensions`   |   `daemonsets`, `daemonsets/status`, `deployments`, `deployments/scale`, `deployments/status`, `ingresses`, `ingresses/status`, `networkpolicies`, `replicasets`, `replicasets/scale`, `replicasets/status`, `replicationcontrollers/scale`   |   `get`, `list`, `watch`   | 
|   `networking.k8s.io`   |   `ingresses`, `networkpolicies`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `networking.k8s.io`   |   `ingresses`, `ingresses/status`, `networkpolicies`   |   `get`, `list`, `watch`   | 
|   `policy`   |   `poddisruptionbudgets`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|   `policy`   |   `poddisruptionbudgets`, `poddisruptionbudgets/status`   |   `get`, `list`, `watch`   | 
|  |   `namespaces`   |   `get`, `list`, `watch`   | 
|  |   `pods/attach`, `pods/exec`, `pods/portforward`, `pods/proxy`, `secrets`, `services/proxy`   |   `get`, `list`, `watch`   | 
|  |   `serviceaccounts`   |   `impersonate`   | 
|  |   `pods`, `pods/attach`, `pods/exec`, `pods/portforward`, `pods/proxy`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|  |   `configmaps`, `events`, `persistentvolumeclaims`, `replicationcontrollers`, `replicationcontrollers/scale`, `secrets`, `serviceaccounts`, `services`, `services/proxy`   |   `create`, `delete`, `deletecollection`, `patch`, `update`   | 
|  |   `configmaps`, `endpoints`, `persistentvolumeclaims`, `persistentvolumeclaims/status`, `pods`, `replicationcontrollers`, `replicationcontrollers/scale`, `serviceaccounts`, `services`, `services/status`   |   `get`, `list`, `watch`   | 
|  |   `bindings`, `events`, `limitranges`, `namespaces/status`, `pods/log`, `pods/status`, `replicationcontrollers/status`, `resourcequotas`, `resourcequotas/status`   |   `get`, `list`, `watch`   | 

## AmazonEKSViewPolicy
<a name="access-policy-permissions-amazoneksviewpolicy"></a>

此存取政策包含允許相應 IAM 主體檢視大多數 Kubernetes 資源的許可。

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSViewPolicy` 


| Kubernetes API 群組 | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | 
|   `apps`   |   `controllerrevisions`, `daemonsets`, `daemonsets/status`, `deployments`, `deployments/scale`, `deployments/status`, `replicasets`, `replicasets/scale`, `replicasets/status`, `statefulsets`, `statefulsets/scale`, `statefulsets/status`   |   `get`, `list`, `watch`   | 
|   `autoscaling`   |   `horizontalpodautoscalers`, `horizontalpodautoscalers/status`   |   `get`, `list`, `watch`   | 
|   `batch`   |   `cronjobs`, `cronjobs/status`, `jobs`, `jobs/status`   |   `get`, `list`, `watch`   | 
|   `discovery.k8s.io`   |   `endpointslices`   |   `get`, `list`, `watch`   | 
|   `extensions`   |   `daemonsets`, `daemonsets/status`, `deployments`, `deployments/scale`, `deployments/status`, `ingresses`, `ingresses/status`, `networkpolicies`, `replicasets`, `replicasets/scale`, `replicasets/status`, `replicationcontrollers/scale`   |   `get`, `list`, `watch`   | 
|   `networking.k8s.io`   |   `ingresses`, `ingresses/status`, `networkpolicies`   |   `get`, `list`, `watch`   | 
|   `policy`   |   `poddisruptionbudgets`, `poddisruptionbudgets/status`   |   `get`, `list`, `watch`   | 
|  |   `configmaps`, `endpoints`, `persistentvolumeclaims`, `persistentvolumeclaims/status`, `pods`, `replicationcontrollers`, `replicationcontrollers/scale`, `serviceaccounts`, `services`, `services/status`   |   `get`, `list`, `watch`   | 
|  |   `bindings`、`events`、`limitranges`、`namespaces/status`、`pods/log`、`pods/status`、`replicationcontrollers/status`、`resourcequotas`、r`esourcequotas/status`   |   `get`, `list`, `watch`   | 
|  |   `namespaces`   |   `get`, `list`, `watch`   | 

## AmazonEKSSecretReaderPolicy
<a name="_amazonekssecretreaderpolicy"></a>

此存取政策包含允許 IAM 主體讀取 [Kubernetes 秘密的許可。](https://kubernetes.io/docs/concepts/configuration/secret/)

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSSecretReaderPolicy` 


| Kubernetes API 群組 | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | 
|  |   `secrets`   |   `get`, `list`, `watch`   | 

## AmazonEKSAutoNodePolicy
<a name="_amazoneksautonodepolicy"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSAutoNodePolicy` 

此政策包含下列許可，這些許可能讓 Amazon EKS 元件完成下列任務：
+  `kube-proxy` – 監控網路端點和服務，並管理相關事件。這可啟用整個叢集的網路代理功能。
+  `ipamd` – 管理 AWS VPC 聯網資源和容器網路介面 (CNI)。這可讓 IP 位址管理常駐程式處理 Pod 聯網。
+  `coredns` – 存取端點與服務等服務探索資源。這可在叢集內啟用 DNS 解析。
+  `ebs-csi-driver` – 使用 Amazon EBS 磁碟區的儲存相關資源。這允許持續性磁碟區的動態佈建與附加。
+  `neuron` – 監控 AWS Neuron 裝置的節點和 Pod。這可讓您管理 AWS Inferentia 和 Trainium 加速器。
+  `node-monitoring-agent` – 存取節點診斷與事件。這實現了叢集運作狀態監控與診斷收集。

每個元件都使用專用服務帳戶，且僅限於其特定功能所需的許可。

如果您在 NodeClass 中手動指定節點 IAM 角色，則需要建立將新節點 IAM 角色與此存取政策建立關聯的存取項目。

## AmazonEKSBlockStoragePolicy
<a name="_amazoneksblockstoragepolicy"></a>

**注意**  
此政策僅針對 AWS 服務連結角色指定，無法與客戶受管角色搭配使用。

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSBlockStoragePolicy` 

此政策包含允許 Amazon EKS 管理儲存操作的領導者選擇和協調資源的許可：
+  `coordination.k8s.io` – 建立和管理用於領導者選擇的租約物件。這使得 EKS 儲存元件能夠透過領導者選擇機制在整個叢集中協調其活動。

該政策的範圍限定於 EKS 儲存元件使用的特定租約資源，避免與叢集中其他協調資源發生存取衝突。

當啟用自動模式時，Amazon EKS 會自動為叢集 IAM 角色建立帶有此存取政策的存取項目，以確保區塊儲存功能正常運作所需的許可到位。

## AmazonEKSLoadBalancingPolicy
<a name="_amazoneksloadbalancingpolicy"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSLoadBalancingPolicy` 

此政策包含允許 Amazon EKS 管理領導者選擇資源以進行負載平衡的許可：
+  `coordination.k8s.io` – 建立和管理用於領導者選擇的租約物件。此功能可讓 EKS 負載平衡元件透過選擇領導者，協調多個複本間的活動。

此政策範圍專門針對負載平衡租約資源，確保協調運作順暢，同時防止存取叢集中的其他租約資源。

當啟用自動模式時，Amazon EKS 會自動為叢集 IAM 角色建立帶有此存取政策的存取項目，以確保聯網功能正常運作所需的許可到位。

## AmazonEKSNetworkingPolicy
<a name="_amazoneksnetworkingpolicy"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSNetworkingPolicy` 

此政策包含允許 Amazon EKS 管理領導者選擇資源以進行聯網的許可：
+  `coordination.k8s.io` – 建立和管理用於領導者選擇的租約物件。這可讓 EKS 聯網元件可透過選擇領導者來協調 IP 位址分配活動。

此政策範圍專門針對聯網租約資源，確保協調運作順暢，同時防止存取叢集中的其他租約資源。

當啟用自動模式時，Amazon EKS 會自動為叢集 IAM 角色建立帶有此存取政策的存取項目，以確保聯網功能正常運作所需的許可到位。

## AmazonEKSComputePolicy
<a name="_amazonekscomputepolicy"></a>

**注意**  
此政策僅針對 AWS 服務連結角色指定，無法與客戶受管角色搭配使用。

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSComputePolicy` 

此政策包含允許 Amazon EKS 管理領導者選擇資源以進行運算操作的許可：
+  `coordination.k8s.io` – 建立和管理用於領導者選擇的租約物件。這讓 EKS 運算元件能透過選擇領導者來協調節點擴展活動。

政策範圍專門針對運算管理租約資源，同時允許叢集中所有租約資源的基本讀取權限 (`get`、`watch`)。

當啟用自動模式時，Amazon EKS 會自動為叢集 IAM 角色建立帶有此存取政策的存取項目，以確保聯網功能正常運作所需的許可到位。

## AmazonEKSBlockStorageClusterPolicy
<a name="_amazoneksblockstorageclusterpolicy"></a>

**注意**  
此政策僅針對 AWS 服務連結角色指定，無法與客戶受管角色搭配使用。

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSBlockStorageClusterPolicy` 

此政策會授予 Amazon EKS 自動模式的區塊儲存功能所需的許可。它能有效管理 Amazon EKS 叢集內的區塊儲存資源。政策包含下列許可：

CSI 驅動程式管理：
+ 建立、讀取、更新和刪除 CSI 驅動程式，特別是區塊儲存。

磁碟區管理：
+ 列出、監看、建立、更新、修補及刪除持續性磁碟區。
+ 列出、監看及更新持續性磁碟區宣告。
+ 修補持續性磁碟區宣告狀態。

節點與 Pod 互動：
+ 讀取節點與 Pod 資訊。
+ 管理與儲存操作相關的事件。

儲存類別與屬性：
+ 讀取儲存類別與 CSI 節點。
+ 讀取磁碟區屬性類別。

磁碟區連接：
+ 列出、監看及修改磁碟區連接及其狀態。

快照操作：
+ 管理磁碟區快照、快照內容及快照類別。
+ 處理磁碟區群組快照及相關資源的操作。

此政策旨在為執行於自動模式的 Amazon EKS 叢集提供全面的區塊儲存管理支援。它結合了區塊儲存磁碟卷的佈建、連接、調整大小與快照等多種操作許可。

當啟用自動模式時，Amazon EKS 會自動為叢集 IAM 角色建立帶有此存取政策的存取項目，以確保區塊儲存功能正常運作所需的許可到位。

## AmazonEKSComputeClusterPolicy
<a name="_amazonekscomputeclusterpolicy"></a>

**注意**  
此政策僅針對 AWS 服務連結角色指定，無法與客戶受管角色搭配使用。

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSComputeClusterPolicy` 

此政策會授予 Amazon EKS 自動模式的運算管理功能所需的許可。它能高效協同運作與擴展 Amazon EKS 叢集內的運算資源。政策包含下列許可：

節點管理：
+ 建立、讀取、更新、刪除及管理 NodePools 與 NodeClaims 的狀態。
+ 管理 NodeClass，包括建立、修改與刪除。

排程與資源管理：
+ 對 Pod、節點、持續性磁碟區、持續性磁碟區宣告、複寫控制器和命名空間的讀取權限。
+ 對儲存類別、CSI 節點及磁碟區連接的讀取權限。
+ 列出及監看部署、常駐程式集、複本集與有狀態集。
+ 讀取 Pod 中斷預算。

事件處理：
+ 建立、讀取及管理叢集事件。

節點解除佈建與 Pod 移出：
+ 更新、修補及刪除節點。
+ 必要時建立 Pod 移出及刪除 Pod。

自訂資源定義 (CRD) 管理：
+ 建立新 CRD。
+ 管理與節點管理相關的特定 CRD (NodeClasses、NodePools、NodeClaims 及 NodeDiagnostics)。

此政策旨在為執行於自動模式的 Amazon EKS 叢集提供全面的運算管理支援。它結合了節點佈建、排程、擴展與資源最佳化等多種操作的許可。

當啟用自動模式時，Amazon EKS 會自動為叢集 IAM 角色建立帶有此存取政策的存取項目，以確保運算管理功能正常運作所需的許可到位。

## AmazonEKSLoadBalancingClusterPolicy
<a name="_amazoneksloadbalancingclusterpolicy"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSLoadBalancingClusterPolicy` 

此政策會授予 Amazon EKS 自動模式的負載平衡功能所需的許可。它能實現 Amazon EKS 叢集內負載平衡資源的高效管理與組態。政策包含下列許可：

事件與資源管理：
+ 建立與修補事件。
+ 對 Pod、節點、端點及命名空間的讀取權限。
+ 更新 Pod 狀態。

服務與傳入管理：
+ 服務及其狀態的完整管理。
+ 全面控制傳入及其狀態。
+ 端點配量與傳入類別的讀取權限。

目標群組連結：
+ 建立與修改目標群組連結及其狀態。
+ 對傳入類別參數的讀取權限。

自訂資源定義 (CRD) 管理：
+ 建立與讀取所有 CRD。
+ targetgroupbindings.eks.amazonaws.com 與 ingressclassparams.eks.amazonaws.com CRD 的特定管理。

Webhook 組態：
+ 建立與讀取變動及驗證 Webhook 組態。
+ 管理 eks-load-balancing-webhook 組態。

此政策旨在為執行於自動模式的 Amazon EKS 叢集提供全面的負載平衡管理支援。它結合了各種操作的許可，包括服務公開、輸入路由，以及與 AWS 負載平衡服務的整合。

當啟用自動模式時，Amazon EKS 會自動為叢集 IAM 角色建立帶有此存取政策的存取項目，以確保負載平衡功能正常運作所需的許可到位。

## AmazonEKSNetworkingClusterPolicy
<a name="_amazoneksnetworkingclusterpolicy"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSNetworkingClusterPolicy` 

AmazonEKSNetworkingClusterPolicy

此政策會授予 Amazon EKS 自動模式的聯網功能所需的許可。它能實現 Amazon EKS 叢集內聯網資源的高效管理與組態。政策包含下列許可：

節點與 Pod 管理：
+ 對 NodeClass 及其狀態的讀取權限。
+ 對 NodeClaims 及其狀態的讀取權限。
+ 對 Pod 的讀取權限。

CNI 節點管理：
+ 對 CNINodes 及其狀態的許可，包含建立、讀取、更新、刪除及修補。

自訂資源定義 (CRD) 管理：
+ 建立與讀取所有 CRD。
+ 對 cninodes.eks.amazonaws.com CRD 的特定管理 (更新、修補、刪除)。

管理事件：
+ 建立與修補事件。

此政策旨在為執行於自動模式的 Amazon EKS 叢集提供全面的聯網管理支援。它結合了節點聯網組態、CNI (容器網路介面) 管理及相關自訂資源處理等多種操作的許可。

此政策允許聯網元件與節點相關資源互動、管理 CNI 特定的節點組態，並處理叢集中聯網操作關鍵的自訂資源。

當啟用自動模式時，Amazon EKS 會自動為叢集 IAM 角色建立帶有此存取政策的存取項目，以確保聯網功能正常運作所需的許可到位。

## AmazonEKSHybridPolicy
<a name="access-policy-permissions-amazonekshybridpolicy"></a>

**注意**  
此政策僅針對 AWS 服務連結角色指定，無法與客戶受管角色搭配使用。

此存取政策包含了授予 EKS 存取叢集節點的許可。當將之與某個存取項目關聯時，其存取範圍通常是叢集，而不是某個 Kubernetes 命名空間。此政策供 Amazon EKS 混合節點使用。

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSHybridPolicy` 


| Kubernetes API 群組 | Kubernetes nonResourceURLs | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | --- | 
|   `*`   |  |   `nodes`   |   `list`   | 

## AmazonEKSClusterInsightsPolicy
<a name="access-policy-permissions-AmazonEKSClusterInsightsPolicy"></a>

**注意**  
此政策僅針對 AWS 服務連結角色指定，無法與客戶受管角色搭配使用。

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSClusterInsightsPolicy` 

此政策授予 Amazon EKS Cluster Insights 功能的唯讀許可。政策包含下列許可：

節點存取：- 列出與檢視叢集節點 - 讀取節點狀態資訊

DaemonSet 存取：- 對 kube-proxy 組態的讀取權限

此政策由 EKS 服務為 Cluster Insights 自動管理。如需詳細資訊，請參閱[利用叢集洞見為 Kubernetes 版本升級做好準備，並為錯誤組態進行故障診斷](cluster-insights.md)。

## AWSBackupFullAccessPolicyForBackup
<a name="_awsbackupfullaccesspolicyforbackup"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AWSBackupFullAccessPolicyForBackup` 

AWSBackupFullAccessPolicyForBackup

此政策授予 AWS Backup 管理和建立 EKS 叢集備份所需的許可。此政策包含以下許可：


| Kubernetes API 群組 | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | 
|   `*`   |   `*`   |   `list`, `get`   | 

## AWSBackupFullAccessPolicyForRestore
<a name="_awsbackupfullaccesspolicyforrestore"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AWSBackupFullAccessPolicyForRestore` 

AWSBackupFullAccessPolicyForRestore

此政策授予 AWS Backup 管理和還原 EKS 叢集備份所需的許可。此政策包含以下許可：


| Kubernetes API 群組 | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | 
|   `*`   |   `*`   |   `list`, `get`, `create`   | 

## AmazonEKSACKPolicy
<a name="_amazoneksackpolicy"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSACKPolicy` 

此政策授予 AWS Controllers for Kubernetes (ACK) 功能從 Kubernetes 管理 AWS 資源所需的許可。政策包含下列許可：

ACK 自訂資源管理：
+ 完整存取 50\$1 個服務中的所有 ACK AWS 服務自訂資源，包括 S3、RDS、DynamoDB、Lambda、EC2 等。
+ 建立、讀取、更新和刪除 ACK 自訂資源定義。

命名空間存取：
+ 資源組織的命名空間讀取存取權。

領導者選擇：
+ 建立和讀取領導者選擇的協調租用。
+ 更新和刪除特定 ACK 服務控制器租用。

管理事件：
+ 建立和修補 ACK 操作的事件。

此政策旨在支援透過 Kubernetes APIs全面的 AWS 資源管理。Amazon EKS 會自動為您在建立 ACK 功能時提供的功能 IAM 角色建立具有此存取政策的存取項目。


| Kubernetes API 群組 | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | 
|  |   `namespaces`   |   `get`, `watch`, `list`   | 
|   `services.k8s.aws`, `acm.services.k8s.aws`, `acmpca.services.k8s.aws`, `apigateway.services.k8s.aws`, `apigatewayv2.services.k8s.aws`, `applicationautoscaling.services.k8s.aws`, `athena.services.k8s.aws`, `bedrock.services.k8s.aws`, `bedrockagent.services.k8s.aws`, `bedrockagentcorecontrol.services.k8s.aws`, `cloudfront.services.k8s.aws`, `cloudtrail.services.k8s.aws`, `cloudwatch.services.k8s.aws`, `cloudwatchlogs.services.k8s.aws`, `codeartifact.services.k8s.aws`, `cognitoidentityprovider.services.k8s.aws`, `documentdb.services.k8s.aws`, `dynamodb.services.k8s.aws`, `ec2.services.k8s.aws`, `ecr.services.k8s.aws`, `ecrpublic.services.k8s.aws`, `ecs.services.k8s.aws`, `efs.services.k8s.aws`, `eks.services.k8s.aws`, `elasticache.services.k8s.aws`, `elbv2.services.k8s.aws`, `emrcontainers.services.k8s.aws`, `eventbridge.services.k8s.aws`, `iam.services.k8s.aws`, `kafka.services.k8s.aws`, `keyspaces.services.k8s.aws`, `kinesis.services.k8s.aws`, `kms.services.k8s.aws`, `lambda.services.k8s.aws`, `memorydb.services.k8s.aws`, `mq.services.k8s.aws`, `networkfirewall.services.k8s.aws`, `opensearchservice.services.k8s.aws`, `organizations.services.k8s.aws`, `pipes.services.k8s.aws`, `prometheusservice.services.k8s.aws`, `ram.services.k8s.aws`, `rds.services.k8s.aws`, `recyclebin.services.k8s.aws`, `route53.services.k8s.aws`, `route53resolver.services.k8s.aws`, `s3.services.k8s.aws`, `s3control.services.k8s.aws`, `sagemaker.services.k8s.aws`, `secretsmanager.services.k8s.aws`, `ses.services.k8s.aws`, `sfn.services.k8s.aws`, `sns.services.k8s.aws`, `sqs.services.k8s.aws`, `ssm.services.k8s.aws`, `wafv2.services.k8s.aws`   |   `*`   |   `*`   | 
|   `coordination.k8s.io`   |   `leases`   |   `create`, `get`, `list`, `watch`   | 
|   `coordination.k8s.io`   |   `leases` （僅限特定 ACK 服務控制器租用）  |   `delete`, `update`, `patch`   | 
|  |   `events`   |   `create`, `patch`   | 
|   `apiextensions.k8s.io`   |   `customresourcedefinitions`   |   `*`   | 

## AmazonEKSArgoCDClusterPolicy
<a name="_amazoneksargocdclusterpolicy"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSArgoCDClusterPolicy` 

此政策會授予 Argo CD 功能所需的叢集層級許可，以探索資源和管理叢集範圍物件。政策包含下列許可：

命名空間管理：
+ 建立、讀取、更新和刪除應用程式命名空間管理的命名空間。

自訂資源定義管理：
+ 管理 Argo CD 特定 CRDs（應用程式、AppProjects、ApplicationSets)。

API 探索：
+ 用於資源探索的 Kubernetes API 端點讀取存取權。

此政策旨在支援叢集層級 Argo CD 操作，包括命名空間管理和 CRD 安裝。Amazon EKS 會自動為您在建立 Argo CD 功能時提供的功能 IAM 角色建立具有此存取政策的存取項目。


| Kubernetes API 群組 | Kubernetes nonResourceURLs | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | --- | 
|  |  |   `namespaces`   |   `create`, `get`, `update`, `patch`, `delete`   | 
|   `apiextensions.k8s.io`   |  |   `customresourcedefinitions`   |   `create`   | 
|   `apiextensions.k8s.io`   |  |   `customresourcedefinitions` （僅限 Argo CD CRDs)  |   `get`, `update`, `patch`, `delete`   | 
|  |   `/api`, `/api/*`, `/apis`, `/apis/*`   |  |   `get`   | 

## AmazonEKSArgoCDPolicy
<a name="_amazoneksargocdpolicy"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSArgoCDPolicy` 

此政策會授予 Argo CD 功能部署和管理應用程式所需的命名空間層級許可。政策包含下列許可：

秘密管理：
+ 完整存取 Git 登入資料和叢集秘密的秘密。

ConfigMap 存取：
+ 如果客戶嘗試使用不支援的 Argo CD ConfigMaps，請讀取 ConfigMaps 的存取權以傳送警告。

管理事件：
+ 讀取和建立事件以進行應用程式生命週期追蹤。

Argo CD 資源管理：
+ 應用程式、ApplicationSets 和 AppProjects 的完整存取權。
+ 管理 Argo CD 資源的最終處理者和狀態。

此政策旨在支援命名空間層級的 Argo CD 操作，包括應用程式部署和管理。Amazon EKS 會自動為您在 Argo CD 功能建立範圍為 Argo CD 命名空間時提供的功能 IAM 角色建立具有此存取政策的存取項目。


| Kubernetes API 群組 | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | 
|  |   `secrets`   |   `*`   | 
|  |   `configmaps`   |   `get`, `list`, `watch`   | 
|  |   `events`   |   `get`, `list`, `watch`, `patch`, `create`   | 
|   `argoproj.io`   |   `applications`, `applications/finalizers`, `applications/status`, `applicationsets`, `applicationsets/finalizers`, `applicationsets/status`, `appprojects`, `appprojects/finalizers`, `appprojects/status`   |   `*`   | 

## AmazonEKSKROPolicy
<a name="_amazonekskropolicy"></a>

 **ARN** – ` arn:aws: eks::aws:cluster-access-policy/AmazonEKSKROPolicy` 

此政策授予 kro (Kube Resource Orchestrator) 功能建立和管理自訂 Kubernetes APIs 所需的許可。政策包含下列許可：

kro 資源管理：
+ 完整存取所有 kro 資源，包括 ResourceGraphDefinitions 和自訂資源執行個體。

自訂資源定義管理：
+ 為 ResourceGraphDefinitions 定義的自訂 APIs建立、讀取、更新和刪除 CRDs。

領導者選擇：
+ 建立和讀取領導者選擇的協調租用。
+ 更新和刪除 kro 控制器租用。

管理事件：
+ 建立和修補 kro 操作的事件。

此政策旨在透過 kro 支援全面的資源合成和自訂 API 管理。Amazon EKS 會自動為您在建立 kro 功能時提供的功能 IAM 角色建立具有此存取政策的存取項目。


| Kubernetes API 群組 | Kubernetes 資源 | Kubernetes 動詞 (許可) | 
| --- | --- | --- | 
|   `kro.run`   |   `*`   |   `*`   | 
|   `apiextensions.k8s.io`   |   `customresourcedefinitions`   |   `*`   | 
|   `coordination.k8s.io`   |   `leases`   |   `create`, `get`, `list`, `watch`   | 
|   `coordination.k8s.io`   |   `leases` （僅限 Kro 控制器租用）  |   `delete`, `update`, `patch`   | 
|  |   `events`   |   `create`, `patch`   | 

## 存取政策更新
<a name="access-policy-updates"></a>

檢視有關存取政策更新 (自引進以來) 的詳細資訊。如需有關此頁面變更的自動提醒，請訂閱 [文件歷史紀錄](doc-history.md) 中的 RSS 摘要。


| 變更 | 描述 | Date | 
| --- | --- | --- | 
|  新增 EKS 功能的政策  |  發佈 `AmazonEKSACKPolicy`、`AmazonEKSArgoCDPolicy`、 `AmazonEKSArgoCDClusterPolicy`和 `AmazonEKSKROPolicy`以管理 EKS 功能  |  2025 年 11 月 22 日  | 
|  加 `AmazonEKSSecretReaderPolicy`   |  為秘密的唯讀存取新增新政策  |  2025 年 11 月 6 日  | 
|  新增 EKS Cluster Insights 政策  |  發布 `AmazonEKSClusterInsightsPolicy`   |  2024 年 12 月 2 日  | 
|  新增 Amazon EKS 混合政策  |  發布 `AmazonEKSHybridPolicy`   |  2024 年 12 月 2 日  | 
|  新增 Amazon EKS 自動模式政策  |  這些存取政策提供叢集 IAM 角色和節點 IAM 角色呼叫 Kubernetes APIs許可。 AWS 使用這些許可來自動化儲存、運算和聯網資源的例行任務。  |  2024 年 12 月 2 日  | 
|  加 `AmazonEKSAdminViewPolicy`   |  新增用於擴展檢視存取權限的新政策，包含如 Secrets 等資源。  |  2024 年 4 月 23 日  | 
|  引進存取政策。  |  Amazon EKS 引進了存取政策。  |  2023 年 5 月 29 日  | 

# 變更驗證模式以使用存取項目
<a name="setting-up-access-entries"></a>

若要開始使用存取項目，您必須將叢集的身分驗證模式變更為 `API_AND_CONFIG_MAP` 或 `API` 模式。這會新增用於存取項目的 API。

## AWS 主控台
<a name="access-entries-setup-console"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇要在其中建立存取項目的叢集名稱。

1. 選擇**存取**索引標籤。

1. **身分驗證模式**顯示叢集目前的身分驗證模式。如果模式顯示 EKS API，則表示您已經可以新增存取項目，您可以略過餘下步驟。

1. 選擇**管理存取**。

1. 對於**叢集身分驗證模式**，請選取帶有 EKS API 的模式。請注意，您無法將身分驗證模式變更回移除 EKS API 和存取項目的模式。

1. 選擇**儲存變更**。Amazon EKS 開始更新叢集，叢集的狀態變更為「正在更新」，並且將變更記錄在**更新歷史記錄**索引標籤中。

1. 等待叢集狀態變回「作用中」。當叢集的狀態為「作用中」時，您可以依照 [建立存取項目](creating-access-entries.md) 中的步驟為 IAM 主體新增對叢集的存取權。

## AWS CLI
<a name="access-setup-cli"></a>

1. 依據《*AWS 命令列介面使用者指南*》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)內容所述，安裝 AWS CLI。

1. 執行下列命令。使用您叢集的名稱取代 *my-cluster*。如果您想永久停用 `ConfigMap` 方法，則請用 `API` 取代 `API_AND_CONFIG_MAP`。

   Amazon EKS 開始更新叢集，叢集的狀態變更為「正在更新」，並且變更記錄在 **aws eks list-updates** 中。

   ```
   aws eks update-cluster-config --name my-cluster --access-config authenticationMode=API_AND_CONFIG_MAP
   ```

1. 等待叢集狀態變回「作用中」。當叢集的狀態為「作用中」時，您可以依照 [建立存取項目](creating-access-entries.md) 中的步驟為 IAM 主體新增對叢集的存取權。

## 要求使用的平台版本
<a name="_required_platform_version"></a>

如需使用*存取項目*，叢集的平台版本必須與下表所列版本相同或更新，或是晚於表格中列出版本的 Kubernetes 版本。若未列示 Kubernetes 版本，則所有平台版本皆支援這些存取項目。


| Kubernetes 版本 | 平台版本 | 
| --- | --- | 
|  未列示  |  全部支援  | 
|   `1.30`   |   `eks.2`   | 
|   `1.29`   |   `eks.1`   | 
|   `1.28`   |   `eks.6`   | 

如需詳細資訊，請參閱 [platform-versions](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html)。

# 建立存取項目
<a name="creating-access-entries"></a>

在建立存取項目之前，請考慮以下事項：
+ 正確設定的身分驗證模式。請參閱 [變更驗證模式以使用存取項目](setting-up-access-entries.md)。
+ *存取項目*包含一個 (且僅一個) 現有 IAM 主體的 Amazon Resource Name (ARN)。一個 IAM 主體不能包含在多個存取項目中。對於您指定的 ARN 的其他考量：
  + IAM 最佳實務建議使用具有短期憑證的 IAM *角色*存取叢集，而不是使用具有長期憑證的 IAM *使用者*進行存取。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[要求人類使用者搭配身分提供者使用聯合功能，以便使用暫時性憑證存取 AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。
  + 如果 ARN 用於 IAM 角色，則它*可以*包含路徑。`aws-auth` `ConfigMap` 項目中的 ARN 則*不能*包含路徑。例如， ARN 可以是 ` arn:aws:iam::<111122223333>:role/<development/apps/my-role>` 或 ` arn:aws:iam::<111122223333>:role/<my-role>`。
  + 如果存取項目的類型不是 `STANDARD` (請參閱與類型有關的下一個考量)，則 ARN 必須與叢集位於相同 AWS 帳戶中。如果類型為 `STANDARD`，則 ARN 可以與叢集所在之帳戶位於相同或不同的 AWS 帳戶中。
  + 建立存取項目後，您無法變更該 IAM 主體。
  + 如果您刪除具有此 ARN 的 IAM 主體，則存取項目並不會自動刪除。建議您刪除帶有您刪除之 IAM 主體的 ARN 的存取項目。如果您在不刪除存取項目的情況下重新建立 IAM 主體，則即使它具有相同的 ARN，存取項目也將無法運作。這是因為，儘管重新建立的 IAM 主體的 ARN 與此前的主體相同，但重新建立的 IAM 主體的 `roleID` 或 `userID` (您可以使用 `aws sts get-caller-identity` AWS CLI 命令查看) 與原始 IAM 主體的不同。即使您看不到存取項目的 IAM 主體 `roleID` 或 `userID`，Amazon EKS 也會將其與存取項目一起儲存。
+ 每個存取項目都有一種*類型*。存取項目的類型取決於與其關聯的資源類型，並不定義許可。如果您不指定類型，則 Amazon EKS 會自動將類型設為 `STANDARD` 
  +  `EC2_LINUX` - 用於與 Linux 或 Bottlerocket 自我管理的節點搭配使用的 IAM 角色
  +  `EC2_WINDOWS` - 用於與 Windows 自我管理的節點搭配使用的 IAM 角色
  +  `FARGATE_LINUX` - 用於與 AWS Fargate (Fargate) 搭配使用的 IAM 角色
  +  `HYBRID_LINUX` - 用於與混合節點搭配使用的 IAM 角色
  +  `STANDARD` - 未指定類型時為預設類型
  +  `EC2` - 適用於 EKS 自動模式自訂節點類別。如需詳細資訊，請參閱 [建立節點類別存取項目](create-node-class.md#auto-node-access-entry)。
  + 建立存取項目後，您無法變更類型。
+ 無需為用於受管節點群組或 Fargate 設定檔的 IAM 角色建立存取項目。EKS 將建立存取項目 (如果啟用)，或更新身分驗證組態映射 (如果存取項目不可用)
+ 如果某個存取項目的類型為 `STANDARD`，則可以為其指定一個使用者名稱**。如果您沒有指定使用者名稱的值，Amazon EKS 會根據存取項目的類型以及您指定的 IAM 主體是 IAM 角色還是 IAM 使用者，設定下列其中一個值。除非您有特定原因需要自己指定使用者名稱，否則建議您不要指定使用者名稱，而是讓 Amazon EKS 自動為您產生該使用者名稱。如果您自己指定使用者名稱：
  + 該名稱不能以 `system:`、`eks:`、`aws:`、`amazon:` 或 `iam:` 開頭。
  + 如果該使用者名稱用於 IAM 角色，則建議您在末尾新增 `{{SessionName}}` 或 `{{SessionNameRaw}}`。如果將 `{{SessionName}}` 或 `{{SessionNameRaw}}` 新增至使用者名稱，則必須在 \$1\$1SessionName\$1\$1 *之前*必須有冒號。該角色被擔任時，指定的 AWS STS 工作階段名稱會自動傳遞到叢集，並將顯示在 CloudTrail 日誌中。例如，使用者名稱不能為 `john{{SessionName}}`。使用者名稱必須為 `:john{{SessionName}}` 或 `jo:hn{{SessionName}}`。冒號只需位於 `{{SessionName}}` 之前。以下資料表中 Amazon EKS 產生的使用者名稱包含 ARN。由於 ARN 包含冒號，因此它符合此項要求。如果使用者名稱中不包含 `{{SessionName}}`，則不需要冒號。請注意，在 `{{SessionName}}` 中，特殊字元 "@" 在工作階段名稱中會被取代為 "-"。`{{SessionNameRaw}}` 會保留工作階段名稱中的所有特殊字元。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/creating-access-entries.html)

    建立存取項目後，您可以對使用者名稱進行變更。
+ 如果某個存取項目的類型為 `STANDARD`，且您希望使用 Kubernetes RBAC 授權，則可以在該存取項目中新增一個或多個*群組名稱*。建立存取項目後，您可以新增和移除群組名稱。為了使 IAM 主體能夠存取叢集上的 Kubernetes 物件，您必須建立和管理 Kubernetes 角色型授權 (RBAC) 物件。在您的叢集上建立 Kubernetes `RoleBinding` 或 `ClusterRoleBinding` 物件，並將群組名稱指定為 `kind: Group` 的 `subject`。Kubernetes 會授權 IAM 主體存取您在 Kubernetes `Role` 或 `ClusterRole` 物件中指定的任何叢集物件，這些物件您也在繫結的 `roleRef` 中指定了。如果您指定群組名稱，則建議您熟悉 Kubernetes role-based 角色型授權 (RBAC) 物件。如需詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。
**重要**  
Amazon EKS 不會確認叢集上存在的任何 Kubernetes RBAC 物件是否包含您指定的任何群組名稱。例如，如果您為目前不存在的群組建立存取項目，EKS 將會建立該群組，而不是傳回錯誤。

  您可以將 Amazon EKS *存取政策*關聯到存取項目，而不是讓 Kubernetes 授權 IAM 主體存取叢集上的 Kubernetes 物件。Amazon EKS 授權 IAM 主體使用存取政策中的許可存取叢集上的 Kubernetes 物件。您可以將存取政策的許可範圍限定為您指定的 Kubernetes 命名空間。使用存取政策無需您管理 Kubernetes RBAC 物件。如需詳細資訊，請參閱 [將存取政策與存取項目相關聯](access-policies.md)。
+ 如果您建立類型為 `EC2_LINUX` 或 `EC2_Windows` 的存取項目，則建立該存取項目的 IAM 主體必須具有 `iam:PassRole` 許可。如需詳細資訊，請參閱《IAM 使用者指南》**中的[授予使用者將角色傳遞至 AWS 服務的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。
+ 與標準 [IAM 行為](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency)類似，存取項目的建立和更新採用最終一致模式，在初始 API 呼叫成功返回後可能需要幾秒鐘才能生效。您設計的應用程式必須能夠處理這些可能的延遲問題。建議您不要在應用程式的關鍵、高可用性程式碼路徑中包含存取項目建立或更新動作。而應在不常運作的、單獨的初始化或設定常式中進行 更改。另外，在生產工作流程套用這些變更之前，請務必確認變更已傳播完畢。
+ 存取項目不支援[服務連結角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html)。您無法建立主體 ARN 是服務連結角色的存取項目。您可以透過其 ARN 識別服務連結角色，其格式為 ` arn:aws:iam::*:role/aws-service-role/*`。

您可以使用 AWS 管理主控台 或 AWS CLI 建立存取項目。

## AWS 管理主控台
<a name="access-create-console"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇要在其中建立存取項目的叢集名稱。

1. 選擇**存取**索引標籤。

1. 選擇**建立存取項目**。

1. 對於 **IAM 主體**，選取現有 IAM 角色或使用者。IAM 最佳實務建議使用具有短期憑證的 IAM *角色*存取叢集，而不是使用具有長期憑證的 IAM *使用者*進行存取。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[要求人類使用者搭配身分提供者使用聯合功能，以便使用暫時性憑證存取 AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。

1. 對於**類型**，如果存取項目針對用於自我管理 Amazon EC2 節點的節點角色，請選取 **EC2 Linux** 或 **EC2 Windows**。否則，請接受預設值 (**標準**)。

1. 如果您選擇的**類型**是**標準**並且您想要指定**使用者名稱**，則請輸入使用者名稱。

1. 如果您選擇的**類型**是**標準**並且您想要對 IAM 主體使用 Kubernetes RBAC 授權，則請為**群組**指定一個或多個名稱。如果不指定任何群組名稱並希望使用 Amazon EKS 授權，則您可以在後續步驟中或在建立存取項目後關聯存取政策。

1. (選用) 您可以使用**標籤**為存取項目指派標籤。例如，為了更輕鬆地找到具有相同標籤的所有資源而指定標籤。

1. 選擇**下一步**。

1. 在**新增存取政策**頁面上，如果您選擇的類型是**標準**並且希望 Amazon EKS 授予該 IAM 主體對叢集上的 Kubernetes 物件的許可，請完成下列步驟。否則請選擇 **Next (下一步)**。/

   1. 對於**政策名稱**，請選擇存取政策。您無法檢視存取政策的許可，但其包含與 Kubernetes 面向使用者之 `ClusterRole` 物件中的許可類似的許可。如需詳細資訊，請參閱 Kubernetes 文件中的 [User-facing roles](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles) 一節。

   1. 請選擇下列其中一個選項：
      +  **叢集**：如果您希望 Amazon EKS 授予該 IAM 主體存取政策中針對叢集上所有 Kubernetes 物件的許可，請選擇此選項。
      +  **Kubernetes 命名空間**：如果您希望 Amazon EKS 授予該 IAM 主體存取政策中針對叢集上特定 Kubernetes 命名空間中所有 Kubernetes 物件的許可，則請選擇此選項。對於**命名空間**，請輸入叢集上 Kubernetes 命名空間的名稱。如果要新增其他命名空間，則請選擇**新增命名空間**並輸入命名空間名稱。

   1. 如果要新增其他政策，則請選擇**新增政策**。您可以對每個政策設定不同的範圍，但每個政策只能新增一次。

   1. 選擇**下一步**。

1. 檢查存取項目的組態。如果有任何內容看起來不正確，請選擇**上一步**以返回上一步並修正錯誤。如果組態正確，請選擇**建立**。

## AWS CLI
<a name="access-create-cli"></a>

1. 依據《AWS 命令列介面使用者指南》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)內容所述，安裝 AWS CLI。

1. 要建立存取項目，您可以使用以下任何範例來建立存取項目：
   + 為自我管理的 Amazon EC2 Linux 節點群組建立存取項目。用您的叢集名稱取代 *my-cluster*，用您的 AWS 帳戶 ID 取代 *111122223333*，並用您的[節點 IAM 角色](create-node-role.md)的名稱取代 *EKS-my-cluster-self-management-ng-1*。如果節點群組是 Windows 節點群組，請用 `EC2_Windows` 取代 *EC2\$1LINUX*。

     ```
     aws eks create-access-entry --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/EKS-my-cluster-self-managed-ng-1 --type EC2_LINUX
     ```

     當指定 `STANDARD` 以外的類型時，則不能使用 `--kubernetes-groups` 選項。您無法將存取政策與此存取項目關聯，因為其類型是 `STANDARD` 以外的值。
   + 建立這樣的一個存取項目：允許一個未用於 Amazon EC2 自我管理節點群組且您希望 Kubernetes 透過其授予對叢集的存取權的 IAM 角色。用您的叢集名稱取代 *my-cluster*，用您的 AWS 帳戶 ID 取代 *111122223333*，並用您的 IAM 角色名稱取代 *my-role*。用您在叢集上的 Kubernetes `RoleBinding` 或 `ClusterRoleBinding` 物件中指定的群組名稱取代 *Viewers*。

     ```
     aws eks create-access-entry --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role --type STANDARD --user Viewers --kubernetes-groups Viewers
     ```
   + 建立一個允許 IAM 使用者向叢集進行身分驗證的存取項目。在此提供此範例只是為了說明這種可能性。IAM 最佳實務建議使用具有短期憑證的 IAM *角色*存取叢集，而不是使用具有長期憑證的 IAM *使用者*進行存取。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[要求人類使用者搭配身分提供者使用聯合功能，以便使用暫時性憑證存取 AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。

     ```
     aws eks create-access-entry --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:user/my-user --type STANDARD --username my-user
     ```

     如果您希望此使用者對叢集的存取許可高於 Kubernetes API 探索角色中的許可，則您需要將存取政策關聯到該存取項目，因為不使用 `--kubernetes-groups` 選項。如需詳細資訊，請參閱 Kubernetes 文件中的 [將存取政策與存取項目相關聯](access-policies.md) 以及 [API discovery roles](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#discovery-roles) 兩節。

# 更新存取項目
<a name="updating-access-entries"></a>

您可以使用 AWS 管理主控台 或 AWS CLI 來更新存取項目。

## AWS 管理主控台
<a name="access-update-console"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇要在其中建立存取項目的叢集名稱。

1. 選擇**存取**索引標籤。

1. 選擇要更新的存取項目。

1. 選擇**編輯**。

1. 對於**使用者名稱**，您可以變更現有值。

1. 對於**群組**，您可以移除現有群組名稱或新增群組名稱。如果存在以下群組名稱，請勿將其移除：**system:nodes** 或 **system:bootstrappers**。移除這些群組可能會導致叢集無法正常運作。如果您不指定任何群組名稱並希望使用 Amazon EKS 授權，請在後續步驟中關聯[存取政策](access-policies.md)。

1. 您可以使用**標籤**為存取項目指派標籤。例如，為了更輕鬆地找到具有相同標籤的所有資源而指定標籤。您也可以移除現有的標籤。

1. 選擇**儲存變更**。

1. 如果您想要將存取政策關聯到項目，請參閱 [將存取政策與存取項目相關聯](access-policies.md)。

## AWS CLI
<a name="access-update-cli"></a>

1. 依據《AWS 命令列介面使用者指南》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)內容所述，安裝 AWS CLI。

1. 如需更新存取項目，使用您的叢集名稱取代 *my-cluster*，使用您的 AWS 帳戶 ID 取代 *111122223333*，並使用您的 IAM 角色名稱取代 *EKS-my-cluster-my-namespace-Viewers*。

   ```
   aws eks update-access-entry --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/EKS-my-cluster-my-namespace-Viewers --kubernetes-groups Viewers
   ```

   如果存取項目類型是 `STANDARD` 以外的值，則不能使用 `--kubernetes-groups` 選項。您也無法將存取政策與 `STANDARD` 以外的類型的存取項目關聯。

# 刪除存取項目
<a name="deleting-access-entries"></a>

如果您發現某個存取項目被錯誤刪除，則您可以隨時重新建立。如果您要刪除的存取項目與任何存取政策關聯，則這些關聯將自動刪除。在刪除存取項目之前，您不必取消其與存取政策的關聯。

您可以使用 AWS 管理主控台 或 AWS CLI 刪除存取項目。

## AWS 管理主控台
<a name="access-delete-console"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇要從中刪除存取項目之叢集的名稱。

1. 選擇**存取**索引標籤。

1. 在**存取項目**清單中，選擇要刪除的存取項目。

1. 選擇 Delete (刪除)。

1. 在確認對話方塊中，選擇 **Delete** (刪除)。

## AWS CLI
<a name="access-delete-cli"></a>

1. 依據《AWS 命令列介面使用者指南》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)內容所述，安裝 AWS CLI。

1. 要刪除存取項目，用您的叢集名稱取代 *my-cluster*，用您的 AWS 帳戶 ID 取代 *111122223333*，並用您不想再讓其存取叢集的 IAM 角色的名稱取代 *my-role*。

   ```
   aws eks delete-access-entry --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role
   ```

# 針對 EKS 存取項目設定自訂使用者名稱
<a name="set-custom-username"></a>

針對 Amazon EKS 建立存取項目時，您可使用自動生成的使用者名稱，或者指定自訂使用者名稱。此頁面詳細說明了這兩種選項，並引導您設定自訂使用者名稱。

## 概觀
<a name="_overview"></a>

存取項目中的使用者名稱用於辨識 Kubernetes 日誌與稽核線索中的 IAM 主體。Amazon EKS 預設會依據 IAM 身分的 ARN，來生成使用者名稱，但您可根據需要指定自訂使用者名稱。

## 預設使用者名稱生成
<a name="_default_username_generation"></a>

若您未指定使用者名稱的值，Amazon EKS 會依據 IAM 身分自動生成使用者名稱：
+  **對於 IAM 使用者**：
  + EKS 將 Kubernetes 使用者名稱設定為 IAM 使用者的 ARN
  + 範例：

    ```
    {arn-aws}iam::<111122223333>:user/<my-user>
    ```
+  **對於 IAM 角色**：
  + EKS 依據 IAM 角色 ARN 來設定 Kubernetes 使用者名稱
  + 角色被擔任時的 STS ARN。Amazon EKS 將 `{{SessionName}}` 附加到角色。如果您指定的角色的 ARN 包含路徑，則 Amazon EKS 會將其從產生的使用者名稱中移除。
  + 範例：

    ```
    {arn-aws}sts::<111122223333>:assumed-role/<my-role>/{{SessionName}}
    ```

除非您有特定原因需要自己指定使用者名稱，否則建議您不要指定使用者名稱，而是讓 Amazon EKS 自動為您產生該使用者名稱。

## 設定自訂使用者名稱
<a name="_setting_a_custom_username"></a>

建立存取項目後，您可藉助 `--username` 參數來指定自訂使用者名稱：

```
aws eks create-access-entry --cluster-name <cluster-name> --principal-arn <iam-identity-arn> --type STANDARD --username <custom-username>
```

### 自訂使用者名稱要求
<a name="_requirements_for_custom_usernames"></a>

若指定自訂使用者名稱：
+ 使用者名稱的開頭不能為 `system:`、`eks:`、`aws:`、`amazon:` 或 `iam:`。
+ 如果該使用者名稱用於 IAM 角色，則建議您在末尾新增 `{{SessionName}}` 或 `{{SessionNameRaw}}`。
  + 如果將 `{{SessionName}}` 或 `{{SessionNameRaw}}` 新增至使用者名稱，則必須在 \$1\$1SessionName\$1\$1 *之前*必須有冒號。

# 使用存取政策與 AWS CLI 為 IAM 角色或使用者建立存取項目
<a name="create-standard-access-entry-policy"></a>

建立 Amazon EKS 存取項目，這些項目使用 AWS 受管 EKS 存取政策，以授予 IAM 身分標準化許可來存取和管理 Kubernetes 叢集。

## 概觀
<a name="_overview"></a>

Amazon EKS 中的存取項目會定義了 IAM 身分 (使用者和角色) 如何存取您的 Kubernetes 叢集並與其互動。透過建立具有 EKS 存取政策的存取項目，您可以：
+ 授予特定 IAM 使用者或角色存取 EKS 叢集的許可
+ 使用 AWS 管理的 EKS 存取政策來控制許可，這些政策提供標準化的預先定義許可集
+ 將許可範圍限定於特定命名空間或整個叢集
+ 簡化存取管理，無需修改 `aws-auth` ConfigMap 或建立 Kubernetes RBAC 資源
+ 使用 AWS 整合的方法進行 Kubernetes 存取控制，涵蓋常見的使用案例，同時維護安全性最佳實踐

此方法適用於大多數使用案例，因為它提供了 AWS 管理的標準化許可，而無需手動設定 Kubernetes RBAC。EKS 存取政策無需手動設定 Kubernetes RBAC 資源，並提供涵蓋常見使用案例的預定義許可集。

## 先決條件
<a name="_prerequisites"></a>
+ 您的叢集*身分驗證模式*必須設定為啟用*存取項目*。如需詳細資訊，請參閱 [變更驗證模式以使用存取項目](setting-up-access-entries.md)。
+ 依據《AWS 命令列介面使用者指南》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)內容所述，安裝與設定 AWS CLI。

## 步驟 1：定義存取項目
<a name="ap1-s1"></a>

1. 尋找您要授予許可的 IAM 身分的 ARN，如使用者或角色。
   + 每個 IAM 身分只能有一個 EKS 存取項目。

1. 確定您希望 Amazon EKS 存取政策許可僅適用於特定的 Kubernetes 命名空間，還是跨整個叢集。
   + 如果您想將許可限制在特定命名空間，請記下命名空間名稱。

1. 為 IAM 身分選擇所需的 EKS 存取政策。此政策授予叢集內許可。記下政策的 ARN。
   + 有關政策列表，請參閱[可用的存取政策](access-policy-permissions.md)。

1. 判斷自動產生的使用者名稱是否適合該存取項目，或者您是否需要手動指定使用者名稱。
   +  AWS 會根據 IAM 身分自動產生此值。您可設定自訂使用者名稱。這在 Kubernetes 日誌中可見。
   + 如需詳細資訊，請參閱 [針對 EKS 存取項目設定自訂使用者名稱](set-custom-username.md)。

## 步驟 2：建立存取項目
<a name="ap1-s2"></a>

規劃存取項目之後，使用 AWS CLI 來建立該項目。

以下範例涵蓋大多數使用案例。[檢視全部組態選項的 CLI 參考](https://docs.aws.amazon.com/cli/latest/reference/eks/create-access-entry.html)。

您將在下一步驟中附加存取政策。

```
aws eks create-access-entry --cluster-name <cluster-name> --principal-arn <iam-identity-arn> --type STANDARD
```

## 步驟 3：關聯存取政策
<a name="_step_3_associate_access_policy"></a>

根據您是否希望政策限制於指定的 Kubernetes 命名空間，指令會有所不同。

您需要存取政策的 ARN。檢視[可用的存取政策](access-policy-permissions.md)。

### 建立無命名空間範圍的政策
<a name="_create_policy_without_namespace_scope"></a>

```
aws eks associate-access-policy --cluster-name <cluster-name> --principal-arn <iam-identity-arn> --policy-arn <access-policy-arn>
```

### 使用命名空間範圍建立
<a name="_create_with_namespace_scope"></a>

```
aws eks associate-access-policy --cluster-name <cluster-name> --principal-arn <iam-identity-arn> \
    --access-scope type=namespace,namespaces=my-namespace1,my-namespace2 --policy-arn <access-policy-arn>
```

## 後續步驟
<a name="_next_steps"></a>
+  [建立 kubeconfig，以便您可以將 kubectl 與 IAM 身分搭配使用](create-kubeconfig.md) 

# 透過 AWS CLI 使用 Kubernetes 群組建立存取項目
<a name="create-k8s-group-access-entry"></a>

建立使用 Kubernetes 群組進行授權且需要手動 RBAC 組態的 Amazon EKS 存取項目。

**注意**  
對於大多數使用案例，我們建議使用 EKS 存取政策，而非本頁所述的 Kubernetes 群組方法。EKS 存取政策提供更簡單、更加整合 AWS 的方法來管理存取，無需手動 RBAC 組態。僅當您需要比 EKS 存取政策提供更精細的控制時，才使用 Kubernetes 群組方法。

## 概觀
<a name="_overview"></a>

存取項目定義了 IAM 身分 (使用者和角色) 如何存取您的 Kubernetes 叢集。Kubernetes 群組方法透過標準 Kubernetes RBAC 群組，授予 IAM 使用者或角色存取 EKS 叢集的許可。此方法需建立並管理 Kubernetes RBAC 資源 (Role、RoleBinding、ClusterRole 及 ClusterRoleBinding)，建議在下列情境使用：需要高度自訂的許可集合、有複雜的授權需求，或希望在混合式 Kubernetes 環境中維持一致的存取控制模式。

本主題不涵蓋為「用於讓 Amazon EC2 執行個體加入 EKS 叢集」的 IAM 身分建立存取項目。

## 先決條件
<a name="_prerequisites"></a>
+ 您的叢集*身分驗證模式*必須設定為啟用*存取項目*。如需詳細資訊，請參閱 [變更驗證模式以使用存取項目](setting-up-access-entries.md)。
+ 依據《AWS 命令列介面使用者指南》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)內容所述，安裝與設定 AWS CLI。
+ 建議熟悉 Kubernetes RBAC。如需詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。

## 步驟 1：定義存取項目
<a name="k8s-group-s1"></a>

1. 尋找您要授予許可的 IAM 身分的 ARN，如使用者或角色。
   + 每個 IAM 身分只能有一個 EKS 存取項目。

1. 決定要與此 IAM 身分建立關聯的 Kubernetes 群組。
   + 您將需要建立或使用現有的 Kubernetes `Role`/`ClusterRole` 和 `RoleBinding`/`ClusterRoleBinding` 資源，這些資源需引用這些群組。

1. 判斷自動產生的使用者名稱是否適合該存取項目，或者您是否需要手動指定使用者名稱。
   +  AWS 會根據 IAM 身分自動產生此值。您可設定自訂使用者名稱。這在 Kubernetes 日誌中可見。
   + 如需詳細資訊，請參閱 [針對 EKS 存取項目設定自訂使用者名稱](set-custom-username.md)。

## 步驟 2：使用 Kubernetes 群組建立存取項目
<a name="k8s-group-s2"></a>

規劃存取項目之後，使用 AWS CLI 以適當的 Kubernetes 群組建立該項目。

```
aws eks create-access-entry --cluster-name <cluster-name> --principal-arn <iam-identity-arn> --type STANDARD --kubernetes-groups <groups>
```

取代：
+  `<cluster-name>` 為您的 EKS 叢集名稱
+  `<iam-identity-arn>` 為 IAM 使用者或角色的 ARN
+  `<groups>` 為以逗號分隔的 Kubernetes 群組清單 (例如 "system:developers,system:readers")

 [檢視全部組態選項的 CLI 參考](https://docs.aws.amazon.com/cli/latest/reference/eks/create-access-entry.html)。

## 步驟 3：設定 Kubernetes RBAC
<a name="_step_3_configure_kubernetes_rbac"></a>

為了讓 IAM 主體能夠存取您叢集上的 Kubernetes 物件，您必須建立和管理 Kubernetes 角色型存取控制 (RBAC) 物件：

1. 建立定義許可的 Kubernetes `Role` 或 `ClusterRole` 物件。

1. 在您的叢集上建立 Kubernetes `RoleBinding` 或 `ClusterRoleBinding` 物件，並將群組名稱指定為 `kind: Group` 的 `subject`。

有關在 Kubernetes 中設定群組和許可的詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。

## 後續步驟
<a name="_next_steps"></a>
+  [建立 kubeconfig，以便您可以將 kubectl 與 IAM 身分搭配使用](create-kubeconfig.md) 

# 透過 ConfigMap 授予 IAM 使用者存取 Kubernetes 的權限
<a name="auth-configmap"></a>

**重要**  
`aws-auth ConfigMap` 已棄用。如需管理 Kubernetes API 存取權的建議方法，請參閱 [使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md)。

[適用於 Kubernetes 的AWS IAM 驗證器](https://github.com/kubernetes-sigs/aws-iam-authenticator#readme)在 Amazon EKS 控制平面上執行，可以使用 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)啟用對叢集的存取權。驗證器會從 `aws-auth` `ConfigMap` 獲得其組態資訊。如需所有 `aws-auth` `ConfigMap` 設定的詳細資訊，請參閱 GitHub 上的[完整組態格式](https://github.com/kubernetes-sigs/aws-iam-authenticator#full-configuration-format)。

## 將 IAM 主體新增至 Amazon EKS 叢集
<a name="aws-auth-users"></a>

當您建立 Amazon EKS 叢集時，建立該叢集的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)會由 Amazon EKS 控制平面中叢集的角色型存取控制 (RBAC) 組態來自動授予 `system:masters` 許可。此主體不會出現在任何可見的組態中，因此請務必記下最初建立叢集的主體。若要賦予其他 IAM 主體與叢集互動的能力，您必須編輯 Kubernetes 中的 `aws-auth ConfigMap` 並用 `group` 的名稱建立一個 Kubernetes `rolebinding` 或 `clusterrolebinding`，其名稱是您在 `aws-auth ConfigMap` 中指定的名稱。

**注意**  
如需有關 Kubernetes 角色型存取控制 (RBAC) 組態的詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。

1. 判斷 `kubectl` 正使用哪些憑證來存取叢集。您可以在電腦上透過一下命令查看 `kubectl` 正在使用的憑證。如果不使用預設路徑，則使用 `kubeconfig` 檔案的路徑取代 *\$1/.kube/config–*。

   ```
   cat ~/.kube/config
   ```

   範例輸出如下。

   ```
   [...]
   contexts:
   - context:
       cluster: my-cluster.region-code.eksctl.io
       user: admin@my-cluster.region-code.eksctl.io
     name: admin@my-cluster.region-code.eksctl.io
   current-context: admin@my-cluster.region-code.eksctl.io
   [...]
   ```

   在前述範例輸出中，已針對名為 *my-cluster* 的叢集設定名為 *admin* 的使用者的憑證。若該叢集是由這名使用者建立，則其已擁有您叢集的存取權。若叢集不是由此使用者建立，則您需要完成剩餘的步驟，才能為其他 IAM 主體啟用叢集存取權。[IAM 最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)建議您將許可授予角色而非使用者。您可以使用以下命令查看目前哪些其他主體可以存取您的叢集：

   ```
   kubectl describe -n kube-system configmap/aws-auth
   ```

   範例輸出如下。

   ```
   Name:         aws-auth
   Namespace:    kube-system
   Labels:       <none>
   Annotations:  <none>
   
   Data
   ====
   mapRoles:
   ----
   - groups:
     - system:bootstrappers
     - system:nodes
     rolearn: arn:aws: iam::111122223333:role/my-node-role
     username: system:node:{{EC2PrivateDNSName}}
   
   
   BinaryData
   ====
   
   Events:  <none>
   ```

   上一個範例是預設的 `aws-auth` `ConfigMap`。只有節點執行個體角色有權存取叢集。

1. 請確定您現有的 Kubernetes `roles` 和 `rolebindings` 或 `clusterroles` 和 `clusterrolebindings` (您可以將 IAM 主體映射至此)。如需有關這些資源的詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。

   1. 檢視您現有的 Kubernetes `roles` 或 `clusterroles`。`Roles` 的作用域為 `namespace`，但 `clusterroles` 的作用域限定為叢集。

      ```
      kubectl get roles -A
      ```

      ```
      kubectl get clusterroles
      ```

   1. 檢視先前輸出中傳回的任何 `role` 或 `clusterrole` 的詳細資訊，並確認其具有您希望 IAM 主體在叢集中擁有的許可 (`rules`)。

      將 *role-name* 取代為上一個命令的輸出中傳回的 `role` 名稱。將 *kube-system* 取代為 `role` 的命名空間。

      ```
      kubectl describe role role-name -n kube-system
      ```

      將 *cluster-role-name* 取代為上一個命令的輸出中傳回的 `clusterrole` 名稱。

      ```
      kubectl describe clusterrole cluster-role-name
      ```

   1. 檢視您現有的 Kubernetes `rolebindings` 或 `clusterrolebindings`。`Rolebindings` 的作用域為 `namespace`，但 `clusterrolebindings` 的作用域限定為叢集。

      ```
      kubectl get rolebindings -A
      ```

      ```
      kubectl get clusterrolebindings
      ```

   1. 檢視任何 `rolebinding` 或 `clusterrolebinding` 的詳細資訊，並確認其具有上一步中列為 `roleRef` 的 `role` 或 `clusterrole`，以及為 `subjects` 列出的群組名稱。

      將 *role-binding-name* 取代為上一個命令的輸出中傳回的 `rolebinding` 名稱。將 *kube-system* 取代為 `rolebinding` 的 `namespace`。

      ```
      kubectl describe rolebinding role-binding-name -n kube-system
      ```

      範例輸出如下。

      ```
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: eks-console-dashboard-restricted-access-role-binding
        namespace: default
      subjects:
      - kind: Group
        name: eks-console-dashboard-restricted-access-group
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: Role
        name: eks-console-dashboard-restricted-access-role
        apiGroup: rbac.authorization.k8s.io
      ```

      將 *cluster-role-binding-name* 取代為上一個命令的輸出中傳回的 `clusterrolebinding` 名稱。

      ```
      kubectl describe clusterrolebinding cluster-role-binding-name
      ```

      範例輸出如下。

      ```
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: eks-console-dashboard-full-access-binding
      subjects:
      - kind: Group
        name: eks-console-dashboard-full-access-group
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: ClusterRole
        name: eks-console-dashboard-full-access-clusterrole
        apiGroup: rbac.authorization.k8s.io
      ```

1. 編輯 `aws-auth` `ConfigMap`。您可以使用例如 `eksctl` 的工具來更新 `ConfigMap`，或者您可以透過編輯來手動更新它。
**重要**  
我們建議您使用 `eksctl` 或其他工具來編輯 `ConfigMap`。如需有關您可使用的其他工具的資訊，請參閱《Amazon EKS 最佳實務指南》中的[使用工具對 aws-authConfigMap 進行變更](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#use-tools-to-make-changes-to-the-aws-auth-configmap)。格式錯誤的 `aws-auth` `ConfigMap`可能會導致您失去叢集存取權。
   + 檢視[使用 eksctl 編輯 configmap](#configmap-eksctl) 的步驟。
   + 檢視[手動編輯 configmap ma](#configmap-manual) 的步驟。

### 使用 Eksctl 編輯 Configmap
<a name="configmap-eksctl"></a>

1. 您需要在裝置`0.215.0`或 AWS CloudShell 上安裝版本 或更新版本的`eksctl`命令列工具。如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的[安裝](https://eksctl.io/installation)一節。

1. 在 `ConfigMap` 檢視目前的映射項目。使用您叢集的名稱取代 *my-cluster*。將 *region-code* 取代為您的叢集所在的 AWS 區域。

   ```
   eksctl get iamidentitymapping --cluster my-cluster --region=region-code
   ```

   範例輸出如下。

   ```
   ARN                                                                                             USERNAME                                GROUPS                          ACCOUNT
   arn:aws: iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA    system:node:{{EC2PrivateDNSName}}       system:bootstrappers,system:nodes
   ```

1. 為角色新增映射項目。將 *my-group* 取代為您的角色名稱。將 *eks-console-dashboard-full-access-group* 取代為您的 Kubernetes `RoleBinding` 或 `ClusterRoleBinding` 物件中指定的群組名稱。使用您的帳戶 ID 取代 *111122223333*。您可以將 *admin* 取代為您選擇的任何名稱。

   ```
   eksctl create iamidentitymapping --cluster my-cluster --region=region-code \
       --arn arn:aws: iam::111122223333:role/my-role --username admin --group eks-console-dashboard-full-access-group \
       --no-duplicate-arns
   ```
**重要**  
角色 ARN 不能包含例如 `role/my-team/developers/my-role` 的路徑。ARN 的格式必須是 ` arn:aws: iam::111122223333:role/my-role `。在此範例中，需移除 `my-team/developers/`。

   範例輸出如下。

   ```
   [...]
   2022-05-09 14:51:20 [ℹ]  adding identity "{arn-aws}iam::111122223333:role/my-role" to auth ConfigMap
   ```

1. 為使用者新增映射項目。[IAM 最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)建議您將許可授予角色而非使用者。將 *my-user* 取代為您的使用者名稱。將 *eks-console-dashboard-restricted-access-group* 取代為您的 Kubernetes `RoleBinding` 或 `ClusterRoleBinding` 物件中指定的群組名稱。使用您的帳戶 ID 取代 *111122223333*。您可以將 *my-user* 取代為您選擇的任何名稱。

   ```
   eksctl create iamidentitymapping --cluster my-cluster --region=region-code \
       --arn arn:aws: iam::111122223333:user/my-user --username my-user --group eks-console-dashboard-restricted-access-group \
       --no-duplicate-arns
   ```

   範例輸出如下。

   ```
   [...]
   2022-05-09 14:53:48 [ℹ]  adding identity "arn:aws: iam::111122223333:user/my-user" to auth ConfigMap
   ```

1. 再次檢視 `ConfigMap` 中的映射項目。

   ```
   eksctl get iamidentitymapping --cluster my-cluster --region=region-code
   ```

   範例輸出如下。

   ```
   ARN                                                                                             USERNAME                                GROUPS                                  ACCOUNT
   arn:aws: iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA    system:node:{{EC2PrivateDNSName}}       system:bootstrappers,system:nodes
   arn:aws: iam::111122223333:role/admin                                                            my-role                                 eks-console-dashboard-full-access-group
   arn:aws: iam::111122223333:user/my-user                                                          my-user                                 eks-console-dashboard-restricted-access-group
   ```

### 手動編輯 Configmap
<a name="configmap-manual"></a>

1. 開啟 `ConfigMap` 進行編輯。

   ```
   kubectl edit -n kube-system configmap/aws-auth
   ```
**注意**  
若您收到錯誤訊息，指出「`Error from server (NotFound): configmaps "aws-auth" not found`」，請使用[將 aws-auth   ConfigMap 套用至您的叢集](#aws-auth-configmap)中的程序套用庫存 `ConfigMap`。

1. 將您的 IAM 主體新增至 `ConfigMap`。IAM 群組不是 IAM 主體，因此無法新增至 `ConfigMap`。
   +  **新增 IAM 角色 (例如：為[聯合身分使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html))**：在 `data` 下位於 `ConfigMap` 中的 `mapRoles` 區段新增角色詳細資訊。若此區段在檔案不存在，則將其新增。每個項目支援以下參數：
     +  **rolearn**：要新增的 IAM 角色之 ARN。此值不能包含路徑。例如，您無法指定 ARN (如 ` arn:aws: iam::111122223333:role/my-team/developers/role-name `)。ARN 需要改為 ` arn:aws: iam::111122223333:role/role-name `。
     +  **username**：Kubernetes 內映射至 IAM 角色的使用者名稱。
     +  **群組**：要將角色映射到的 Kubernetes 群組的群組或清單。群組可以是預設群組，也可以是 `clusterrolebinding` 或 `rolebinding` 中指定的群組。如需詳細資訊，請參閱 Kubernetes 文件中的[預設角色和角色連結](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#default-roles-and-role-bindings)。
   +  **若要新增 IAM 使用者：**[IAM 最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)建議您將許可授予角色而非使用者。將使用者詳細資訊新增至 `ConfigMap` 的 `mapUsers` 區段 (在 `data` 下方)。若此區段在檔案不存在，則將其新增。每個項目支援以下參數：
     +  **userarn**：要新增之 IAM 使用者的 ARN。
     +  **username**：Kubernetes 內應設至 IAM 使用者的使用者名稱。
     +  **群組**：要將使用者映射到的 Kubernetes 群組的群組或清單。群組可以是預設群組，也可以是 `clusterrolebinding` 或 `rolebinding` 中指定的群組。如需詳細資訊，請參閱 Kubernetes 文件中的[預設角色和角色連結](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#default-roles-and-role-bindings)。

1. 例如，下列的 YAML 區塊包含：
   + `mapRoles` 區段，將 IAM 節點執行個體映射至 Kubernetes 群組，讓節點可以將自己註冊到叢集，以及 `my-console-viewer-role` IAM 角色，映射至 Kubernetes 群組，可以檢視所有叢集的所有 Kubernetes 資源。如需 `my-console-viewer-role` IAM 角色所需的 IAM 和 Kubernetes 群組許可的清單，請參閱 [所需的許可](view-kubernetes-resources.md#view-kubernetes-resources-permissions)。
   + 將 `admin` IAM 使用者從預設 AWS 帳戶映射至 `system:masters` Kubernetes 群組，以及將`my-user`使用者從映射至可檢視特定命名空間 Kubernetes 資源之 Kubernetes 群組的不同 AWS 帳戶映射的`mapUsers`區段。如需 `my-user` IAM 使用者所需的 IAM 和 Kubernetes 群組許可的清單，請參閱 [所需的許可](view-kubernetes-resources.md#view-kubernetes-resources-permissions)。

     根據需要新增或移除行，並將所有範例值取代為您自己的值。

     ```
     # Please edit the object below. Lines beginning with a '#' will be ignored,
     # and an empty file will abort the edit. If an error occurs while saving this file will be
     # reopened with the relevant failures.
     #
     apiVersion: v1
     data:
       mapRoles: |
         - groups:
           - system:bootstrappers
           - system:nodes
           rolearn: arn:aws: iam::111122223333:role/my-role
           username: system:node:{{EC2PrivateDNSName}}
         - groups:
           - eks-console-dashboard-full-access-group
           rolearn: arn:aws: iam::111122223333:role/my-console-viewer-role
           username: my-console-viewer-role
       mapUsers: |
         - groups:
           - system:masters
           userarn: arn:aws: iam::111122223333:user/admin
           username: admin
         - groups:
           - eks-console-dashboard-restricted-access-group
           userarn: arn:aws: iam::444455556666:user/my-user
           username: my-user
     ```

1. 儲存檔案並結束您的文字編輯器。

## 將 `aws-auth` `ConfigMap` 套用至您的叢集
<a name="aws-auth-configmap"></a>

在建立受管節點群組或以 `eksctl` 建立節點群組時，便會自動建立並套用 `aws-auth` `ConfigMap` 至您的叢集。最初建立的目的是要允許將節點加入您的叢集，但您也可以使用此 `ConfigMap` 來新增角色型存取控制 (RBAC) 以存取 IAM 主體。若尚未啟動自我管理節點且尚未套用 `aws-auth` `ConfigMap` 至叢集，則您可以使用以下程序來完成此操作。

1. 檢查您是否已套用 `aws-auth` `ConfigMap`。

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

   若您收到錯誤訊息，指出 "`Error from server (NotFound): configmaps "aws-auth" not found`"，請使用以下步驟的程序來套用儲存的 `ConfigMap`。

1. 下載、編輯和套用 AWS 驗證器組態映射。

   1. 下載組態對應。

      ```
      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
      ```

   1. 在 `aws-auth-cm.yaml` 檔案中，將 `rolearn` 設定至與您節點關聯的 IAM 角色之 Amazon Resource Name (ARN)。您可以使用文字編輯器來完成此操作，或者透過取代 *my-node-instance-role* 並執行下列命令：

      ```
      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml
      ```

      請勿修改此檔案中的任何其他行。
**重要**  
角色 ARN 不能包含例如 `role/my-team/developers/my-role` 的路徑。ARN 的格式必須是 ` arn:aws: iam::111122223333:role/my-role `。在此範例中，需移除 `my-team/developers/`。

      您可以檢查節點群組的 AWS CloudFormation 堆疊輸出，並尋找下列值：
      +  **InstanceRoleARN**：適用於以 `eksctl` 建立的節點群組 
      +  **NodeInstanceRole** – 適用於使用 中的 Amazon EKS vended AWS CloudFormation 範本建立的節點群組 AWS 管理主控台 

   1. 套用組態。此命令可能需要幾分鐘的時間來完成。

      ```
      kubectl apply -f aws-auth-cm.yaml
      ```
**注意**  
如果您收到任何授權或資源類型錯誤，請參閱故障診斷主題中的[未經授權或存取遭拒 (`kubectl`)](troubleshooting.md#unauthorized)。

1. 查看節點的狀態，並等待他們到達 `Ready` 狀態。

   ```
   kubectl get nodes --watch
   ```

   輸入 `Ctrl`\$1`C` 傳回 Shell 提示。

# 透過外部 OIDC 提供商授予使用者存取 Kubernetes 的權限
<a name="authenticate-oidc-identity-provider"></a>

Amazon EKS 支援使用 OpenID Connect (OIDC) 身分提供者作為向您的叢集對使用者進行身分驗證的方法。OIDC 身分提供者可以與 AWS Identity and Access Management (IAM) 搭配使用或作為替代方案。如需使用 IAM 的詳細資訊，請參閱 [授予 IAM 使用者和角色對 Kubernetes APIs存取權](grant-k8s-access.md)。設定叢集身分驗證後，您可以建立 Kubernetes `roles` 和 `clusterroles` 指派許可給角色，然後使用 Kubernetes `rolebindings` 和 `clusterrolebindings` 將角色繫結至身分。如需詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。
+ 您可以將一個 OIDC 身分提供者與叢集建立關聯。
+ Kubernetes 不提供 OIDC 身分提供者。您可以使用現有的公有 OIDC 身分提供者，也可以執行您自己的身分提供者。如需認證提供商的清單，請參閱 OpenID 網站上的 [OpenID 認證](https://openid.net/certification/)。
+ OIDC 身分提供者的發行者 URL 必須可公開存取，以便 Amazon EKS 可以探索簽署金鑰。Amazon EKS 不支援具有自我簽署憑證的 OIDC 身分提供者。
+ 您無法停用叢集上的 IAM 身分驗證器，因為將節點連接到叢集仍然需要此身分驗證器。
+ Amazon EKS 叢集仍然必須由 AWS [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)建立，而非 OIDC 身分提供者使用者。這是因為叢集建立者會與 Amazon EKS API 進行互動，而不是與 Kubernetes API 進行互動。
+ 如果控制平面的 CloudWatch Logs 已開啟，則已進行提供商身分驗證的 OIDC 身分使用者會列在叢集的稽核日誌中。如需詳細資訊，請參閱[啟用或停用控制平面日誌](control-plane-logs.md#enabling-control-plane-log-export)。
+ 您無法 AWS 管理主控台 透過 OIDC 供應商的帳戶登入 。您只能[在 中檢視 Kubernetes 資源 AWS 管理主控台](view-kubernetes-resources.md)使用 AWS Identity and Access Management AWS 管理主控台 帳戶登入 。

## 關聯 OIDC 身分提供者
<a name="associate-oidc-identity-provider"></a>

在可以將 OIDC 身分提供者與叢集建立關聯之前，您需要提供商的下列資訊：

 **發行者 URL**   
OIDC 身分提供者的 URL，可讓 API 伺服器探索用於驗證權杖的公有簽署金鑰。URL 必須以 `https://` 開頭並且應該對應至提供商之 OIDC ID 字符中的 `iss` 宣告。根據 OIDC 標準，允許路徑元件，但不允許查詢參數。通常，URL 只包含一個主機名稱，如 `https://server.example.org` 或 `https://example.com`。此 URL 應指向 `.well-known/openid-configuration` 以下的層級，必須可透過網際網路公開存取。

 **用戶端 ID (也稱為*對象*)**   
向 OIDC 身分提供者提出驗證請求的用戶端應用程式 ID。

您可以使用 `eksctl` 或 AWS 管理主控台關聯身分提供者。

### 使用 eksctl 關聯身分提供者
<a name="identity-associate-eksctl"></a>

1. 使用下列內容建立名為 `associate-identity-provider.yaml` 的檔案。使用自己的取代範例值。`identityProviders` 區段中的值是從您的 OIDC 身分提供者取得的。值僅對 `identityProviders` 下的 `name`、`type`、`issuerUrl` 和 `clientId` 設定為必要項目。

   ```
   ---
   apiVersion: eksctl.io/v1alpha5
   kind: ClusterConfig
   
   metadata:
     name: my-cluster
     region: your-region-code
   
   identityProviders:
     - name: my-provider
       type: oidc
       issuerUrl: https://example.com
       clientId: kubernetes
       usernameClaim: email
       usernamePrefix: my-username-prefix
       groupsClaim: my-claim
       groupsPrefix: my-groups-prefix
       requiredClaims:
         string: string
       tags:
         env: dev
   ```
**重要**  
請勿指定 `system:`，或該字串的任何部分，對於 `groupsPrefix` 或 `usernamePrefix`。

1. 建立供應商。

   ```
   eksctl associate identityprovider -f associate-identity-provider.yaml
   ```

1. 若要讓 `kubectl` 與叢集和 OIDC 身分提供者搭配使用，請參閱 Kubernetes 文件中的[使用 kubectl](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#using-kubectl)。

### 使用 AWS 主控台關聯身分提供者
<a name="identity-associate-console"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選取叢集，然後選取**存取**索引標籤。

1. 在 **OIDC 身分提供者**區段上，選取\$1關聯身分提供者\$1。

1. 在 **Associate OIDC Identity Provider** (關聯 OIDC 身分提供者) 頁面上，輸入或選取下列選項，然後選取 **Associate** (關聯)。
   + 對於 **Name** (名稱)，輸入提供商的唯一名稱。
   + 對於 **Issuer URL** (發行者 URL)，輸入您的提供商 URL。此 URL 必須可透過網際網路存取。
   + 對於**用戶端 ID**，輸入 OIDC 身分提供者的用戶端 ID (也稱為**受眾**)。
   + 對於 **Username claim** (使用者名稱宣告)，輸入要用作使用者名稱的宣告。
   + 對於**群組宣告**，輸入要作為使用者群組使用的宣告。
   + (選用) 選取 **Advanced options** (進階選項)，輸入或選取下列資訊。
     +  **Username prefix** (使用者名稱字首)：輸入要在使用者名稱宣告前面加上的字首。字首會加入使用者名稱宣告，以防止與現有名稱發生衝突。如果未提供值，且使用者名稱是非 `email` 的值，字首預設為 **Issuer URL** (發行者 URL) 的值。您可以使用值 ` -` 停用所有字首。請勿指定 `system:` 或該字串的任何部分。
     +  **Groups prefix** (群組字首)：輸入要在群組宣告前面加上的字首。字首會加入群組宣告，以防止與現有名稱發生衝突 (例如 ` system: groups`)。例如，值 `oidc:` 會建立群組名稱，例如 `oidc:engineering` 和 `oidc:infra`。請勿指定 `system:` 或該字串的任何部分。
     +  **Required claims** (必要宣告)：選取 **Add claim** (新增宣告)，然後在用戶端 ID 字符中輸入一或多個描述必要宣告的鍵值對。鍵值對在 ID 字符中描述了必要宣告。如果設定，則會驗證每個宣告是否存在於具有相符值的 ID 字符中。

       1. 若要讓 `kubectl` 與叢集和 OIDC 身分提供者搭配使用，請參閱 Kubernetes 文件中的[使用 kubectl](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#using-kubectl)。

## 範例 IAM 政策
<a name="oidc-identity-provider-iam-policy"></a>

如果您想要防止 OIDC 身分提供者與叢集產生關聯，請建立下列 IAM 政策並將其與 Amazon EKS 管理員的 IAM 帳戶關聯。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)和[新增 IAM 身分許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)以及《服務授權參考》中的[動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelasticcontainerserviceforkubernetes.html)。

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "denyOIDC",
            "Effect": "Deny",
            "Action": [
                "eks:AssociateIdentityProviderConfig"
            ],
            "Resource": "arn:aws:eks:us-west-2:111122223333:cluster/*"

        },
        {
            "Sid": "eksAdmin",
            "Effect": "Allow",
            "Action": [
                "eks:*"
            ],
            "Resource": "*"
        }
    ]
}
```

下列範例政策允許 OIDC 身分提供者關聯，如果 `clientID` 為 `kubernetes` 以及 `issuerUrl` 為 `https://cognito-idp.us-west-2amazonaws.com/*`。

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCognitoOnly",
            "Effect": "Deny",
            "Action": "eks:AssociateIdentityProviderConfig",
            "Resource": "arn:aws:eks:us-west-2:111122223333:cluster/my-instance",
            "Condition": {
                "StringNotLikeIfExists": {
                    "eks:issuerUrl": "https://cognito-idp.us-west-2.amazonaws.com/*"
                }
            }
        },
        {
            "Sid": "DenyOtherClients",
            "Effect": "Deny",
            "Action": "eks:AssociateIdentityProviderConfig",
            "Resource": "arn:aws:eks:us-west-2:111122223333:cluster/my-instance",
            "Condition": {
                "StringNotEquals": {
                    "eks:clientId": "kubernetes"
                }
            }
        },
        {
            "Sid": "AllowOthers",
            "Effect": "Allow",
            "Action": "eks:*",
            "Resource": "*"
        }
    ]
}
```

# 取消 OIDC 身分提供者與叢集的關聯
<a name="disassociate-oidc-identity-provider"></a>

如果您取消 OIDC 身分提供者與叢集的關聯，則提供商中包含的使用者將無法再存取叢集。不過，您仍然可以透過 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)存取叢集。

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在 **OIDC 身分提供者**區段中，選取 **Disassociate** (解除關聯)，輸入身分提供者名稱，然後選取 `Disassociate`。

# 在 中檢視 Kubernetes 資源 AWS 管理主控台
<a name="view-kubernetes-resources"></a>

您可以檢視部署至使用 AWS 管理主控台的叢集的 Kubernetes 資源。您無法使用 CLI AWS 或 [eksctl](https://eksctl.io/) 檢視 Kubernetes 資源。若要使用命令列工具檢視 Kubernetes 資源，請使用 [kubectl](install-kubectl.md)。

**注意**  
若要在 的**運算**索引標籤上檢視**資源**索引標籤和**節點**區段 AWS 管理主控台，您使用的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)必須具有特定的 IAM 和 Kubernetes 許可。如需詳細資訊，請參閱[所需的許可](#view-kubernetes-resources-permissions)。

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在 **Clusters** (叢集) 清單中，選取包含您要檢視的 Kubernetes 資源的叢集。

1. 選取 **Resources (資源)** 標籤。

1. 選取您要檢視資源的 **Resource Type** (資源類型) 群組，例如 **Workloads** (工作負載)。您可以看到該群組中的資源類型清單。

1. 選取資源類型，例如 **Workloads** (工作負載) 群組中的 **Deployments** (部署)。您可以看到資源類型的說明、一個 Kubernetes 文件連結以獲取有關資源類型的詳細資訊，以及部署在叢集上的該類型的資源列表。如果清單是空的，則不會將該類型的資源部署至您的叢集。

1. 請選取資源以檢視其詳細資訊。請試試看下列範例：
   + 選取 **Workloads** (工作負載) 群組，選取 **Deployments** (部署) 資源類型，然後選取 **coredns** 資源。當您選取資源時，依預設，您位於 **Structured view** (結構式檢視)。針對某些資源類型，您會在 **Structured view** (結構式檢視) 看到 **Pods** 區段。本區段列出由工作負載管理的 Pod。您可以選取任何列出的 Pod 來檢視關於 Pod 的資訊。並非所有資源類型都顯示於 **Structured View** (結構式檢視)。如果選擇資源頁面右上角的 **Raw view** (Raw 檢視)，您可以看到來自資源 Kubernetes API 的完整 JSON 回應。
   + 選取 **Cluster** (叢集) 群組，然後選取 **Nodes** (節點) 資源類型。您將看到叢集中所有節點的清單。節點可以是任何 [Amazon EKS 節點類型](eks-compute.md)。這個列表與您選取叢集的 **Compute** (運算) 標籤時，在 **Nodes** (節點)看到的列表為同一列表。從清單中選取節點資源。在 **Structured view** (結構式檢視) 中，您還會看到 **Pods** 區段。本區段顯示在節點上運行的所有 Pod。

## 所需的許可
<a name="view-kubernetes-resources-permissions"></a>

若要在 的**運算**索引標籤上檢視**資源**索引標籤和**節點**區段 AWS 管理主控台，您使用的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)必須具有特定的最低 IAM 和 Kubernetes 許可。您必須正確設定 IAM 和 Kubernetes RBAC 許可。完成以下步驟，將所需的許可指派給您的 IAM 主體。

1. 請確保將 `eks:AccessKubernetesApi` 和檢視 Kubernetes 資源所需的其他必要 IAM 許可指派給您正在使用的 IAM 主體。如需如何編輯 IAM 主體許可的詳細資訊，請參閱《IAM 使用者指南》中的[控制對主體的存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html#access_controlling-principals)。如需如何編輯角色許可的詳細資訊，請參閱《IAM 使用者指南》中的[變更角色許可 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-modify_permissions-policy)。

   以下範例政策包含主體欲檢視帳戶中所有叢集的 Kubernetes 資源所需必要許可。將 *111122223333* 取代為 AWS 您的帳戶 ID。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "eks:ListFargateProfiles",
                   "eks:DescribeNodegroup",
                   "eks:ListNodegroups",
                   "eks:ListUpdates",
                   "eks:AccessKubernetesApi",
                   "eks:ListAddons",
                   "eks:DescribeCluster",
                   "eks:DescribeAddonVersions",
                   "eks:ListClusters",
                   "eks:ListIdentityProviderConfigs",
                   "iam:ListRoles"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": "ssm:GetParameter",
               "Resource": "arn:aws:ssm:*:111122223333:parameter/*"
           }
       ]
   }
   ```

   若要檢視[已連線叢集](eks-connector.md)中的節點，[Amazon EKS connector IAM 角色](connector-iam-role.md)應能模擬叢集中的主體。這可讓 [Amazon EKS Connector](eks-connector.md) 將主體映射至 Kubernetes 使用者。

1. 使用 EKS 存取項目設定 Kubernetes RBAC 許可。

    **什麼是 EKS 存取項目？** 

   EKS 存取項目是授予 IAM 主體 （使用者和角色） 存取 Kubernetes 叢集的簡化方式。存取項目不會手動管理 Kubernetes RBAC 資源和 `aws-auth` ConfigMap，而是使用 提供的受管政策自動處理 IAM 和 Kubernetes 許可之間的映射 AWS。如需存取項目的詳細資訊，請參閱 [使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md)。如需可用存取政策及其許可的相關資訊，請參閱[存取政策許可](https://docs.aws.amazon.com/eks/latest/userguide/access-policy-permissions.html)。

   您可透過兩種方式將 Kubernetes 許可附加至存取項目：
   +  **使用存取政策：**存取政策是由 維護的預先定義 Kubernetes 許可範本 AWS。這些提供常見使用案例的標準化許可集。
   +  **參考 Kubernetes 群組：**如果您將 IAM 身分與 Kubernetes 群組建立關聯，您可以建立授予群組許可的 Kubernetes 資源。如需詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。

     1. 使用 CLI 為您的 IAM AWS 主體建立存取項目。使用您叢集的名稱取代 *my-cluster*。使用您的帳戶 ID 取代 *111122223333*。

        ```
        aws eks create-access-entry \
            --cluster-name my-cluster \
            --principal-arn arn:aws: iam::111122223333:role/my-console-viewer-role
        ```

        範例輸出如下。

        ```
        {
            "accessEntry": {
                "clusterName": "my-cluster",
                "principalArn": "arn:aws: iam::111122223333:role/my-console-viewer-role",
                "kubernetesGroups": [],
                "accessEntryArn": "arn:aws: eks:region-code:111122223333:access-entry/my-cluster/role/111122223333/my-console-viewer-role/abc12345-1234-1234-1234-123456789012",
                "createdAt": "2024-03-15T10:30:45.123000-07:00",
                "modifiedAt": "2024-03-15T10:30:45.123000-07:00",
                "tags": {},
                "username": "arn:aws: iam::111122223333:role/my-console-viewer-role",
                "type": "STANDARD"
            }
        }
        ```

     1. 將政策與存取項目建立關聯。若要檢視 Kubernetes 資源，請使用 `AmazonEKSViewPolicy`：

        ```
        aws eks associate-access-policy \
            --cluster-name my-cluster \
            --principal-arn arn:aws: iam::111122223333:role/my-console-viewer-role \
            --policy-arn arn:aws: eks::aws:cluster-access-policy/AmazonEKSViewPolicy \
            --access-scope type=cluster
        ```

        範例輸出如下。

        ```
        {
            "clusterName": "my-cluster",
            "principalArn": "arn:aws: iam::111122223333:role/my-console-viewer-role",
            "associatedAt": "2024-03-15T10:31:15.456000-07:00"
        }
        ```

        對於命名空間特定的存取，您可以將政策範圍限定為特定命名空間：

        ```
        aws eks associate-access-policy \
            --cluster-name my-cluster \
            --principal-arn arn:aws: iam::111122223333:role/my-console-viewer-role \
            --policy-arn arn:aws: eks::aws:cluster-access-policy/AmazonEKSViewPolicy \
            --access-scope type=namespace,namespaces=default,kube-system
        ```

     1. 確認已成功建立存取項目：

        ```
        aws eks describe-access-entry \
            --cluster-name my-cluster \
            --principal-arn arn:aws: iam::111122223333:role/my-console-viewer-role
        ```

     1. 列出相關聯的政策以確認政策關聯：

        ```
        aws eks list-associated-access-policies \
            --cluster-name my-cluster \
            --principal-arn arn:aws: iam::111122223333:role/my-console-viewer-role
        ```

        範例輸出如下。

        ```
        {
            "associatedAccessPolicies": [
                {
                    "policyArn": "arn:aws: eks::aws:cluster-access-policy/AmazonEKSViewPolicy",
                    "accessScope": {
                        "type": "cluster"
                    },
                    "associatedAt": "2024-03-15T10:31:15.456000-07:00",
                    "modifiedAt": "2024-03-15T10:31:15.456000-07:00"
                }
            ]
        }
        ```

## CloudTrail 可見性
<a name="cloudtrail-visibility"></a>

檢視 Kubernetes 資源時，您會在 CloudTrail 日誌中看到下列操作名稱：
+  `AccessKubernetesApi` - 讀取或檢視資源時

此 CloudTrail 事件提供對 Kubernetes 資源讀取存取權的稽核線索。

**注意**  
此操作名稱會出現在 CloudTrail 日誌中，僅供稽核之用。它不是 IAM 動作，無法在 IAM 政策陳述式中使用。若要透過 IAM 政策控制 Kubernetes 資源的讀取存取權，請使用 `eks:AccessKubernetesApi`許可，如 [所需的許可](#view-kubernetes-resources-permissions)一節所示。

# 授予 AWS 服務對 Kubernetes APIs寫入存取權
<a name="mutate-kubernetes-resources"></a>

## 所需的許可
<a name="mutate-kubernetes-resources-permissions"></a>

若要讓 AWS 服務在 Amazon EKS 叢集中的 Kubernetes 資源上執行寫入操作，您必須同時授予 `eks:AccessKubernetesApi`和 `eks:MutateViaKubernetesApi` IAM 許可。

例如，Amazon SageMaker HyperPod 使用這些許可從 SageMaker AI Studio 啟用模型部署。如需詳細資訊，請參閱《Amazon SageMaker AI 開發人員指南》中的[設定選用的 JavaScript SDK 許可](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-model-deployment-setup.html#sagemaker-hyperpod-model-deployment-setup-optional-js)。

**重要**  
建立、更新和刪除等寫入操作需要兩個許可，如果缺少任一許可，寫入操作將會失敗。

## CloudTrail 可見性
<a name="cloudtrail-visibility"></a>

在 Kubernetes 資源上執行寫入操作時，您會在 CloudTrail 日誌中看到特定操作名稱：
+  `createKubernetesObject` - 建立新資源時
+  `updateKubernetesObject` - 修改現有資源時
+  `deleteKubernetesObject` - 移除資源時

這些 CloudTrail 事件提供對 Kubernetes 資源所做的所有修改的詳細稽核線索。

**注意**  
這些操作名稱會出現在 CloudTrail 日誌中，僅供稽核之用。它們不是 IAM 動作，無法在 IAM 政策陳述式中使用。若要透過 IAM 政策控制對 Kubernetes 資源的寫入存取，請使用 `eks:MutateViaKubernetesApi`許可，如 [所需的許可](#mutate-kubernetes-resources-permissions)一節所示。

# 透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集
<a name="create-kubeconfig"></a>

**提示**  
 [註冊](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即將舉行的 Amazon EKS 研討會。

在本主題中，您將為您的叢集建立 `kubeconfig` 檔案 (或更新現有的檔案)。

`kubectl` 命令列工具會使用 `kubeconfig` 檔案中的組態資訊，以與叢集的 API 伺服器進行通訊。如需詳細資訊，請參閱 Kubernetes 文件中的[使用 kubeconfig 檔案組織叢集存取](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/)。

Amazon EKS 使用 `aws eks get-token` 命令搭配 `kubectl` 進行叢集身分驗證。根據預設，CLI AWS 會使用與使用下列命令傳回的相同登入資料：

```
aws sts get-caller-identity
```
+ 現有 Amazon EKS 叢集。若要部署叢集，請參閱 [開始使用 Amazon EKS](getting-started.md)。
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 Kubernetes 版本相同，或是為最多比該版本更舊一版或更新一版的次要版本。例如，如果您的叢集版本為 `1.29`，則可以搭配使用 `kubectl` `1.28`、`1.29` 或 `1.30` 版。若要安裝或升級 `kubectl`，請參閱 [設定 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 在您的裝置或 AWS CloudShell 上安裝和設定的 AWS 命令列界面 (AWS CLI) 版本 `1.27.160` `2.12.3`或更新版本。若要檢查您目前的版本，請使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 * AWS 命令列界面使用者指南*》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)在 AWS CloudShell 中安裝的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。 * AWS CloudShell *
+ 具有對您指定的叢集使用 `eks:DescribeCluster` API 動作許多的 IAM 使用者或角色。如需詳細資訊，請參閱[Amazon EKS 身分型政策範例](security-iam-id-based-policy-examples.md)。如果您使用自己的 OpenID Connect 提供商提供的身分來存取叢集，則請參閱 Kubernetes 文件中的 [Using kubectl](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#using-kubectl) 一節以了解如何建立或更新 `kube config` 檔案。

## 自動建立 `kubeconfig` 檔案
<a name="create-kubeconfig-automatically"></a>
+ 在您的裝置或 AWS CloudShell 上安裝和設定的 AWS 命令列界面 (AWS CLI) 版本 `1.27.160` `2.12.3`或更新版本。若要檢查您目前的版本，請使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 * AWS 命令列界面使用者指南*》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)在 AWS CloudShell 中安裝的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。 * AWS CloudShell *
+ 對您指定的叢集使用 `eks:DescribeCluster` API 動作的許可。如需詳細資訊，請參閱[Amazon EKS 身分型政策範例](security-iam-id-based-policy-examples.md)。

  1. 為您的叢集建立或更新 `kubeconfig` 檔案。將 *region-code* 取代為您的叢集所在的 AWS 區域，並將 *my-cluster* 取代為您的叢集名稱。

     ```
     aws eks update-kubeconfig --region region-code --name my-cluster
     ```

     根據預設，產生的組態檔案會在主目錄預設的 `kubeconfig` 路徑下 (`.kube`)，或與位在該處的現有 `config` 檔案合併。您可以使用 `--kubeconfig` 選項指定其他路徑。

     您可以使用 `--role-arn` 選項指定 IAM 角色 ARN，用於在您發出 `kubectl` 命令時進行身分驗證。否則，會使用預設 CLI 或 SDK 登入資料鏈中的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)。 AWS 您可以執行 AWS `aws sts get-caller-identity`命令來檢視預設的 CLI 或 SDK 身分。

     如需所有可用的選項，請執行 `aws eks update-kubeconfig help`命令，或參閱 * AWS CLI 命令參考*中的 [update-kubeconfig](https://docs.aws.amazon.com/cli/latest/reference/eks/update-kubeconfig.html)。

  1. 測試組態。

     ```
     kubectl get svc
     ```

     範例輸出如下。

     ```
     NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
     svc/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   1m
     ```

     如果您收到任何授權或資源類型錯誤，請參閱故障診斷主題中的[未經授權或存取遭拒 (`kubectl`)](troubleshooting.md#unauthorized)。

# 藉助 Kubernetes 服務帳戶向 AWS 授予 Kubernetes 工作負載存取權
<a name="service-accounts"></a>[管理服務帳戶](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin)[服務帳戶的 IAM 角色](iam-roles-for-service-accounts.md)[了解 EKS Pod 身分識別如何授予 AWS 服務的 Pod 存取權](pod-identities.md)

## 服務帳戶字符
<a name="service-account-tokens"></a>

在 Kubernetes 版本中預設會啟用 [BoundServiceAccountTokenVolume](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/#bound-service-account-token-volume) 功能。此功能允許在 Kubernetes 上執行的工作負載請求對象、時間和金鑰綁定的 JSON Web 字符，從而提升服務帳戶字符的安全性。服務帳戶字符的過期時間為一小時。在舊版 Kubernetes 版本中，字符沒有過期。這表示仰賴這些字符的客戶端必須在一小時內重新整理字符。以下 [Kubernetes 用戶端 SDK](https://kubernetes.io/docs/reference/using-api/client-libraries/) 會在要求的時間範圍內自動重新整理字符：
+ Go 版本 `0.15.7` 和更新版本
+ Python 版本 `12.0.0` 和更新版本
+ Java 版本 `9.0.0` 和更新版本
+ JavaScript 版本 `0.10.3` 和更新版本
+ Ruby `master` 分支
+ Haskell 版本 `0.3.0.0` 
+ C\$1 `7.0.5` 版及更新版本

如果工作負載使用較早的客戶端版本，則必須進行更新。為使客戶端順暢移轉到更新的限時服務帳戶字符，Kubernetes 對服務帳戶字符新增了超過預設的一小時的延長到期期間。針對 Amazon EKS 叢集，延長的到期期間為 90 天。您的 Amazon EKS 叢集的 Kubernetes API 伺服器拒絕超過 90 天的字符的請求。我們建議您檢查應用程式及其相依性，以確保 Kubernetes 用戶端開發套件與先前列出的版本相同或為更新版本。

當 API 服務器收到使用超過一小時的字符的請求時，它會使用 `annotations.authentication.k8s.io/stale-token` 註釋 API 稽核日誌事件。註釋的值如下範例所示：

```
subject: system:serviceaccount:common:fluent-bit, seconds after warning threshold: 4185802.
```

如果您的叢集啟用了[控制平面記錄](control-plane-logs.md)，則註釋位於稽核日誌中。您可以使用下列 [CloudWatch Logs Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html) 查詢以識別使用過時字符的 Amazon EKS 叢集中的所有 Pod：

```
fields @timestamp
|filter @logStream like /kube-apiserver-audit/
|filter @message like /seconds after warning threshold/
|parse @message "subject: *, seconds after warning threshold:*\"" as subject, elapsedtime
```

`subject` 指的是該 Pod 使用的服務帳戶。`elapsedtime` 表示讀取最新字符後的經過時間（以秒為單位）。當 `elapsedtime` 超過 90 天 (7,776,000 秒)，對 API 伺服器的請求將遭到拒絕。您應主動更新應用程式的 Kubernetes 用戶端 SDK，以使用先前列出的自動重新整理字符的版本之一。如果您使用的服務帳戶字符接近 90 天，並且沒有足夠的時間在字符過期前更新客戶端 SDK 版本，則可以終止現有 Pod 並建立新 Pod。這會導致重新擷取服務帳戶字符，進而給您額外的 90 天來更新的客戶端版本 SDK。

如果 Pod 為部署的一部分，則在維持高可用性的同時終止 Pod 的建議方法是使用以下命令執行推出。使用您的部署名稱替換 *my-deployment* (我的部署)。

```
kubectl rollout restart deployment/my-deployment
```

## 叢集附加元件
<a name="boundserviceaccounttoken-validated-add-on-versions"></a>

下列叢集附加元件已更新以使用自動重新擷取服務帳戶字符的 Kubernetes 客戶端 SDK。建議您確保已在叢集上安裝列出的版本或更新版本。
+ 適用於 Kubernetes 的 Amazon VPC CNI 外掛程式及指標輔助外掛程式 `1.8.0` 版及更新版本。若要檢查目前版本或更新版本，請參閱 [使用 Amazon VPC CNI 將 IP 指派給 Pod](managing-vpc-cni.md) 和 [cni-metrics-helper](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/cmd/cni-metrics-helper/README.md)。
+ CoreDNS `1.8.4` 版及更新版本。若要檢查目前版本或更新版本，請參閱 [在 Amazon EKS 叢集中管理 DNS 的 CoreDNS](managing-coredns.md)。
+  AWS Load Balancer 控制器 `2.0.0` 版及更新版本。若要檢查目前版本或更新版本，請參閱 [使用 AWS Load Balancer控制器路由網際網路流量](aws-load-balancer-controller.md)。
+ 目前的 `kube-proxy` 版本。若要檢查目前版本或更新版本，請參閱 [在 Amazon EKS 叢集中管理 `kube-proxy`](managing-kube-proxy.md)。
+  AWS for Fluent Bit 版本 `2.25.0` 或更新版本。若要更新您的目前版本，請參閱 GitHub 上的 [Releases](https://github.com/aws/aws-for-fluent-bit/releases) (版本)。
+ Fluentd 映像 [1.14.6-1.2](https://hub.docker.com/r/fluent/fluentd/tags?page=1&name=v1.14.6-1.2) 版或更新版本，以及適用於 Kubernetes 中繼資料的 Fluentd 篩選器外掛程式 [2.11.1](https://rubygems.org/gems/fluent-plugin-kubernetes_metadata_filter/versions/2.11.1) 版或更新版本。

## 授予 AWS Identity and Access Management 許可給 Amazon Elastic Kubernetes Service 叢集上的工作負載
<a name="service-accounts-iam"></a>

Amazon EKS 提供兩種授予 AWS Identity and Access Management 許可給在 Amazon EKS 叢集中執行的工作負載的方式：*服務帳戶的 IAM 角色*和 *EKS Pod 身分識別*。

 **服務帳戶的 IAM 角色**   
 *服務帳戶的 IAM 角色 (IRSA)* 可設定執行在 AWS 上的 Kubernetes 應用程式，使用精細的 IAM 許可來存取各種其他 AWS 資源，例如 Amazon S3 儲存貯體、Amazon DynamoDB 資料表等等。您可以在同一個 Amazon EKS 叢集中同時執行多個應用程式，並確保每個應用程式只有其所需的最低許可集。IRSA 是為了支援各種 Kubernetes 部署選項而建置，這些選項均受到 AWS 的支援，例如 Amazon EKS、Amazon EKS Anywhere、Red Hat OpenShift Service on AWS 和 Amazon EC2 執行個體上的自我管理 Kubernetes 叢集。因此，IRSA 是使用基礎 AWS 服務 (例如 IAM) 所建置，不會對 Amazon EKS 服務和 EKS API 產生任何直接相依性。如需詳細資訊，請參閱 [服務帳戶的 IAM 角色](iam-roles-for-service-accounts.md)。

 **EKS Pod 身分識別**   
EKS Pod 身分識別為叢集管理員提供簡化的工作流程，以驗證應用程式來存取各種其他 AWS 資源，例如 Amazon S3 儲存貯體、Amazon DynamoDB 資料表等等。EKS Pod 身分識別僅適用於 EKS，因此可簡化叢集管理員設定 Kubernetes 應用程式以取得 IAM 許可的方式。現在可以直接透過 AWS 管理主控台、EKS API 和 AWS CLI 以較少的步驟輕鬆設定這些許可，而且在任何 Kubernetes 物件中都不需要在叢集內採取任何動作。叢集管理員不需要在 EKS 和 IAM 服務之間切換，也不需要使用特殊權限 IAM 操作來設定應用程式所需的許可。IAM 角色現在可跨多個叢集使用，無需在建立新叢集時更新角色信任政策。EKS Pod 身分識別提供的 IAM 憑證包含角色工作階段標籤，並具有叢集名稱、命名空間、服務帳戶名稱等屬性。角色工作階段標籤可讓管理員編寫可跨服務帳戶使用的單一角色，方法是允許根據相符標籤存取 AWS 資源。如需詳細資訊，請參閱 [了解 EKS Pod 身分識別如何授予 AWS 服務的 Pod 存取權](pod-identities.md)。

### 比較 EKS Pod 身分識別和 IRSA
<a name="service-accounts-iam-compare"></a>

整體上來說，EKS Pod 身分識別和 IRSA 都可讓您將 IAM 許可授予在 Kubernetes 叢集上執行的應用程式。但是，它們在設定方式、支援的限制和啟用的功能完全不同。下面，我們比較兩種解決方案的一些關鍵面向。

**注意**  
 AWS 建議儘可能使用 EKS Pod 身分識別，向 Pod 授予對 AWS 資源的存取權。如需詳細資訊，請參閱 [了解 EKS Pod 身分識別如何授予 AWS 服務的 Pod 存取權](pod-identities.md)。


| 屬性 | EKS Pod 身分識別 | IRSA | 
| --- | --- | --- | 
|  角色擴充性  |  您必須設定每個角色一次，才能與新推出的 Amazon EKS 服務主體 `pods.eks.amazonaws.com` 建立信任。完成此一次性步驟之後，您不需要每次在新叢集中使用角色的信任政策時更新該政策。  |  每次要在新叢集中使用 IAM 角色時，您都必須使用新的 EKS 叢集 OIDC 提供者端點更新該角色的信任政策。  | 
|  叢集可擴展性  |  EKS Pod 身分識別不需要使用者設定 IAM OIDC 提供者，因此不適用此限制。  |  每個 EKS 叢集具有與其相關聯的 OpenID Connect (OIDC) 發行者 URL。若要使用 IRSA，則必須為 IAM 中的每個 EKS 叢集建立唯一的 OpenID Connect 提供者。IAM 的預設全域限制為每個 AWS 帳戶 100 個 OIDC 提供者。如果您計劃每個具有 IRSA 的 AWS 帳戶都有超過 100 個 EKS 叢集，則您會達到 IAM OIDC 提供者限制。  | 
|  角色可擴展性  |  EKS Pod 身分識別不需要使用者在信任政策中定義 IAM 角色和服務帳戶之間的信任關係，因此不適用此限制。  |  在 IRSA 中，您可以在角色的信任政策中定義 IAM 角色和服務帳戶之間的信任關係。根據預設，信任政策大小的長度為 `2048`。這表示您通常可以在單一信任政策中定義 4 個信任關係。雖然您可以提高信任政策長度限制，但在單一信任政策中，您通常只能使用最多 8 個信任關係。  | 
|  STS API 配額用量  |  EKS Pod 身分識別能簡化交付 AWS 憑證至 Pod 的程序，並且無須程式碼透過 AWS Security Token Service (STS) 直接呼叫。EKS 服務可處理角色擔任，無須 Pod 與 AWS STS 通訊或使用 STS API 配額，即可交付憑證至使用 Pod 中的 AWS SDK 撰寫的應用程式。  |  在 IRSA 中，使用 Pod 中的 AWS SDK 撰寫的應用程式，藉助記號來呼叫 AWS Security Token Service (STS) 上的 `AssumeRoleWithWebIdentity` API。視乎 AWS SDK 程式碼的邏輯，程式碼可能會對 AWS STS 做出不必要的呼叫及接收限流錯誤。  | 
|  角色可重複使用性  |   EKS Pod 身分識別提供的 AWS STS 臨時憑證包含角色工作階段標籤，例如叢集名稱、命名空間、服務帳戶名稱。角色工作階段標籤可讓管理員編寫可搭配多個服務帳戶使用的單一 IAM 角色，並具有不同的有效許可，方法是允許根據連接至它們的標籤存取 AWS 資源。這也稱為屬性型存取控制 (ABAC)。如需詳細資訊，請參閱 [根據標籤授予 Pod 對 AWS 資源的存取權](pod-id-abac.md)。  |   AWS STS 工作階段標籤不受支援。您可以在叢集之間重複使用角色，但是每個 Pod 都會收到該角色的所有許可。  | 
|  支援的環境  |  EKS Pod 身分識別僅適用於 Amazon EKS。  |  IRSA 可用於 Amazon EKS、Amazon EKS Anywhere、Red Hat OpenShift Service on AWS，以及 Amazon EC2 執行個體上的自我管理 Kubernetes 叢集。  | 
|  支援 EKS 版本  |  所有支援的 EKS 叢集版本。如需特定平台版本，請參閱 [EKS Pod 身分識別叢集版本](pod-identities.md#pod-id-cluster-versions)。  |  所有支援的 EKS 叢集版本。  | 

# 服務帳戶的 IAM 角色
<a name="iam-roles-for-service-accounts"></a>

**提示**  
 [註冊](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即將舉行的 Amazon EKS 研討會。

Pod 容器中的應用程式可以使用 AWS SDK 或 AWS CLI，使用 AWS Identity and Access Management (IAM) 許可向 AWS 服務提出 API 請求。應用程式必須使用 AWS 登入資料簽署其 AWS API 請求。**服務帳戶的 IAM 角色 (IRSA)** 提供管理應用程式憑證的功能，類似 Amazon EC2 執行個體設定檔將憑證提供給 Amazon EC2 執行個體的方式。您可以將 IAM 角色與 Kubernetes 服務帳戶建立關聯，並將 Pod 設定為使用服務帳戶，而不是建立 AWS 登入資料並將其分發至容器或使用 Amazon EC2 執行個體的 角色。您無法將 IAM 角色用於具有 [Amazon EKS on AWS Outposts 本機叢集](eks-outposts-local-cluster-overview.md)的服務帳戶。

服務帳戶的 IAM 角色提供下列優點：
+  **最低權限**：您可以將 IAM 許可範圍限定為服務帳戶，只有使用該服務帳戶的 Pod 才能存取這些許可。有此功能也就不需要第三方解決方案，例如 `kiam` 或 `kube2iam`。
+  **憑證隔離**：若 [Amazon EC2 執行個體中繼資料服務 (IMDS)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html) 存取權受限，Pod 的容器僅可擷取與容器所用服務帳戶關聯的 IAM 角色憑證。容器一律無法存取其他 Pod 中其他容器使用的憑證。若 IMDS 不受限制，Pod 的容器亦可存取 [Amazon EKS 節點 IAM 角色](create-node-role.md)，且容器或許能存取相同節點上其他 Pod 的 IAM 角色的憑證。如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://docs.aws.amazon.com/eks/latest/best-practices/identity-and-access-management.html#_identities_and_credentials_for_eks_pods_recommendations)。

**注意**  
使用 設定的 Pod `hostNetwork: true` 一律具有 IMDS 存取權，但啟用時， AWS SDKs和 CLI 將使用 IRSA 登入資料。
+  可**稽核性** – 可透過 AWS CloudTrail 存取和事件記錄，以協助確保回溯性稽核。

**重要**  
容器並非安全邊界，而且使用服務帳戶的 IAM 角色亦不會對此有所變更。若 Pod 指派到相同的節點，將會分享核心及可能的其他資源，具體取決於 Pod 組態。儘管執行於單獨節點上的 Pod 將會在運算層隔離，但有些節點應用程式在 Kubernetes API 中擁有超出個別執行個體範圍的額外許可。部分範例包括 `kubelet`、`kube-proxy`、CSI 儲存驅動程式，或者您本人的 Kubernetes 應用程式。

完成下列程序，為服務帳戶啟用 IAM 角色：

1.  [為叢集建立 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)：對於每個叢集，您只需完成一次本程序。
**注意**  
如果您已啟用 EKS VPC 端點，則無法從該 VPC 內部存取 EKS OIDC 服務端點。因此，您的作業 (例如在 VPC 利用 `eksctl` 建立 OIDC 提供者) 將無法運作，並且當嘗試請求 `https://oidc.eks.region.amazonaws.com` 時，會導致逾時。以下是範例錯誤訊息：  

   ```
   server cant find oidc.eks.region.amazonaws.com: NXDOMAIN
   ```
若要完成此步驟，您可以在 VPC 外部執行 命令，例如 in AWS CloudShell 或連接至網際網路的電腦。或者，您可以在 VPC 中建立水平分割條件式解析程式，例如 Route 53 Resolver，以針對 OIDC 發行者 URL 使用不同的解析程式，而不為其使用 VPC DNS。如需 CoreDNS 中條件式轉送的範例，請參閱 GitHub 上的 [Amazon EKS 功能請求](https://github.com/aws/containers-roadmap/issues/2038)。

1.  [將 IAM 角色指派給 Kubernetes Service 帳戶](associate-service-account-role.md)：對您希望應用程式擁有的每種非重複可組合完成此程序。

1.  [將 Pod 設定為使用 Kubernetes 服務帳戶](pod-configuration.md) – 為每個需要存取 AWS 服務的 Pod 完成此程序。

1.  [搭配 AWS SDK 使用 IRSA](iam-roles-for-service-accounts-minimum-sdk.md) – 確認工作負載使用支援版本的 AWS SDK，以及工作負載使用預設登入資料鏈。

## IAM, Kubernetes 和 OpenID Connect (OIDC) 背景資訊
<a name="irsa-oidc-background"></a>

在 2014 年， AWS Identity and Access Management 新增了對使用 OpenID Connect (OIDC) 的聯合身分的支援。此功能可讓您向支援的身分提供者驗證 AWS API 呼叫，並接收有效的 OIDC JSON Web 字符 (JWT)。您可以將此權杖傳遞至 AWS STS `AssumeRoleWithWebIdentity` API 操作，並接收 IAM 臨時角色登入資料。您可以使用這些登入資料與任何 AWS 服務互動，包括 Amazon S3 和 DynamoDB。

每個 JWT 權杖均由一個簽署金鑰對簽署。這些金鑰是由 Amazon EKS 管理的 OIDC 供應商提供服務，且私有金鑰每 7 天就會輪換一次。Amazon EKS 會保留公有金鑰，直到它們過期為止。如果您連接外部 OIDC 用戶端，請注意，您必須在公有金鑰到期之前重新整理簽署金鑰。了解如何[擷取簽署金鑰以驗證 OIDC 權杖](irsa-fetch-keys.md)。

Kubernetes 長期以來使用服務帳戶作為自己的內部身分系統。Pod 可以使用只有 Kubernetes API 伺服器可以驗證的自動掛載字符 (非 OIDC JWT)，向 Kubernetes API 伺服器進行驗證。這些舊的服務帳戶字符不會過期，而輪換簽署金鑰是一項困難的程序。Kubernetes 版本 `1.12` 進一步支援新的 `ProjectedServiceAccountToken` 功能。此功能是 OIDC JSON Web 字符，同時包含服務帳戶身分，並支援可設定的對象。

Amazon EKS 為每個叢集託管公有 OIDC 探索端點，其中包含 `ProjectedServiceAccountToken` JSON Web 字符的簽署金鑰，讓外部系統 (例如 IAM) 可以驗證和接受 Kubernetes 發出的 OIDC 字符。

# 為您的叢集建立 IAM OIDC 身分提供者
<a name="enable-iam-roles-for-service-accounts"></a>

您的叢集具有與其相關聯的 [OpenID Connect](https://openid.net/connect/) (OIDC) 發行者 URL。若要針對服務帳戶使用 AWS Identity and Access Management (IAM) 角色，叢集的 OIDC 發行者 URL 必須存在 IAM OIDC 供應商。

## 先決條件
<a name="_prerequisites"></a>
+ 現有 Amazon EKS 叢集。若要部署叢集，請參閱 [開始使用 Amazon EKS](getting-started.md)。
+ 在您的裝置或 AWS CloudShell 上安裝和設定的 AWS 命令列界面 (AWS CLI) 版本 `1.27.160` `2.12.3`或更新版本。若要檢查您目前的版本，請使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 * AWS 命令列界面使用者指南*》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)在 AWS CloudShell 中安裝的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。 * AWS CloudShell *
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 Kubernetes 版本相同，或是為最多比該版本更舊一版或更新一版的次要版本。例如，如果您的叢集版本為 `1.29`，則可以搭配使用 `kubectl` `1.28`、`1.29` 或 `1.30` 版。若要安裝或升級 `kubectl`，請參閱 [設定 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含叢集組態的現有 `kubectl` `config` 檔案。若要建立 `kubectl` `config` 檔案，請參閱[透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集](create-kubeconfig.md)。

您可以使用 `eksctl` 或 AWS 管理主控台為叢集建立 IAM OIDC 提供商。

## 建立 OIDC 提供商 (eksctl)
<a name="_create_oidc_provider_eksctl"></a>

1. 裝置或 AWS CloudShell 上安裝的`eksctl`命令列工具版本 `0.215.0`或更新版本。如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的[安裝](https://eksctl.io/installation)一節。

1. 確定叢集的 OIDC 發行者 ID。

   擷取叢集的 OIDC 發行者 ID 並將其存放在變數中。使用您自己的值取代 `<my-cluster>`。

   ```
   cluster_name=<my-cluster>
   oidc_id=$(aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
   echo $oidc_id
   ```

1. 判斷您的帳戶中是否已經有擁有叢集發行者 ID 的 IAM OIDC 提供商。

   ```
   aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
   ```

   如果有輸出傳回，則表示您已經有叢集 IAM OIDC 提供商，且可以略過下一步驟。如果未傳回任何輸出，則您必須為叢集建立 IAM OIDC 提供商。

1. 使用下列命令為您的叢集建立 IAM OIDC 身分提供者。

   ```
   eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve
   ```
**注意**  
如果您已啟用 EKS VPC 端點，則無法從該 VPC 內部存取 EKS OIDC 服務端點。因此，您的作業 (例如在 VPC 利用 `eksctl` 建立 OIDC 提供商) 將無法運作，並且會導致逾時。以下是範例錯誤訊息：  

   ```
   ** server cant find oidc.eks.<region-code>.amazonaws.com: NXDOMAIN
   ```

   若要完成此步驟，您可以在 VPC 外部執行 命令，例如 in AWS CloudShell 或連接至網際網路的電腦。或者，您可以在 VPC 中建立水平分割條件式解析程式，例如 Route 53 Resolver，以針對 OIDC 發行者 URL 使用不同的解析程式，而不為其使用 VPC DNS。如需 CoreDNS 中條件式轉送的範例，請參閱 GitHub 上的 [Amazon EKS 功能請求](https://github.com/aws/containers-roadmap/issues/2038)。

## 建立 OIDC 供應商AWS （主控台）
<a name="create_oidc_provider_shared_aws_console"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左側窗格中，選取 **Clusters** (叢集)，然後在 **Clusters** (叢集) 頁面上選取您的叢集名稱。

1. 在 **Overview** (概觀) 標籤的 **Details** (詳細資訊) 區段中，記下 **OpenID Connect provider URL** (OpenID Connect 供應商 URL) 的值。

1. 前往 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

1. 在左側導覽窗格中，選擇 **Access management** (存取管理) 下的 **Identity Providers** (身分提供者)。如果列出的**提供商**與您叢集的 URL 相符，則表示您已經擁有叢集提供商。如果沒有列出符合叢集 URL 的提供商，則您必須建立一個。

1. 若要建立供應商，請選擇 **Add provider** (新增供應商)。

1. 對於**提供商類型**，選取 **OpenID Connect**。

1. 對於 **Provider URL** (提供商 URL)，輸入叢集的 OIDC 提供商 URL。

1. 對於 **Audience** (對象)，輸入 `sts.amazonaws.com`。

1. (選用) 新增任何標籤，例如可識別適用於此提供商的叢集的標籤。

1. 選擇 **Add provider** (新增提供者)。

後續步驟：[將 IAM 角色指派給 Kubernetes 服務帳戶](associate-service-account-role.md)

# 將 IAM 角色指派給 Kubernetes 服務帳戶
<a name="associate-service-account-role"></a>

本主題說明如何設定 Kubernetes 服務帳戶以擔任 AWS Identity and Access Management (IAM) 角色。然後，任何設定為使用服務帳戶的 Pod 都可以存取該角色有權存取的任何 AWS 服務。

## 先決條件
<a name="_prerequisites"></a>
+ 現有的叢集。如果您沒有，則可以按照其中一個 [開始使用 Amazon EKS](getting-started.md) 指南來建立。
+ 叢集的現有 IAM OpenID Connect (OIDC) 提供商。若要了解是否已經擁有，或是了解如何建立，請參閱[為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。
+ 裝置`2.12.3`或 AWS CloudShell 上安裝和設定的 AWS 命令列界面 (AWS CLI) 版本 `1.27.160` 或更新版本。若要檢查您目前的版本，請使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 * AWS 命令列界面使用者指南*》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)安裝在 AWS CloudShell 中的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。 * AWS CloudShell *
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 Kubernetes 版本相同，或是為最多比該版本更舊一版或更新一版的次要版本。例如，如果您的叢集版本為 `1.29`，則可以搭配使用 `kubectl` `1.28`、`1.29` 或 `1.30` 版。若要安裝或升級 `kubectl`，請參閱 [設定 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含叢集組態的現有 `kubectl` `config` 檔案。若要建立 `kubectl` `config` 檔案，請參閱[透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集](create-kubeconfig.md)。

## 步驟 1：建立 IAM 政策
<a name="irsa-associate-role-procedure"></a>

如果您要將現有 IAM 政策與 IAM 角色建立關聯，請跳到下一步驟。

1. 建立 IAM 政策。您可以建立自己的政策，或複製已授予部分所需許可的 AWS 受管政策，並根據您的特定需求進行自訂。如需詳細資訊，請參閱「IAM 使用者指南」**中的[建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

1. 建立檔案，其中包含您希望 Pod 存取 AWS 之服務的許可。如需所有 AWS 服務的所有動作清單，請參閱[服務授權參考](https://docs.aws.amazon.com/service-authorization/latest/reference/)。

   您可以執行以下命令來建立允許唯讀存取 Amazon S3 儲存貯體的範例政策檔案。您可以選擇性地將組態資訊或引導指令碼存放在此儲存貯體中，而 Pod 中的容器可從儲存貯體讀取檔案，並載入至您的應用程式。如果您要建立此範例政策，請將以下內容複製到您的裝置。將 *my-pod-secrets-bucket* 取代為您的儲存貯體名稱並執行命令。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
           }
       ]
   }
   ```

1. 建立 IAM 政策。

   ```
   aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
   ```

## 步驟 2：建立並關聯 IAM 角色
<a name="_step_2_create_and_associate_iam_role"></a>

建立 IAM 角色並與 Kubernetes 服務帳戶建立關聯。您可以使用 `eksctl`或 AWS CLI。

### 建立並關聯角色 (eksctl)
<a name="_create_and_associate_role_eksctl"></a>

此 `eksctl` 命令會在指定的命名空間中建立 Kubernetes 服務帳戶、建立具有指定名稱的 IAM 角色 (若不存在)、將現有的 IAM 政策 ARN 附加至該角色，並以 IAM 角色 ARN 註釋服務帳戶。請務必將此命令中的範例預留位置值取代為您的特定值。如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的[安裝](https://eksctl.io/installation)一節。

```
eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \
    --attach-policy-arn arn:aws: iam::111122223333:policy/my-policy --approve
```

**重要**  
如果角色或服務帳戶已經存在，上一個命令可能會失敗。您可以為 `eksctl` 提供在這些情況下的不同選項。如需詳細資訊，請執行 `eksctl create iamserviceaccount --help`。

### 建立角色並建立關聯 (AWS CLI)
<a name="create_and_associate_role_shared_aws_cli"></a>

如果您有要擔任 IAM 角色的現有 Kubernetes 服務帳戶，則可略過此步驟。

1. 建立 Kubernetes 服務帳戶。將以下內容複製到您的裝置。視需要將 *my-service-account* 取代為您要使用的名稱，將 *default* 取代為其他命名空間。如果您變更 *default*，命名空間必須已經存在。

   ```
   cat >my-service-account.yaml <<EOF
   apiVersion: v1
   kind: ServiceAccount
   metadata:
     name: my-service-account
     namespace: default
   EOF
   kubectl apply -f my-service-account.yaml
   ```

1. 使用下列命令將 AWS 您的帳戶 ID 設定為 環境變數。

   ```
   account_id=$(aws sts get-caller-identity --query "Account" --output text)
   ```

1. 使用下列命令將叢集的 OIDC 身分提供者設定為環境變數。使用您叢集的名稱取代 *my-cluster*。

   ```
   oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
   ```

1. 設定命名空間和服務帳戶名稱的變數。將 *my-service-account* 取代為要擔任角色的 Kubernetes 服務帳戶。將 *default* 取代為服務帳戶的命名空間。

   ```
   export namespace=default
   export service_account=my-service-account
   ```

1. 執行下列命令以建立 IAM 角色的信任政策檔案。如果您想要允許命名空間中的所有服務帳戶使用該角色，請將以下內容複製到您的裝置。將 *StringEquals* 取代為 `StringLike`，並將 *\$1service\$1account* 取代為 `*`。您可以在 `StringEquals` 和 `StringLike` 條件中新增多個項目，以允許多個服務帳戶或命名空間擔任角色。若要允許來自與叢集所在 AWS 帳戶不同的 帳戶的角色擔任該角色，請參閱 [使用 IRSA 向其他帳戶進行身分驗證](cross-account-access.md) 以取得詳細資訊。

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::123456789012:oidc-provider/$oidc_provider"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "$oidc_provider:aud": "sts.amazonaws.com",
             "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account"
           }
         }
       }
     ]
   }
   ```

1. 建立角色。將 *my-role* 取代為您的 IAM 角色名稱，並將 *my-role-description* 取代為您角色的描述。

   ```
   aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
   ```

1. 將 IAM 政策連接至您的角色。將 *my-role* 取代為您的 IAM 角色名稱，將 *my-policy* 取代為您建立的現有政策名稱。

   ```
   aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws: iam::$account_id:policy/my-policy
   ```

1. 使用您希望服務帳戶擔任之 IAM 角色的 Amazon Resource Name (ARN) 標註您的服務帳戶。使用現有 IAM 角色的名稱取代 *my-role*。假設您允許來自與叢集所在 AWS 帳戶不同的 帳戶的角色，以在上一個步驟中擔任該角色。然後，請務必從另一個 AWS 帳戶指定帳戶和角色。如需詳細資訊，請參閱[使用 IRSA 向其他帳戶進行身分驗證](cross-account-access.md)。

   ```
   kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws: iam::$account_id:role/my-role
   ```

1. （選用） [設定服務帳戶 AWS 的安全字符服務端點](configure-sts-endpoint.md)。 AWS 建議使用區域 AWS STS 端點而非全域端點。這樣可以減少延遲、提供內建備援，並增加工作階段字符的有效性。

## 步驟 3：確認組態
<a name="irsa-confirm-role-configuration"></a>

1. 確認 IAM 角色的信任政策設定正確。

   ```
   aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument
   ```

   範例輸出如下。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
               },
               "Action": "sts:AssumeRoleWithWebIdentity",
               "Condition": {
                   "StringEquals": {
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account",
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
                   }
               }
           }
       ]
   }
   ```

1. 確認您在上一步連接至角色的政策已連接至該角色。

   ```
   aws iam list-attached-role-policies --role-name my-role --query "AttachedPolicies[].PolicyArn" --output text
   ```

   範例輸出如下。

   ```
    arn:aws: iam::111122223333:policy/my-policy
   ```

1. 設定變數以存放您要使用之政策的 Amazon Resource Name (ARN)。將 *my-policy* 取代為您要確認許可的政策名稱。

   ```
   export policy_arn=arn:aws: iam::111122223333:policy/my-policy
   ```

1. 檢視預設政策版本。

   ```
   aws iam get-policy --policy-arn $policy_arn
   ```

   範例輸出如下。

   ```
   {
       "Policy": {
           "PolicyName": "my-policy",
           "PolicyId": "EXAMPLEBIOWGLDEXAMPLE",
           "Arn": "arn:aws: iam::111122223333:policy/my-policy",
           "Path": "/",
           "DefaultVersionId": "v1",
           [...]
       }
   }
   ```

1. 檢視政策內容，以確定政策包含您的 Pod 需要的所有許可。視需要將以下命令中的 *1* 取代為上一個輸出中傳回的版本。

   ```
   aws iam get-policy-version --policy-arn $policy_arn --version-id v1
   ```

   範例輸出如下。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
           }
       ]
   }
   ```

   如果您在上一步建立了範例政策，則輸出結果相同。如果您建立了不同的政策，則 *example* 內容有所不同。

1. 確認 Kubernetes 服務帳戶標註了角色。

   ```
   kubectl describe serviceaccount my-service-account -n default
   ```

   範例輸出如下。

   ```
   Name:                my-service-account
   Namespace:           default
   Annotations:         eks.amazonaws.com/role-arn: arn:aws: iam::111122223333:role/my-role
   Image pull secrets:  <none>
   Mountable secrets:   my-service-account-token-qqjfl
   Tokens:              my-service-account-token-qqjfl
   [...]
   ```

## 後續步驟
<a name="_next_steps"></a>
+  [設定 Pod 來使用 Kubernetes 服務帳戶](pod-configuration.md) 

# 設定 Pod 來使用 Kubernetes 服務帳戶
<a name="pod-configuration"></a>

如果 Pod 需要存取 AWS 服務，則必須將其設定為使用 Kubernetes 服務帳戶。服務帳戶必須與具有存取 AWS 服務許可的 AWS Identity and Access Management (IAM) 角色相關聯。
+ 現有的叢集。如果您沒有，則可以使用其中一個 [開始使用 Amazon EKS](getting-started.md) 指南來建立一個。
+ 叢集的現有 IAM OpenID Connect (OIDC) 提供商。若要了解是否已經擁有，或是了解如何建立，請參閱[為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。
+ 與 IAM 角色關聯的現有 Kubernetes 服務帳戶。服務帳戶必須標註 IAM 角色的 Amazon Resource Name (ARN)。角色必須具有關聯的 IAM 政策，其中包含您希望 Pod 必須使用 AWS 服務的許可。如需有關服務帳戶和角色之建立和設定方式的詳細資訊，請參閱[將 IAM 角色指派給 Kubernetes 服務帳戶](associate-service-account-role.md)。
+ 裝置`2.12.3`或 AWS CloudShell 上安裝和設定的 AWS 命令列界面 (AWS CLI) 版本 `1.27.160` 或更新版本。若要檢查您目前的版本，請使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 * AWS 命令列界面使用者指南*》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)安裝在 AWS CloudShell 中的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。 * AWS CloudShell *
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 Kubernetes 版本相同，或是為最多比該版本更舊一版或更新一版的次要版本。例如，如果您的叢集版本為 `1.29`，則可以搭配使用 `kubectl` `1.28`、`1.29` 或 `1.30` 版。若要安裝或升級 `kubectl`，請參閱 [設定 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含叢集組態的現有 `kubectl` `config` 檔案。若要建立 `kubectl` `config` 檔案，請參閱[透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集](create-kubeconfig.md)。

  1. 使用以下命令，以建立部署清單檔案，讓您可部署 Pod 以確認組態。以您自己的值取代範例值。

     ```
     cat >my-deployment.yaml <<EOF
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: my-app
     spec:
       selector:
         matchLabels:
           app: my-app
       template:
         metadata:
           labels:
             app: my-app
         spec:
           serviceAccountName: my-service-account
           containers:
           - name: my-app
             image: public.ecr.aws/nginx/nginx:X.XX
     EOF
     ```

  1. 將清單檔案部署到叢集。

     ```
     kubectl apply -f my-deployment.yaml
     ```

  1. 確認您的 Pod 有必要的環境變數。

     1. 檢視使用上一步中的部署作業進行部署的 Pod。

        ```
        kubectl get pods | grep my-app
        ```

        範例輸出如下。

        ```
        my-app-6f4dfff6cb-76cv9   1/1     Running   0          3m28s
        ```

     1. 檢視 Pod 所使用 IAM 角色的 ARN。

        ```
        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_ROLE_ARN:
        ```

        範例輸出如下。

        ```
        AWS_ROLE_ARN: arn:aws: iam::111122223333:role/my-role
        ```

        角色 ARN 必須與您用來標註現有服務帳戶的角色 ARN 相符。如需有關標註服務帳戶的詳細資訊，請參閱[將 IAM 角色指派給 Kubernetes 服務帳戶](associate-service-account-role.md)。

     1. 確認 Pod 有 Web 身分字符檔案掛載。

        ```
        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_WEB_IDENTITY_TOKEN_FILE:
        ```

        範例輸出如下。

        ```
        AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
        ```

        `kubelet` 請求並代表 Pod 存放字符。根據預設，如果字符超過總存留時間的 80% 或 24 小時，`kubelet` 會重新整理字符。您可以使用 Pod 規格中的設定來修改任何帳戶 (預設服務帳戶除外) 的過期持續時間。如需詳細資訊，請參閱 Kubernetes 文件中的[服務帳戶字符磁碟區投影](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#serviceaccount-token-volume-projection)。

        叢集上的 [Amazon EKS Pod 身分識別 Webhook](https://github.com/aws/amazon-eks-pod-identity-webhook#amazon-eks-pod-identity-webhook) 會監視使用具有以下註釋之服務帳戶的 Pod：

        ```
        eks.amazonaws.com/role-arn: arn:aws: iam::111122223333:role/my-role
        ```

        Webhook 會將先前的環境變數套用至這些 Pod。您的叢集不需要使用 Webhook 來設定環境變數和字符檔案掛載。您可以手動將 Pod 設定為具有這些環境變數。[支援的 AWS SDK 版本](iam-roles-for-service-accounts-minimum-sdk.md)會先在登入資料鏈提供者中尋找這些環境變數。符合此條件的 Pod 會使用角色憑證。

  1. 確認您的 Pod 可以使用您在連接至角色的 IAM 政策中指派的許可與 AWS 服務互動。
**注意**  
當 Pod 使用與服務帳戶相關聯的 IAM 角色 AWS 登入資料時，該 Pod 容器中的 AWS CLI 或其他 SDKs 會使用該角色提供的登入資料。如果您沒有對提供給 [Amazon EKS 節點 IAM 角色](create-node-role.md)的憑證限制存取權，則 Pod 仍然可以存取這些認證。如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

     如果您的 Pod 無法如預期與服務互動，請完成以下步驟以確認所有項目都已正確設定。

     1. 確認您的 Pod 使用支援透過 OpenID Connect Web 身分字符檔案擔任 IAM 角色的 AWS SDK 版本。如需詳細資訊，請參閱[搭配 AWS SDK 使用 IRSA](iam-roles-for-service-accounts-minimum-sdk.md)。

     1. 確認部署使用服務帳戶。

        ```
        kubectl describe deployment my-app | grep "Service Account"
        ```

        範例輸出如下。

        ```
        Service Account:  my-service-account
        ```

     1. 如果您的 Pod 仍然無法存取服務，請檢閱[為 Kubernetes 服務帳戶指派 IAM 角色](associate-service-account-role.md)中描述的[步驟](associate-service-account-role.md#irsa-confirm-role-configuration)，以確認您的角色和服務帳戶設定正確。

# 為服務帳戶設定 AWS Security Token Service 端點
<a name="configure-sts-endpoint"></a>

如果您將 Kubernetes 服務帳戶與[服務帳戶的 IAM 角色](iam-roles-for-service-accounts.md)搭配使用，則可設定服務帳戶所使用的 AWS Security Token Service 端點類型。

 AWS 建議使用區域性 AWS STS 端點，而不要使用全域端點。這樣可以減少延遲、提供內建備援，並增加工作階段字符的有效性。AWS Security Token Service 必須在執行 Pod 的 AWS 區域中處於作用中狀態。此外，應用程式應具有內建備援，以便在該 AWS 區域的服務發生故障時選擇不同的 AWS 區域。如需詳細資訊，請參閱《IAM 使用者指南》中的[在 AWS 區域中管理 AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)。
+ 現有的叢集。如果您沒有，則可以使用其中一個 [開始使用 Amazon EKS](getting-started.md) 指南來建立一個。
+ 叢集的現有 IAM OIDC 提供商。如需詳細資訊，請參閱 [為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。
+ 現有的 Kubernetes 服務帳戶設定為與[服務帳戶的 Amazon EKS IAM](iam-roles-for-service-accounts.md) 功能搭配使用。

以下範例均使用由 [Amazon VPC CNI 外掛程式](cni-iam-role.md)所使用的 aws-node Kubernetes 服務帳戶。您可將*範例值*取代為您自己的服務帳戶、Pod、命名空間和其他資源。

1. 根據您要變更端點的服務帳戶，選取使用該服務帳戶的 Pod。確定 Pod 在哪個 AWS 區域中執行。將 *aws-node-6mfgv* 取代為您的 Pod 名稱，以及將 *kube-system* 取代為您 Pod 的命名空間。

   ```
   kubectl describe pod aws-node-6mfgv -n kube-system |grep Node:
   ```

   範例輸出如下。

   ```
   ip-192-168-79-166.us-west-2/192.168.79.166
   ```

   在先前的輸出中，Pod 在 us-west-2 AWS 區域中的節點上執行。

1. 判斷 Pod 的服務帳戶所使用的端點類型。

   ```
   kubectl describe pod aws-node-6mfgv -n kube-system |grep AWS_STS_REGIONAL_ENDPOINTS
   ```

   範例輸出如下。

   ```
   AWS_STS_REGIONAL_ENDPOINTS: regional
   ```

   如果目前端點是全域範圍，則輸出中會傳回 `global`。如果未傳回任何輸出，則預設端點類型正在使用中且未被覆寫。

1. 如果您的叢集或平台版本與表中列出的版本相同或更高，則可以使用以下命令之一，將服務帳戶使用的端點類型從預設類型變更為其他類型。將 *aws-node* 取代為您服務帳戶的名稱，以及將 *kube-system* 取代為服務帳戶的命名空間。
   + 如果您的預設或目前端點類型是全域範圍，且您想將其範圍變更為區域：

     ```
     kubectl annotate serviceaccount -n kube-system aws-node eks.amazonaws.com/sts-regional-endpoints=true
     ```

     如果您是使用[服務帳戶的 IAM 角色](iam-roles-for-service-accounts.md)來產生在 Pod 容器中執行的應用程式中的預簽署 S3 URL，則區域端點的 URL 格式會與以下範例類似：

     ```
     https://bucket.s3.us-west-2.amazonaws.com/path?...&X-Amz-Credential=your-access-key-id/date/us-west-2/s3/aws4_request&...
     ```
   + 如果您的預設或目前端點類型是區域範圍，且您想將其範圍變更為全域：

     ```
     kubectl annotate serviceaccount -n kube-system aws-node eks.amazonaws.com/sts-regional-endpoints=false
     ```

     如果您的應用程式明確地向 AWS STS 全域端點發出請求，並且您不會覆寫在 Amazon EKS 叢集中使用區域端點的預設行為，則請求會失敗並發生錯誤。如需詳細資訊，請參閱 [Pod 容器會接收到下列錯誤：`An error occurred (SignatureDoesNotMatch) when calling the GetCallerIdentity operation: Credential should be scoped to a valid region`](security-iam-troubleshoot.md#security-iam-troubleshoot-wrong-sts-endpoint)。

     如果您是使用[服務帳戶的 IAM 角色](iam-roles-for-service-accounts.md)來產生在 Pod 容器中執行的應用程式中的預簽署 S3 URL，則全域端點的 URL 格式會與以下範例類似：

     ```
     https://bucket.s3.amazonaws.com/path?...&X-Amz-Credential=your-access-key-id/date/us-west-2/s3/aws4_request&...
     ```

   如果您的自動化需要某種格式的預簽署 URL，或者您的應用程式或使用預簽署 URL 的下游相依性對 AWS 區域有期望，則請進行必要的變更，以使用適當的 AWS STS 端點。

1. 刪除並重新建立任何與服務帳戶相關聯的現有 Pod，以套用憑證環境變數。變動 Webhook 不會將這些變數套用到已在執行中的 Pod。您可使用所設定標註的 Pod 資訊，來取代 *Pod*、*kube-system* 和 *-l k8s-app=aws-node*。

   ```
   kubectl delete Pods -n kube-system -l k8s-app=aws-node
   ```

1. 確認所有 Pod 均重新啟動。

   ```
   kubectl get Pods -n kube-system -l k8s-app=aws-node
   ```

1. 檢視其中一個 Pod 的環境變數。確認 `AWS_STS_REGIONAL_ENDPOINTS` 值是您在上一個步驟中所設定的值。

   ```
   kubectl describe pod aws-node-kzbtr -n kube-system |grep AWS_STS_REGIONAL_ENDPOINTS
   ```

   範例輸出如下。

   ```
   AWS_STS_REGIONAL_ENDPOINTS=regional
   ```

# 使用 IRSA 向其他帳戶進行身分驗證
<a name="cross-account-access"></a>

您可以從另一個帳戶的叢集建立身分提供者，或使用鏈結的 `AssumeRole` 操作，設定跨帳戶 IAM 許可。在下列範例中，*帳戶 A* 擁有 Amazon EKS 叢集，該叢集支援服務帳戶的 IAM 角色。在該叢集上執行的 Pod 必須取得*帳戶 B* 的 IAM 許可。
+  **選項 1** 更簡單，但需要帳戶 B 為帳戶 A 的叢集建立和管理 OIDC 身分提供者。
+  **選項 2** 會在帳戶 A 中保留 OIDC 管理，但需要透過兩個`AssumeRole`呼叫鏈結角色。

## 選項 1：從另一個帳戶的叢集建立身分提供者
<a name="_option_1_create_an_identity_provider_from_another_accounts_cluster"></a>

在此範例中，帳戶 A 將為帳戶 B 提供其叢集的 OpenID Connect (OIDC) 發行者 URL。帳戶 B 遵循[為您的叢集建立 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)和 [將 IAM 角色指派給 Kubernetes 服務帳戶](associate-service-account-role.md) 中的指示，使用來自帳戶 A 叢集的 OIDC 發行者 URL。然後，叢集管理員會註釋帳戶 A 叢集中的服務帳戶，以使用帳戶 B (*444455556666*) 中的角色。

```
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws: iam::444455556666:role/account-b-role
```

## 選項 2：使用鏈結`AssumeRole`操作
<a name="_option_2_use_chained_assumerole_operations"></a>

在此方法中，每個帳戶都會建立 IAM 角色。帳戶 B 的角色信任帳戶 A，而帳戶 A 的角色使用 OIDC 聯合從叢集取得登入資料。然後，Pod 會使用 CLI AWS 設定檔將兩個角色鏈結在一起。

### 步驟 1：在帳戶 B 中建立目標角色
<a name="_step_1_create_the_target_role_in_account_b"></a>

帳戶 B (*444455556666*) 會建立具有帳戶 A 叢集中 Pod 所需許可的 IAM 角色。帳戶 B 會將所需的許可政策連接至此角色，然後新增下列信任政策。

 **帳戶 B 角色的信任政策** — 此政策允許帳戶 A 的特定 IRSA 角色擔任此角色。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}
```

**重要**  
如需最低權限，請將 `Principal` ARN 取代為帳戶 A 中的特定角色 ARN，而不是使用帳戶根 (`arn:aws:iam::111122223333:root`)。使用帳戶根允許帳戶 A 中的任何 ** IAM 主體擔任此角色。

### 步驟 2：在帳戶 A 中建立 IRSA 角色
<a name="_step_2_create_the_irsa_role_in_account_a"></a>

帳戶 A (*111122223333*) 會建立具有信任政策的角色，該政策會從使用叢集 OIDC 發行者地址建立的身分提供者取得憑證。

 **帳戶 A 角色的信任政策 (OIDC 聯合）** — 此政策允許 EKS 叢集的 OIDC 供應商為此角色發出憑證。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}
```

**重要**  
針對最低權限，請新增`sub`宣告`StringEquals`的條件，將此角色限制為特定的 Kubernetes 服務帳戶。如果沒有`sub`條件，叢集中的任何服務帳戶都可以擔任此角色。`sub` 值使用 格式 `system:serviceaccount:NAMESPACE:SERVICE_ACCOUNT_NAME `。例如，若要限制在`default`命名空間`my-service-account`中名為 的服務帳戶：  

```
"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account"
```

### 步驟 3：將 AssumeRole 許可連接至帳戶 A 的角色
<a name="_step_3_attach_the_assumerole_permission_to_account_as_role"></a>

帳戶 A 會將許可政策連接至步驟 2 中建立的角色。此政策允許角色擔任帳戶 B 的角色。

 **帳戶 A 角色的許可政策** — 此政策`sts:AssumeRole`授予帳戶 B 的目標角色。

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::444455556666:role/account-b-role"
        }
    ]
}
```

### 步驟 4：將 Pod 設定為鏈結角色
<a name="_step_4_configure_the_pod_to_chain_roles"></a>

Pod 擔任帳戶 B 角色的應用程式碼使用兩個描述檔：`account_b_role` 和 `account_a_role`。`account_b_role` 描述檔使用 `account_a_role` 描述檔作為其來源。對於 AWS CLI，`~/.aws/config`檔案類似於以下內容。

```
[profile account_b_role]
source_profile = account_a_role
role_arn=arn:aws: iam::444455556666:role/account-b-role

[profile account_a_role]
web_identity_token_file = /var/run/secrets/eks.amazonaws.com/serviceaccount/token
role_arn=arn:aws: iam::111122223333:role/account-a-role
```

若要指定其他 AWS SDKs的鏈結設定檔，請參閱您正在使用的 SDK 文件。如需詳細資訊，請參閱[要建置的工具 AWS](https://aws.amazon.com/developer/tools/)。

# 搭配 AWS SDK 使用 IRSA
<a name="iam-roles-for-service-accounts-minimum-sdk"></a>

**使用憑證**  
若要使用來自服務帳戶的 IAM 角色 (IRSA) 的憑證，您的程式碼可以使用任何 AWS SDK 來為具有 SDK 的 AWS 服務建立用戶端，並且根據預設，SDK 會在位置鏈中搜尋要使用的 AWS Identity and Access Management 憑證。如果您在建立用戶端或以其他方式初始化 SDK 時未指定憑證提供者，則系統會使用服務帳戶憑證的 IAM 角色。

這樣是有效的，因為服務帳戶的 IAM 角色已新增為預設憑證鏈中的一個步驟。如果您的工作負載目前使用憑證鏈中較早的憑證，那麼即使您為相同工作負載設定服務帳戶的 IAM 角色，系統仍會繼續使用這些憑證。

SDK 會透過使用 `AssumeRoleWithWebIdentity` 動作，自動將服務帳戶 OIDC 權杖更換為來自 AWS Security Token Service 的臨時憑證。Amazon EKS 和此 SDK 動作會繼續輪換臨時憑證，方法是在臨時憑證到期前進行更新。

使用[服務帳戶的 IAM 角色](iam-roles-for-service-accounts.md)時，Pod 中的容器使用的 AWS SDK 版本，必須支援透過 OpenID Connect Web 身分權杖檔案擔任 IAM 角色。請確保您的 AWS SDK 使用以下版本或更新版本：
+ Java (第 2 版) – [2.10.11](https://github.com/aws/aws-sdk-java-v2/releases/tag/2.10.11) 
+ Java – [1.12.782](https://github.com/aws/aws-sdk-java/releases/tag/1.12.782) 
+  適用於 Go v1 的 AWS SDK – [1.23.13](https://github.com/aws/aws-sdk-go/releases/tag/v1.23.13) 
+  適用於 Go v2 的 AWS SDK – 所有版本支援
+ Python (Boto3) – [1.9.220](https://github.com/boto/boto3/releases/tag/1.9.220) 
+ Python (botocore) – [1.12.200](https://github.com/boto/botocore/releases/tag/1.12.200) 
+  AWS CLI – [1.16.232](https://github.com/aws/aws-cli/releases/tag/1.16.232) 
+ 節點：[2.525.0](https://github.com/aws/aws-sdk-js/releases/tag/v2.525.0) 和 [3.27.0](https://github.com/aws/aws-sdk-js-v3/releases/tag/v3.27.0) 
+ Ruby – [3.58.0](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-core/CHANGELOG.md#3580-2019-07-01) 
+ C\$1\$1 – [1.7.174](https://github.com/aws/aws-sdk-cpp/releases/tag/1.7.174) 
+ .NET：[3.3.659.1](https://github.com/aws/aws-sdk-net/releases/tag/3.3.659.1) – 您也必須包含 `AWSSDK.SecurityToken`。
+ PHP – [3.110.7](https://github.com/aws/aws-sdk-php/releases/tag/3.110.7) 

許多熱門的 Kubernetes 附加元件，例如 [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)、[透過 AWS Load Balancer 控制器路由網際網路流量](aws-load-balancer-controller.md)和 [Kubernetes 專用 Amazon VPC CNI 外掛程式](cni-iam-role.md)，支援服務帳戶的 IAM 角色。

為了確保您使用支援的 SDK，在建立您的容器時，請遵循[在 AWS 上建立的工具](https://aws.amazon.com/tools/)中您偏好之 SDK 的安裝指示。

## 考量事項
<a name="_considerations"></a>

### Java
<a name="_java"></a>

使用 Java 時，您*必須*在類別路徑上包含 `sts` 模組。如需詳細資訊，請參閱 Java SDK 文件中的 [WebIdentityTokenFileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/WebIdentityTokenFileCredentialsProvider.html)。

# 擷取簽署金鑰以驗證 OIDC 權杖
<a name="irsa-fetch-keys"></a>

Kubernetes 會為每個 Kubernetes Service 帳戶發出一個 `ProjectedServiceAccountToken`。此權杖是 OIDC 權杖，同時也是一種 JSON Web 權杖 (JWT)。Amazon EKS 為每個叢集託管公有 OIDC 端點，其中包含權杖的簽署金鑰，讓外部系統可以對其進行驗證。

若要驗證 `ProjectedServiceAccountToken`，您需要擷取 OIDC 公有簽署金鑰，也稱為 JSON Web Key Set (JWKS)。在應用程式中使用這些金鑰，以驗證權杖。例如，您可以使用 [PyJWT Python 程式庫](https://pyjwt.readthedocs.io/en/latest/)，以利用這些金鑰來驗證權杖。如需 `ProjectedServiceAccountToken` 的詳細資訊，請參閱 [IAM, Kubernetes 和 OpenID Connect (OIDC) 背景資訊](iam-roles-for-service-accounts.md#irsa-oidc-background)。

## 先決條件
<a name="_prerequisites"></a>
+ 叢集的現有 AWS Identity and Access Management (IAM) OpenID Connect (OIDC) 提供商。若要判定您是否已經擁有一個，或是要建立一個，請參閱 [為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。
+  **AWS CLI**：命令列工具，適用於使用 AWS 服務，包括 Amazon EKS。如需詳細資訊，請參閱《AWS 命令列介面使用者指南》中的[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。安裝 AWS CLI 後，建議您也進行設定。如需詳細資訊，請參閱《AWS 命令列介面使用者指南》中的[使用 aws configure 的快速組態](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。

## 程序
<a name="_procedure"></a>

1. 使用 AWS CLI 擷取 Amazon EKS 叢集的 OIDC URL。

   ```
   $ aws eks describe-cluster --name my-cluster --query 'cluster.identity.oidc.issuer'
   "https://oidc.eks.us-west-2.amazonaws.com/id/8EBDXXXX00BAE"
   ```

1. 使用 curl 或類似工具擷取公有簽署金鑰。結果為 [JSON Web Key Set (JWKS)](https://www.rfc-editor.org/rfc/rfc7517#section-5)。
**重要**  
Amazon EKS 會調節對 OIDC 端點的呼叫。您應該快取公有簽署金鑰。遵守回應中包含的 `cache-control` 標題。
**重要**  
Amazon EKS 每七天輪換一次 OIDC 簽署金鑰。

   ```
   $ curl https://oidc.eks.us-west-2.amazonaws.com/id/8EBDXXXX00BAE/keys
   {"keys":[{"kty":"RSA","kid":"2284XXXX4a40","use":"sig","alg":"RS256","n":"wklbXXXXMVfQ","e":"AQAB"}]}
   ```

# 了解 EKS Pod 身分識別如何授予 AWS 服務的 Pod 存取權
<a name="pod-identities"></a>

Pod 容器中的應用程式可以使用 AWS SDK 或 AWS CLI，以利用 AWS Identity and Access Management (IAM) 許可向 AWS 服務提出 API 請求。應用程式必須使用 AWS 憑證簽署其 AWS API 請求。

 *EKS Pod 身分識別*提供管理應用程式憑證的功能，類似 Amazon EC2 執行個體設定檔將憑證提供給 Amazon EC2 執行個體的方式。您可以將 IAM 角色與 Kubernetes 服務帳戶建立關聯，並設定 Pod 來使用該服務帳戶，而不必建立 AWS 憑證並分發至容器或使用 Amazon EC2 執行個體的角色。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/aUjJSorBE70?rel=0/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/aUjJSorBE70?rel=0)


每個 EKS Pod 身分識別關聯會將角色對應至指定叢集內命名空間中的服務帳戶。如果您在多個叢集中具有相同的應用程式，則可以在每個叢集中建立相同的關聯，而不必修改角色的信任政策。

如果 Pod 使用具有關聯的服務帳戶，則 Amazon EKS 會在 Pod 的容器中設定環境變數。環境變數會將 AWS SDK (包含 AWS CLI) 設定為使用 EKS Pod 身分識別憑證。

## EKS Pod 身分識別的優勢
<a name="pod-id-benefits"></a>

EKS Pod 身分識別提供下列優勢：
+  **最低權限**：您可以將 IAM 許可範圍限定為服務帳戶，只有使用該服務帳戶的 Pod 才能存取這些許可。有此功能也就不需要第三方解決方案，例如 `kiam` 或 `kube2iam`。
+  **憑證隔離**：若 [Amazon EC2 執行個體中繼資料服務 (IMDS)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html) 存取權受限，Pod 的容器僅可擷取與容器所用服務帳戶關聯的 IAM 角色憑證。容器一律無法存取其他 Pod 中其他容器使用的憑證。若 IMDS 不受限制，Pod 的容器亦可存取 [Amazon EKS 節點 IAM 角色](create-node-role.md)，且容器或許能存取相同節點上其他 Pod 的 IAM 角色的憑證。如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://docs.aws.amazon.com/eks/latest/best-practices/identity-and-access-management.html#_identities_and_credentials_for_eks_pods_recommendations)。

**注意**  
使用 `hostNetwork: true` 設定的 Pod 一律具有 IMDS 存取權，但 AWS SDK 和 CLI 將在啟用時使用 Pod 身分識別憑證。
+  **可稽核性** – 可透過 AWS CloudTrail 取得存取和事件記錄，以促進回顧稽核。

**重要**  
容器並非安全邊界，而且使用 Pod 身分識別亦不會對此有所變更。若 Pod 指派到相同的節點，將會分享核心及可能的其他資源，具體取決於 Pod 組態。儘管執行於單獨節點上的 Pod 將會在運算層隔離，但有些節點應用程式在 Kubernetes API 中擁有超出個別執行個體範圍的額外許可。部分範例包括 `kubelet`、`kube-proxy`、CSI 儲存驅動程式，或者您本人的 Kubernetes 應用程式。

相較於 [服務帳戶的 IAM 角色](iam-roles-for-service-accounts.md)，EKS Pod 身分識別是比較簡單的方法，因為此方法不使用 OIDC 身分識別提供者。EKS Pod 身分識別具有下列增強功能：
+  **獨立運作** – 在許多組織中，建立 OIDC 身分識別提供者和管理 Kubernetes 叢集是不同團隊的責任。EKS Pod 身分識別具有完整的職責分離，其中 EKS Pod 身分識別關聯的所有組態都在 Amazon EKS 中完成，而 IAM 許可的所有組態則都在 IAM 中完成。
+  **可重複使用性** – EKS Pod 身分識別會針對服務帳戶的 IAM 角色使用的每個叢集使用單一 IAM 主體，而不是使用不同的主體。您的 IAM 管理員會將下列主體新增至任何角色的信任政策，以便供 EKS Pod 身分識別使用。

  ```
              "Principal": {
                  "Service": "pods.eks.amazonaws.com"
              }
  ```
+  **可擴展性**：每組臨時憑證由 EKS Pod 身分識別中的 EKS 驗證服務擔任，而不是由您在每個 Pod 中執行的每個 AWS SDK 擔任。然後，在每個節點上執行的 Amazon EKS Pod 身分識別代理程式會向 SDK 發出憑證。因此，每個節點的負載會減少為一次，而且不會在每個 Pod 中重複。如需該程序的詳細資訊，請參閱 [了解 EKS Pod 身分識別的運作方式](pod-id-how-it-works.md)。

如需比較兩種替代方案的詳細資訊，請參閱 [藉助 Kubernetes 服務帳戶向 AWS 授予 Kubernetes 工作負載存取權](service-accounts.md)。

## 設定 EKS Pod 身分識別的概觀
<a name="pod-id-setup-overview"></a>

完成下列程序以開啟 EKS Pod 身分識別：

1.  [設定 Amazon EKS Pod 身分識別代理程式](pod-id-agent-setup.md)：您對每個叢集只完成此程序一次。若叢集已啟用 EKS 自動模式，則無須完成此步驟。

1.  [指派 IAM 角色至 Kubernetes 服務帳戶](pod-id-association.md)：對您希望應用程式擁有的每種非重複可組合完成此程序。

1.  [設定 Pod 以使用 AWS 服務帳戶存取 服務](pod-id-configure-pods.md)：對需要存取 AWS 服務的每個 Pod 完成此程序。

1.  [將 Pod 身分識別與 AWS SDK 搭配使用](pod-id-minimum-sdk.md)：確認工作負載使用受支援版本的 AWS SDK，並確認工作負載使用預設憑證鏈。

## 限制
<a name="pod-id-limits"></a>
+ 每個叢集可擁有最多 5，000 個 EKS Pod 身分識別關聯，將 IAM 角色映射至 Kubernetes 服務帳戶。

## 考量事項
<a name="pod-id-considerations"></a>
+  **IAM 角色關聯**：叢集中的每項 Kubernetes 服務帳戶可與叢集相同 AWS 帳戶中的一個 IAM 角色關聯。如需變更角色，編輯 EKS Pod 身分識別關聯。針對跨帳戶存取權，使用 IAM 角色向角色委派存取權。如需了解詳細資訊，請參閱 *IAM 使用者指南》*中的[使用 IAM 角色跨 AWS 帳戶委派存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)。
+  **EKS Pod 身分識別代理程式**：需要 Pod 身分識別代理程式以使用 EKS Pod 身分識別。代理程式以叢集節點上的 Kubernetes `DaemonSet` 執行，僅向相同節點上的 Pod 提供憑證。其使用節點的 `hostNetwork`，佔用連接埠 `80`，以及連結本機位址上 `2703` (若是 IPv4，使用 `169.254.170.23`；若是 IPv6，使用 `[fd00:ec2::23]`)。若 IPv6 在叢集中停用，則為 Pod 身分識別代理程式停用 IPv6。如需了解詳細資訊，請參閱[在 EKS Pod 身分識別代理程式中停用 IPv6](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-config-ipv6.html)。
+  **最終一致性**：EKS Pod 身分識別關聯最終會一致，並在 API 呼叫之後可能會延遲幾秒。請避免在關鍵、高可用性程式碼路徑中建立或更新關聯。取而代之的是，在單獨、不太頻繁的初始化或設定例程中執行這些動作。如需了解詳細資訊，請參閱 *EKS 最佳實務指南*中的[每個 Pod 的安全群組](https://docs.aws.amazon.com/eks/latest/best-practices/sgpp.html)。
+  **代理與安全群組考量**：針對使用代理的 Pod，新增 `169.254.170.23` (IPv4) 與 `[fd00:ec2::23]` (IPv6) 至 `no_proxy/NO_PROXY` 環境變數，以免向 EKS Pod 身分識別代理程式發出的請求失敗。若將 Pod 的安全群組與 AWS VPC CNI 配合使用，則將 `ENABLE_POD_ENI` 標誌設定為 ‘true’，然後並將 `POD_SECURITY_GROUP_ENFORCING_MODE` 標誌設定為 ‘standard’。如需了解詳細資訊，請參閱[將安全群組指派給個別 Pod](https://docs.aws.amazon.com/eks/latest/userguide/security-groups-for-pods.html)。

### EKS Pod 身分識別叢集版本
<a name="pod-id-cluster-versions"></a>

如需使用 EKS Pod 身分識別，叢集的平台版本必須與下表所列版本相同或更新，或是晚於表格中列出版本的 Kubernetes 版本。如需尋找適用於 Kubernetes 版本的 Amazon EKS Pod 身分識別代理程式建議版本，請參閱 [確認 Amazon EKS 附加元件版本與叢集的相容性](addon-compat.md)。


| Kubernetes 版本 | 平台版本 | 
| --- | --- | 
|  Kubernetes 版本未列出  |  所有平台版本支援  | 
|   `1.28`   |   `eks.4`   | 

### EKS Pod 身分識別限制
<a name="pod-id-restrictions"></a>

EKS Pod 身分識別適用於下列情況：
+ 上一個主題 [EKS Pod 身分識別叢集版本](#pod-id-cluster-versions) 中列出的 Amazon EKS 叢集版本。
+ 叢集中為 Linux Amazon EC2 執行個體的工作節點。

EKS Pod 身分識別不適用於下列情況：
+  AWS Outposts。
+ Amazon EKS Anywhere。
+ 您在 Amazon EC2 上建立和執行的 Kubernetes 叢集。EKS Pod 身分識別元件僅適用於 Amazon EKS。

您無法將 EKS Pod 身分識別與下列項目搭配使用：
+ 在 Linux Amazon EC2 執行個體以外的任何位置執行的 Pod。不支援在 AWS Fargate (Fargate) 上執行的 Linux 和 Windows Pod。不支援在 Windows Amazon EC2 執行個體上執行的 Pod。

# 了解 EKS Pod 身分識別的運作方式
<a name="pod-id-how-it-works"></a>

Amazon EKS Pod 身分識別關聯提供管理應用程式憑證的功能，類似 Amazon EC2 執行個體設定檔將憑證提供給 Amazon EC2 執行個體的方式。

Amazon EKS Pod 身分識別透過其他 *EKS 驗證* API 和在每個節點上執行的代理程式 Pod，為您的工作負載提供憑證。

在您的附加元件中 (例如 *Amazon EKS 附加元件*和自我管理控制器、運算子和其他附加元件)，編寫者需要更新其軟體以使用最新的 AWS SDK。如需 EKS Pod 身分識別與 Amazon EKS 產生的附加元件之間的相容性清單，請參閱上節 [EKS Pod 身分識別限制](pod-identities.md#pod-id-restrictions)。

## 在程式碼中使用 EKS Pod 身分識別
<a name="pod-id-credentials"></a>

在您的程式碼中，您可以使用 AWS SDK 存取 AWS 服務。撰寫程式碼即可使用 SDK 建立 AWS 服務的用戶端，並且依預設，SDK 會在位置鏈中搜尋要使用的 AWS Identity and Access Management 憑證。找到有效的憑證後，系統就會停止搜尋。如需使用預設位置的詳細資訊，請參閱 AWS SDK 和工具參考指南中的[憑證提供者鏈](https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html#credentialProviderChain)。

EKS Pod 身分識別已新增至*容器憑證提供者*，系統會在預設憑證鏈中的某個步驟搜尋此提供者。如果您的工作負載目前使用憑證鏈中較早的憑證，那麼即使您為相同工作負載設定 EKS Pod 身分識別關聯，系統仍會繼續使用這些憑證。如此一來，您就可以先建立關聯，然後再移除舊憑證，以安全地從其他類型的憑證遷移。

容器憑證提供者會從每個節點上執行的代理程式提供臨時憑證。在 Amazon EKS 中，代理程式為 Amazon EKS Pod 身分識別代理程式，而在 Amazon Elastic Container Service 上，代理程式則為 `amazon-ecs-agent`。SDK 使用環境變數來尋找要連線的代理程式。

相對來說，*服務帳戶的 IAM 角色*會透過使用 `AssumeRoleWithWebIdentity` 的方式，提供 AWS SDK 必須與 AWS 安全記號化服務交換的 *Web 身分*記號。

## EKS Pod 身分識別代理程式如何搭配 Pod 使用
<a name="pod-id-agent-pod"></a>

1. 當 Amazon EKS 啟動使用具有 EKS Pod 身分識別關聯之服務帳戶的全新 Pod 時，叢集會將下列內容新增至 Pod 資訊清單：

   ```
       env:
       - name: AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE
         value: "/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token"
       - name: AWS_CONTAINER_CREDENTIALS_FULL_URI
         value: "http://169.254.170.23/v1/credentials"
       volumeMounts:
       - mountPath: "/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/"
         name: eks-pod-identity-token
     volumes:
     - name: eks-pod-identity-token
       projected:
         defaultMode: 420
         sources:
         - serviceAccountToken:
             audience: pods.eks.amazonaws.com
             expirationSeconds: 86400 # 24 hours
             path: eks-pod-identity-token
   ```

1. Kubernetes 會選取要在哪個節點上執行 Pod。然後，節點上的 Amazon EKS Pod 身分識別代理程式會使用 [AssumeRoleForPodIdentity](https://docs.aws.amazon.com/eks/latest/APIReference/API_auth_AssumeRoleForPodIdentity.html) 動作以從 EKS 驗證 API 擷取臨時憑證。

1. EKS Pod 身分識別代理程式可讓您在容器內執行的 AWS SDK 使用這些憑證。

1. 您可以在應用程式中使用 SDK，無需指定憑證提供者來使用預設憑證鏈。或者，您可以指定容器憑證提供者。如需使用預設位置的詳細資訊，請參閱 AWS SDK 和工具參考指南中的[憑證提供者鏈](https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html#credentialProviderChain)。

1. SDK 會使用環境變數來連線至 EKS Pod 身分識別代理程式，並擷取憑證。
**注意**  
如果您的工作負載目前使用憑證鏈中較早的憑證，那麼即使您為相同工作負載設定 EKS Pod 身分識別關聯，系統仍會繼續使用這些憑證。

# 設定 Amazon EKS Pod 身分識別代理程式
<a name="pod-id-agent-setup"></a>

Amazon EKS Pod 身分識別關聯提供管理應用程式憑證的功能，類似 Amazon EC2 執行個體設定檔將憑證提供給 Amazon EC2 執行個體的方式。

Amazon EKS Pod 身分識別透過其他 *EKS 驗證* API 和在每個節點上執行的代理程式 Pod，為您的工作負載提供憑證。

**提示**  
您無須在 EKS 自動模式叢集上安裝 EKS Pod 身分識別代理程式。EKS 自動模式中已內建此功能。

## 考量事項
<a name="pod-id-agent-considerations"></a>
+ 依預設，EKS Pod 身分識別代理程式將預先安裝在 EKS 自動模式叢集上。如需詳細資訊，請參閱 [利用 EKS 自動模式自動運作叢集基礎設施](automode.md)。
+ 依預設，EKS Pod 身分識別代理程式將接聽 `IPv4` 與 `IPv6` 位址，以便 Pod 請求憑證。代理程式針對 `IPv4` 使用迴路 (localhost) IP 位址 `169.254.170.23`，針對 `IPv6` 使用 localhost IP 位址 `[fd00:ec2::23]`。
+ 若您停用 `IPv6` 位址，或者以其他方式阻止 localhost `IPv6` IP 位址，將無法啟動代理程式。如需在不能使用 `IPv6` 的節點上啟動代理程式，遵循 [在 EKS Pod 身分識別代理程式中停用 `IPv6`](pod-id-agent-config-ipv6.md) 中的步驟來停用 `IPv6` 組態。

## 建立 Amazon EKS Pod 身分識別代理程式
<a name="pod-id-agent-add-on-create"></a>

### 代理程式先決條件
<a name="pod-id-agent-prereqs"></a>
+ 現有 Amazon EKS 叢集。若要部署叢集，請參閱 [開始使用 Amazon EKS](getting-started.md)。叢集版本和平台版本必須與 [EKS Pod 身分識別叢集版本](pod-identities.md#pod-id-cluster-versions)中列出的版本相同或為更新版本。
+ 節點角色具有代理程式在 EKS 驗證 API 中執行 `AssumeRoleForPodIdentity` 動作的許可。您可使用 [AWS 受管政策：AmazonEKSWorkerNodePolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-amazoneksworkernodepolicy)，或者新增與下列所示類似的自訂政策：

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "eks-auth:AssumeRoleForPodIdentity"
              ],
              "Resource": "*"
          }
      ]
  }
  ```

  此動作可能會受到標籤的限制，以限制使用代理程式的 Pod 可以擔任哪些角色。
+ 這些節點可以從 Amazon ECR 連上和下載映像。適用於附加元件的容器映像位於[檢視適用於 Amazon EKS 附加元件的 Amazon 容器映像登錄檔](add-ons-images.md)中列示的登錄檔中。

  請注意，您可以在 的**選用組態設定**中，以及在 CLI `imagePullSecrets` `--configuration-values`的 中 AWS 管理主控台，變更映像位置並提供 EKS AWS 附加元件。
+ 這些節點可以連上 Amazon EKS 驗證 API。對於私有叢集，`eks-auth`端點 in AWS PrivateLink 是必要的。

### 使用 AWS 主控台設定代理程式
<a name="setup_agent_with_shared_aws_console"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左側導覽窗格中，選取**叢集**，然後選取您要為其設定 EKS Pod 身分識別代理程式附加元件之叢集的名稱。

1. 選擇**附加元件**索引標籤。

1. 選擇**取得更多附加元件**。

1. 選取 EKS Pod 身分識別代理程式之附加元件方塊右上方的方塊，然後選擇**下一步**。

1. 在**設定選取的附加元件設定**頁面上，選取**版本**下拉式清單中的任何版本。

1. (選用) 展開**選用組態設定**以輸入其他組態。例如，您可以提供替代容器映像位置和 `ImagePullSecrets`。具有已接受索引鍵的 JSON 結構描述會顯示在**附加元件組態結構描述**中。

   在**組態值**中輸入組態金鑰和值。

1. 選擇**下一步**。

1. 確認 EKS Pod 身分識別代理程式 Pod 正在您的叢集上執行。

   ```
   kubectl get pods -n kube-system | grep 'eks-pod-identity-agent'
   ```

   範例輸出如下。

   ```
   eks-pod-identity-agent-gmqp7                                          1/1     Running   1 (24h ago)   24h
   eks-pod-identity-agent-prnsh                                          1/1     Running   1 (24h ago)   24h
   ```

   您現在可以在叢集中使用 EKS Pod 身分識別關聯。如需詳細資訊，請參閱[指派 IAM 角色至 Kubernetes 服務帳戶](pod-id-association.md)。

### 使用 CLI AWS 設定代理程式
<a name="setup_agent_with_shared_aws_cli"></a>

1. 執行下列 AWS CLI 命令。使用您叢集的名稱取代 `my-cluster`。

   ```
   aws eks create-addon --cluster-name my-cluster --addon-name eks-pod-identity-agent --addon-version v1.0.0-eksbuild.1
   ```
**注意**  
EKS Pod 身分識別代理程式不會針對*服務帳戶的 IAM 角色*使用 `service-account-role-arn`。您必須為 EKS Pod 身分識別代理程式提供節點角色的許可。

1. 確認 EKS Pod 身分識別代理程式 Pod 正在您的叢集上執行。

   ```
   kubectl get pods -n kube-system | grep 'eks-pod-identity-agent'
   ```

   範例輸出如下。

   ```
   eks-pod-identity-agent-gmqp7                                          1/1     Running   1 (24h ago)   24h
   eks-pod-identity-agent-prnsh                                          1/1     Running   1 (24h ago)   24h
   ```

   您現在可以在叢集中使用 EKS Pod 身分識別關聯。如需詳細資訊，請參閱[指派 IAM 角色至 Kubernetes 服務帳戶](pod-id-association.md)。

# 指派 IAM 角色至 Kubernetes 服務帳戶
<a name="pod-id-association"></a>

本主題說明如何設定 Kubernetes 服務帳戶，以使用 EKS Pod Identity 擔任 AWS Identity and Access Management (IAM) 角色。然後，任何設定為使用服務帳戶的 Pod 都可以存取該角色有權存取的任何 AWS 服務。

若要建立 EKS Pod 身分關聯，只有一個步驟；您可以透過 AWS 管理主控台、 AWS CLI、 AWS SDKs、 AWS CloudFormation 和其他工具在 EKS 中建立關聯。在任何 Kubernetes 物件中，叢集內部的關聯沒有任何資料或中繼資料，也不會將任何註解新增至服務帳戶。

 **先決條件** 
+ 現有的叢集。如果您沒有，則可以按照其中一個 [開始使用 Amazon EKS](getting-started.md) 指南來建立。
+ 建立關聯的 IAM 主體必須具有 `iam:PassRole`。
+ 在您的裝置或 AWS CloudShell 上安裝和設定的最新版本 AWS CLI。您可以使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1` 來檢查您的目前版本。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 AWS 命令列界面使用者指南》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和 快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)安裝在 AWS CloudShell 中的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《 AWS CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 Kubernetes 版本相同，或是為最多比該版本更舊一版或更新一版的次要版本。例如，如果您的叢集版本為 `1.29`，則可以搭配使用 `kubectl` `1.28`、`1.29` 或 `1.30` 版。若要安裝或升級 `kubectl`，請參閱 [設定 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含叢集組態的現有 `kubectl` `config` 檔案。若要建立 `kubectl` `config` 檔案，請參閱[透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集](create-kubeconfig.md)。

## 建立 Pod Identity 關聯AWS （主控台）
<a name="pod-id-association-create"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左側導覽窗格中，選取**叢集**，然後選取您要為其設定 EKS Pod 身分識別代理程式附加元件之叢集的名稱。

1. 選擇**存取**索引標籤。

1. 在 **Pod 身分識別關聯**中，選擇**建立**。

1. 對於 **IAM 角色**，選取具有您希望工作負載擁有許可的 IAM 角色。
**注意**  
此清單僅包含具有下列信任政策的角色，允許 EKS Pod 身分識別使用這些角色。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
               "Effect": "Allow",
               "Principal": {
                   "Service": "pods.eks.amazonaws.com"
               },
               "Action": [
                   "sts:AssumeRole",
                   "sts:TagSession"
               ]
           }
       ]
   }
   ```

    `sts:AssumeRole`：EKS Pod 身分識別會先使用 `AssumeRole` 來擔任 IAM 角色，然後將臨時憑證傳至您的 Pod。

    `sts:TagSession` — EKS Pod Identity 使用 `TagSession` 在對 AWS STS 的請求中包含*工作階段標籤*。

   您可以在信任政策的*條件索引鍵*中使用這些標籤，用來限制哪些服務帳戶、命名空間和叢集可以使用此角色。

   如需 Amazon EKS 條件金鑰的清單，請參閱*服務授權參考*中的 [Amazon Elastic Kubernetes Service 定義的條件](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-policy-keys)。若要了解您可以搭配哪些動作和資源使用條件索引鍵，請參閱 [Amazon Elastic Kubernetes Service 定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-actions-as-permissions)。

1. 針對 **Kubernetes 命名空間**，選取包含服務帳戶和工作負載的 Kubernetes 命名空間。或者，您可以使用名稱 (不存在於叢集中) 指定命名空間。

1. 針對 **Kubernetes 服務帳戶**，選取要使用的 Kubernetes 服務帳戶。Kubernetes 工作負載的清單檔案必須指定此服務帳戶。或者，您可以使用名稱 (不存在於叢集中) 指定服務帳戶。

1. （選用） 選取**停用工作階段標籤**，以停用 Pod Identity 在擔任角色時自動新增的預設工作階段標籤。

1. （選用） 切換 **設定工作階段政策**以設定 IAM 政策，將超出連接至 IAM 角色之 IAM 政策中定義之許可的其他限制套用至此 Pod Identity 關聯。
**注意**  
只有在核取**停用工作階段標籤設定時，才能套用工作階段**政策。

1. (選用) 對於**標籤**，請選擇**新增標籤**，以在鍵值對中新增中繼資料。這些標籤會套用至關聯，可用於 IAM 政策。

   您可以多次重複此步驟以新增多個標籤。

1. 選擇**建立**。

## 建立 Pod 身分關聯 (AWS CLI)
<a name="create_a_pod_identity_association_shared_aws_cli"></a>

1. 如果您要將現有 IAM 政策與 IAM 角色建立關聯，請跳到下一步驟。

   建立 IAM 政策。您可以建立自己的政策，或複製已授予部分所需許可的 AWS 受管政策，並根據您的特定需求進行自訂。如需詳細資訊，請參閱《IAM 使用者指南》**中的[建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

   1. 建立檔案，其中包含您希望 Pod 存取 AWS 之服務的許可。如需所有 AWS 服務的所有動作清單，請參閱[服務授權參考](https://docs.aws.amazon.com/service-authorization/latest/reference/)。

      您可以執行以下命令來建立允許唯讀存取 Amazon S3 儲存貯體的範例政策檔案。您可以選擇性地將組態資訊或引導指令碼存放在此儲存貯體中，而 Pod 中的容器可從儲存貯體讀取檔案，並載入至您的應用程式。如果您要建立此範例政策，請將以下內容複製到您的裝置。將 *my-pod-secrets-bucket* 取代為您的儲存貯體名稱並執行命令。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "s3:GetObject",
                  "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
              }
          ]
      }
      ```

   1. 建立 IAM 政策。

      ```
      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
      ```

1. 建立 IAM 角色並與 Kubernetes 服務帳戶建立關聯。

   1. 如果您有要擔任 IAM 角色的現有 Kubernetes 服務帳戶，則可略過此步驟。

      建立 Kubernetes 服務帳戶。將以下內容複製到您的裝置。視需要將 *my-service-account* 取代為您要使用的名稱，將 *default* 取代為其他命名空間。如果您變更 *default*，命名空間必須已經存在。

      ```
      cat >my-service-account.yaml <<EOF
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: my-service-account
        namespace: default
      EOF
      kubectl apply -f my-service-account.yaml
      ```

      執行下列命令。

      ```
      kubectl apply -f my-service-account.yaml
      ```

   1. 執行下列命令以建立 IAM 角色的信任政策檔案。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "pods.eks.amazonaws.com"
                  },
                  "Action": [
                      "sts:AssumeRole",
                      "sts:TagSession"
                  ]
              }
          ]
      }
      ```

   1. 建立角色。將 *my-role* 取代為您的 IAM 角色名稱，並將 *my-role-description* 取代為您角色的描述。

      ```
      aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
      ```

   1. 將 IAM 政策連接至您的角色。將 *my-role* 取代為您的 IAM 角色名稱，將 *my-policy* 取代為您建立的現有政策名稱。

      ```
      aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws: iam::111122223333:policy/my-policy
      ```
**注意**  
與服務帳戶的 IAM 角色不同，EKS Pod 身分識別不會在服務帳戶上使用註釋。

   1. 執行下列命令以建立關聯。視需要使用叢集名稱取代 `my-cluster`，使用您要使用的名稱取代 *my-service-account*，使用其他命名空間取代 *default*。

      ```
      aws eks create-pod-identity-association --cluster-name my-cluster --role-arn arn:aws: iam::111122223333:role/my-role --namespace default --service-account my-service-account
      ```

      範例輸出如下。

      ```
      {
          "association": {
              "clusterName": "my-cluster",
              "namespace": "default",
              "serviceAccount": "my-service-account",
              "roleArn": "arn:aws: iam::111122223333:role/my-role",
              "associationArn": "arn:aws::111122223333:podidentityassociation/my-cluster/a-abcdefghijklmnop1",
              "associationId": "a-abcdefghijklmnop1",
              "tags": {},
              "createdAt": 1700862734.922,
              "modifiedAt": 1700862734.922
          }
      }
      ```
**注意**  
您可以使用名稱 (不存在於叢集中) 指定命名空間和服務帳戶。您必須建立命名空間、服務帳戶以及使用服務帳戶進行 EKS Pod 身分識別關聯才能運作的工作負載。

## 確認組態
<a name="pod-id-confirm-role-configuration"></a>

1. 確認 IAM 角色的信任政策設定正確。

   ```
   aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument
   ```

   範例輸出如下。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Allow EKS Auth service to assume this role for Pod Identities",
               "Effect": "Allow",
               "Principal": {
                   "Service": "pods.eks.amazonaws.com"
               },
               "Action": [
                   "sts:AssumeRole",
                   "sts:TagSession"
               ]
           }
       ]
   }
   ```

1. 確認您在上一步連接至角色的政策已連接至該角色。

   ```
   aws iam list-attached-role-policies --role-name my-role --query 'AttachedPolicies[].PolicyArn' --output text
   ```

   範例輸出如下。

   ```
    arn:aws: iam::111122223333:policy/my-policy
   ```

1. 設定變數以存放您要使用之政策的 Amazon Resource Name (ARN)。將 *my-policy* 取代為您要確認許可的政策名稱。

   ```
   export policy_arn=arn:aws: iam::111122223333:policy/my-policy
   ```

1. 檢視預設政策版本。

   ```
   aws iam get-policy --policy-arn $policy_arn
   ```

   範例輸出如下。

   ```
   {
       "Policy": {
           "PolicyName": "my-policy",
           "PolicyId": "EXAMPLEBIOWGLDEXAMPLE",
           "Arn": "arn:aws: iam::111122223333:policy/my-policy",
           "Path": "/",
           "DefaultVersionId": "v1",
           [...]
       }
   }
   ```

1. 檢視政策內容，以確定政策包含您的 Pod 需要的所有許可。視需要將以下命令中的 *1* 取代為上一個輸出中傳回的版本。

   ```
   aws iam get-policy-version --policy-arn $policy_arn --version-id v1
   ```

   範例輸出如下。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
           }
       ]
   }
   ```

   如果您在上一步建立了範例政策，則輸出結果相同。如果您建立了不同的政策，則 *example* 內容有所不同。

## 後續步驟
<a name="_next_steps"></a>

 [設定 Pod 以使用 AWS 服務帳戶存取 服務](pod-id-configure-pods.md) 

# 使用 EKS Pod 身分目標 IAM 角色存取 AWS 資源
<a name="pod-id-assign-target-role"></a>

在 Amazon Elastic Kubernetes Service (Amazon EKS) 上執行應用程式時，您可能需要存取存在於不同 AWS 帳戶中 AWS 的資源。本指南說明如何使用 EKS Pod Identity 設定跨帳戶存取，這可讓您的 Kubernetes Pod 使用目標角色存取其他 AWS 資源。

## 先決條件
<a name="_prerequisites"></a>

開始之前，請確保您已完成下列步驟：
+  [設定 Amazon EKS Pod 身分識別代理程式](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html) 
+  [建立 EKS Pod 身分識別角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) 

## 運作方式
<a name="_how_it_works"></a>

Pod Identity 可讓 EKS 叢集中的應用程式透過稱為角色鏈結的程序跨帳戶存取 AWS 資源。

建立 Pod Identity 關聯時，您可以提供兩個 IAM 角色：與 [EKS 叢集位於相同帳戶中的 EKS Pod Identity 角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)，以及包含您要存取 AWS 之資源的帳戶的目標 IAM 角色 （例如 S3 儲存貯體或 RDS 資料庫）。由於 [IAM PassRole](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_iam-passrole-service.html) 需求，[EKS Pod 身分角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)必須位於 EKS 叢集的帳戶中，而目標 IAM 角色可以位於任何 AWS 帳戶中。PassRole 可讓 AWS 實體將角色假設委派給其他服務。EKS Pod Identity 使用 PassRole 將角色連線至 Kubernetes 服務帳戶，要求角色和傳遞該角色的身分都與 EKS 叢集位於相同的 AWS 帳戶中。當您的應用程式 Pod 需要存取 AWS 資源時，它會向 Pod Identity 請求登入資料。Pod 身分識別隨後可自動依序執行兩項角色擔任：首先擔任 [EKS Pod 身分識別角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)，然後使用這些憑證來擔任目標 IAM 角色。此程序為您的 Pod 提供暫時登入資料，該登入資料具有目標角色中定義的許可，允許安全存取其他 AWS 帳戶中的資源。

## 快取考量
<a name="_caching_considerations"></a>

由於採用快取機制，對現有 Pod 身分識別關聯中 IAM 角色更新，可能不會在 EKS 叢集上執行的 Pod 中立即生效。Pod 身分識別代理程式可依據擷取憑證時關聯的組態來快取 IAM 憑證。若關聯僅包括 [EKS Pod 身分識別角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)，而不含目標 IAM 角色，快取憑證則可持續 6 小時。若關聯包括 [EKS Pod 身分識別角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) ARN 與目標 IAM 角色，快取憑證則可持續 59 分鐘。修改現有關聯，如更新 [EKS Pod 身分識別角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) ARN 或新增目標 IAM 角色，不會對現有快取進行重設。因此，代理程式不會識別更新，直至快取憑證資料重新整理。如需加速套用變更，您可重新建立現有 Pod；否則，您將需要等候快取到期。

## 步驟 1：建立目標 IAM 角色並與之關聯
<a name="_step_1_create_and_associate_a_target_iam_role"></a>

在此步驟中，您將建立並設定目標 IAM 角色，藉此來建立安全的信任鏈。為了示範，我們將建立新的目標 IAM 角色，以在兩個 AWS 帳戶之間建立信任鏈：[EKS 叢集帳戶中的 EKS Pod 身分角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) （例如 `eks-pod-identity-primary-role`) 取得在您的目標帳戶中擔任目標 IAM 角色 （例如 `eks-pod-identity-aws-resources`) 的許可，以允許存取 Amazon S3 儲存貯體等 AWS 資源。 AWS 

### 建立目標 IAM 角色
<a name="_create_the_target_iam_role"></a>

1. 開啟 [Amazon IAM 主控台](https://console.aws.amazon.com/iam/home)。

1. 在頂端導覽列中，確認您已登入帳戶，其中包含目標 IAM 角色 AWS 的資源 （例如 S3 儲存貯體或 DynamoDB 資料表）。

1. 在左側導覽窗格中，選擇 **Roles** (角色)。

1. 選擇**建立角色**按鈕，然後選擇「可信任實體類型」下的** AWS 帳戶**。

1. 選擇**另一個 AWS 帳戶**，輸入 AWS 您的帳戶號碼 ([EKS Pod 身分角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)所在的帳戶），然後選擇**下一步**。

1. 新增您想要關聯角色的許可政策 (例如 AmazonS3FullAccess)，然後選擇**下一步**。

1. 輸入角色名稱 (例如 `MyCustomIAMTargetRole`)，然後選擇**建立角色**。

### 更新目標 IAM 角色信任政策
<a name="_update_the_target_iam_role_trust_policy"></a>

1. 建立角色之後，您將返回到**角色**清單。尋找並選取您在之前步驟中建立的角色政策 (例如 `MyCustomIAMTargetRole`)。

1. 選取**信任關係**標籤。

1. 點選右側的**編輯信任政策**。

1. 在政策編輯器中，使用您的信任政策來取代預設 JSON。將角色名稱和 IAM 角色 ARN `111122223333`中的預留位置值取代為託管 EKS 叢集 AWS 的帳戶 ID。此外，您亦可選擇在角色信任政策中使用 PrincipalTags，以便僅授權指定叢集與命名空間的特定服務帳戶來擔任目標角色。例如：

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/eks-cluster-arn": "arn:aws:eks:us-east-1:111122223333:cluster/example-cluster",
          "aws:RequestTag/kubernetes-namespace": "ExampleNameSpace",
          "aws:RequestTag/kubernetes-service-account": "ExampleServiceAccountName"
        },
        "ArnEquals": {
          "aws:PrincipalARN": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role"
        }
      }
    }
  ]
}
```

上述政策可讓`eks-pod-identeity-primary-role` AWS 帳戶 111122223333 中具有相關 [EKS Pod Identity Session 標籤](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-abac.html)的角色擔任此角色。

若您在 EKS Pod 身分識別中[停用工作階段標籤](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-abac.html#pod-id-abac-tags)，EKS Pod 身分識別亦可在擔任目標角色時，利用 Pod 的叢集、命名空間及服務帳戶相關資訊來設定 `sts:ExternalId`。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "region/111122223333/cluster-name/namespace/service-account-name"
        },
        "ArnEquals": {
          "aws:PrincipalARN": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "sts:TagSession"
    }
  ]
}
```

藉助上述政策，可確保僅預期的叢集、命名空間及服務帳戶擔任目標角色。

### 更新 EKS Pod 身分識別角色的許可政策
<a name="_update_the_permission_policy_for_eks_pod_identity_role"></a>

在此步驟中，您將新增目標 IAM 角色 ARN 作為資源，藉此來更新與 Amazon EKS 叢集關聯的 [EKS Pod 身分識別](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)角色的許可政策。

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左側導覽窗格中，選取**叢集**，然後選取 EKS 叢集的名稱。

1. 選擇**存取**索引標籤。

1. 在 **Pod 身分識別關聯**項下，選取 [EKS Pod 身分識別角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)。

1. 依序選擇**許可**、**新增許可**、**建立內嵌政策**。

1. 在右側選擇 **JSON**。

1. 在政策編輯器中，使用您的許可政策來取代預設 JSON。使用您的目標 IAM 角色，來取代 IAM 角色 ARN 中的角色名稱及 `222233334444` 的預留位置。例如：

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ],
            "Resource": "arn:aws:iam::222233334444:role/eks-pod-identity-aws-resources"
        }
    ]
}
```

## 步驟 2：關聯目標 IAM 角色與 Kubernetes 服務帳戶
<a name="_step_2_associate_the_target_iam_role_to_a_kubernetes_service_account"></a>

在此步驟中，您將在 EKS 叢集中的目標 IAM 角色與 Kubernetes 服務帳戶間建立關聯。

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左側導覽窗格中，選取**叢集**，然後選取您想要新增關聯的目標叢集的名稱。

1. 選擇**存取**索引標籤。

1. 在 **Pod 身分識別關聯**中，選擇**建立**。

1. 針對您想要其擔任角色的工作負載，選擇 **IAM 角色**中的 [EKS Pod 身分識別角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)。

1. 在**目標 IAM 角色**中選擇目標 IAM 角色，將由 [EKS Pod 身分識別角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)擔任。

1. 在 **Kubernetes 命名空間**欄位，輸入您想要建立關聯的命名空間名稱 (例如 `my-app-namespace`)。這將定義服務帳戶所在的位置。

1. 在 **Kubernetes 服務帳戶**欄位，輸入將會使用 IAM 憑證的服務帳戶名稱 (例如 `my-service-account`)。這將連結 IAM 角色至服務帳戶。

1. （選用） 選取**停用工作階段標籤**，以停用 Pod Identity 在擔任角色時自動新增的預設工作階段標籤。

1. （選用） 切換 **設定工作階段政策**以設定 IAM 政策，將超出連接至**目標 IAM 角色之 IAM 政策中定義之許可的額外限制套用至此 Pod Identity **關聯。
**注意**  
1. 只有在核取**停用工作階段標籤設定時，才能套用工作階段**政策。2. 如果您指定工作階段政策，則政策限制適用於**目標 IAM 角色**的許可，而不是與此 Pod Identity 關聯相關聯的 **IAM 角色**。

1. 選擇**建立**可建立關聯。

# 設定 Pod 以使用 AWS 服務帳戶存取 服務
<a name="pod-id-configure-pods"></a>

如果 Pod 需要存取 AWS 服務，則必須將其設定為使用 Kubernetes 服務帳戶。服務帳戶必須與具有存取 AWS 服務許可的 AWS Identity and Access Management (IAM) 角色相關聯。
+ 現有的叢集。如果您沒有，則可以使用其中一個 [開始使用 Amazon EKS](getting-started.md) 指南來建立一個。
+ 將服務帳戶與 IAM 角色建立關聯的現有 Kubernetes 服務帳戶和 EKS Pod 身分識別關聯。角色必須具有關聯的 IAM 政策，其中包含您希望 Pod 必須使用 AWS 服務的許可。如需有關服務帳戶和角色之建立和設定方式的詳細資訊，請參閱[指派 IAM 角色至 Kubernetes 服務帳戶](pod-id-association.md)。
+ 在您的裝置或 AWS CloudShell 上安裝和設定的最新版本 AWS CLI。您可以使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1` 來檢查您的目前版本。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 AWS 命令列界面使用者指南》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)安裝在 AWS CloudShell 中的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《 AWS CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 Kubernetes 版本相同，或是為最多比該版本更舊一版或更新一版的次要版本。例如，如果您的叢集版本為 `1.29`，則可以搭配使用 `kubectl` `1.28`、`1.29` 或 `1.30` 版。若要安裝或升級 `kubectl`，請參閱 [設定 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含叢集組態的現有 `kubectl` `config` 檔案。若要建立 `kubectl` `config` 檔案，請參閱[透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集](create-kubeconfig.md)。

  1. 使用以下命令，以建立部署清單檔案，讓您可部署 Pod 以確認組態。以您自己的值取代範例值。

     ```
     cat >my-deployment.yaml <<EOF
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: my-app
     spec:
       selector:
         matchLabels:
           app: my-app
       template:
         metadata:
           labels:
             app: my-app
         spec:
           serviceAccountName: my-service-account
           containers:
           - name: my-app
             image: public.ecr.aws/nginx/nginx:X.XX
     EOF
     ```

  1. 將清單檔案部署到叢集。

     ```
     kubectl apply -f my-deployment.yaml
     ```

  1. 確認您的 Pod 有必要的環境變數。

     1. 檢視使用上一步中的部署作業進行部署的 Pod。

        ```
        kubectl get pods | grep my-app
        ```

        範例輸出如下。

        ```
        my-app-6f4dfff6cb-76cv9   1/1     Running   0          3m28s
        ```

     1. 確認 Pod 具有服務帳戶字符檔案掛載。

        ```
        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE:
        ```

        範例輸出如下。

        ```
        AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE:  /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token
        ```

  1. 確認您的 Pod 可以使用您在連接至角色的 IAM 政策中指派的許可與 AWS 服務互動。
**注意**  
當 Pod 使用與服務帳戶相關聯的 IAM 角色 AWS 登入資料時，該 Pod 容器中的 AWS CLI 或其他 SDKs 會使用該角色提供的登入資料。如果您沒有對提供給 [Amazon EKS 節點 IAM 角色](create-node-role.md)的憑證限制存取權，則 Pod 仍然可以存取這些認證。如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

     如果您的 Pod 無法如預期與服務互動，請完成以下步驟以確認所有項目都已正確設定。

     1. 確認您的 Pod 使用支援透過 EKS Pod Identity 關聯擔任 IAM 角色的 AWS SDK 版本。如需詳細資訊，請參閱[將 Pod 身分識別與 AWS SDK 搭配使用](pod-id-minimum-sdk.md)。

     1. 確認部署使用服務帳戶。

        ```
        kubectl describe deployment my-app | grep "Service Account"
        ```

        範例輸出如下。

        ```
        Service Account:  my-service-account
        ```

# 根據標籤授予 Pod 對 AWS 資源的存取權
<a name="pod-id-abac"></a>

屬性型存取控制 (ABAC) 透過結合屬性的政策，來向使用者授予權限。EKS Pod 身分識別會將標籤連接至具有叢集名稱、命名空間與服務帳戶名稱等屬性的每個 Pod 的臨時憑證。這些角色工作階段標籤可讓管理員撰寫單一角色，以根據相符的標籤存取 AWS 資源，跨服務帳戶運作。透過新增對角色工作階段標籤的支援，您可以在叢集之間和叢集內的工作負載之間強制執行更嚴格的安全界限，同時重複使用相同的 IAM 角色和 IAM 政策。

## 使用標籤的範例政策
<a name="_sample_policy_with_tags"></a>

下面是一個 IAM 政策範例，該政策在對應物件以 EKS 叢集名稱標記時授予 `s3:GetObject` 許可。

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectTagging"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/eks-cluster-name": "${aws:PrincipalTag/eks-cluster-name}"
                }
            }
        }
    ]
}
```

## 啟用或停用工作階段標籤
<a name="pod-id-abac-tags"></a>

EKS Pod 身分識別會在擔任角色時，新增一組預先定義的工作階段標籤。這些工作階段標籤可讓管理員撰寫單一角色，允許根據相符標籤存取 AWS 資源，以跨資源運作。

### 啟用工作階段標籤
<a name="_enable_session_tags"></a>

工作階段標籤可透過 EKS Pod 身分識別自動啟用，您無須執行任何操作。EKS Pod 身分識別預設會將預先定義的標籤集連接至工作階段。如需在政策中參考這些標籤，可在標籤索引鍵後使用語法 `${aws:PrincipalTag/`。例如 `${aws:PrincipalTag/kubernetes-namespace}`。
+  `eks-cluster-arn` 
+  `eks-cluster-name` 
+  `kubernetes-namespace` 
+  `kubernetes-service-account` 
+  `kubernetes-pod-name` 
+  `kubernetes-pod-uid` 

### 停用工作階段標籤
<a name="_disable_session_tags"></a>

 AWS 會將內嵌工作階段政策、受管政策 ARNs 和工作階段標籤壓縮為具有個別限制的封裝二進位格式。如果您收到 `PackedPolicyTooLarge` 錯誤，指出封裝二進位格式超過大小限制，您可嘗試停用 EKS Pod 身分識別新增的工作階段標籤來縮減該大小。如需停用這些工作階段標籤，遵循以下步驟操作：

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左側導覽窗格中，選取**叢集**，然後選取您想要修改的叢集名稱。

1. 選擇**存取**索引標籤。

1. 在 **Pod 身分識別關聯**中，選擇您想要在**關聯 ID** 中修改的關聯 ID，然後選擇**編輯**。

1. 在**工作階段標籤**項下，選擇**停用工作階段標籤**。

1. 選擇**儲存變更**。

## 跨帳戶標籤
<a name="pod-id-abac-chaining"></a>

EKS Pod 身分識別新增的所有工作階段標籤都可*轉移*；標籤金鑰和值會傳遞至工作負載用於將角色切換至其他帳戶的任何 `AssumeRole` 動作。您可以在其他帳戶的政策中使用這些標籤，以限制跨帳戶情況中的存取。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[使用工作階段標籤鏈結角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining)。

## 自訂標籤
<a name="pod-id-abac-custom-tags"></a>

EKS Pod 身分識別無法將其他自訂標籤新增至其執行的 `AssumeRole` 動作。不過，您套用至 IAM 角色的標籤永遠都可以使用，但格式相同：`${aws:PrincipalTag/` 後面是金鑰，例如 `${aws:PrincipalTag/MyCustomTag}`。

**注意**  
在發生衝突的情況下，透過 `sts:AssumeRole` 請求新增至工作階段的標籤具有優先順序。舉例來說，假設：  
EKS 擔任客戶角色時，Amazon EKS 將鍵 `eks-cluster-name` 和值 `my-cluster` 新增至工作階段，並且
您將 `eks-cluster-name` 標籤新增至具有值 `my-own-cluster` 的 IAM 角色。
在這種情況下，前者優先，`eks-cluster-name` 標籤的值會是 `my-cluster`。

# 將 Pod 身分識別與 AWS SDK 搭配使用
<a name="pod-id-minimum-sdk"></a>

## 使用 EKS Pod 身分識別憑證
<a name="pod-id-using-creds"></a>

若要使用來自 EKS Pod 身分識別關聯的憑證，您的程式碼可以使用任何 AWS SDK 來為具有 SDK 的 AWS 服務建立用戶端，並且依預設，SDK 會在位置鏈中搜尋要使用的 AWS Identity and Access Management 憑證。如果您在建立用戶端或以其他方式初始化 SDK 時未指定憑證提供者，則系統會使用 EKS Pod 身分識別憑證。

這樣是有效的，因為 EKS Pod 身分識別已新增至*容器憑證提供者*，系統會在預設憑證鏈中的某個步驟搜尋此提供者。如果您的工作負載目前使用憑證鏈中較早的憑證，那麼即使您為相同工作負載設定 EKS Pod 身分識別關聯，系統仍會繼續使用這些憑證。

如需 EKS Pod 身分識別運作方式的詳細資訊，請參閱 [了解 EKS Pod 身分識別的運作方式](pod-id-how-it-works.md)。

使用[了解 EKS Pod 身分識別如何授予 Pod 對 AWS 服務的存取權](pod-identities.md)時，Pod 中的容器使用的 AWS SDK 版本，必須支援從 EKS Pod 身分識別代理程式擔任 IAM 角色。請確保您的 AWS SDK 使用以下版本或更新版本：
+ Java (版本 2) – [2.21.30](https://github.com/aws/aws-sdk-java-v2/releases/tag/2.21.30) 
+ Java – [1.12.746](https://github.com/aws/aws-sdk-java/releases/tag/1.12.746) 
+ Go v1 – [v1.47.11](https://github.com/aws/aws-sdk-go/releases/tag/v1.47.11) 
+ Go v2 – [release-2023-11-14](https://github.com/aws/aws-sdk-go-v2/releases/tag/release-2023-11-14) 
+ Python (Boto3) – [1.34.41](https://github.com/boto/boto3/releases/tag/1.34.41) 
+ Python (botocore) – [1.34.41](https://github.com/boto/botocore/releases/tag/1.34.41) 
+  AWS CLI – [1.30.0](https://github.com/aws/aws-cli/releases/tag/1.30.0) 

   AWS CLI – [2.15.0](https://github.com/aws/aws-cli/releases/tag/2.15.0) 
+ JavaScript v2 – [2.1550.0](https://github.com/aws/aws-sdk-js/releases/tag/v2.1550.0) 
+ JavaScript v3 – [v3.458.0](https://github.com/aws/aws-sdk-js-v3/releases/tag/v3.458.0) 
+ Kotlin – [v1.0.1](https://github.com/awslabs/aws-sdk-kotlin/releases/tag/v1.0.1) 
+ Ruby – [3.188.0](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-core/CHANGELOG.md#31880-2023-11-22) 
+ Rust – [版本-2024-03-13](https://github.com/awslabs/aws-sdk-rust/releases/tag/release-2024-03-13) 
+ C\$1\$1 – [1.11.263](https://github.com/aws/aws-sdk-cpp/releases/tag/1.11.263) 
+ .NET – [3.7.734.0](https://github.com/aws/aws-sdk-net/releases/tag/3.7.734.0) 
+ PowerShell – [4.1.502](https://www.powershellgallery.com/packages/AWS.Tools.Common/4.1.502) 
+ PHP – [3.289.0](https://github.com/aws/aws-sdk-php/releases/tag/3.287.1) 

為了確保您使用支援的 SDK，在建立您的容器時，請遵循[在 AWS 上建立的工具](https://aws.amazon.com/tools/)中您偏好之 SDK 的安裝指示。

若要了解支援 EKS Pod 身分識別的附加元件清單，請參閱 [Pod 身分識別支援參考](retreive-iam-info.md#pod-id-add-on-versions)。

# 在 EKS Pod 身分識別代理程式中停用 `IPv6`
<a name="pod-id-agent-config-ipv6"></a>

## AWS 管理主控台
<a name="pod-id-console"></a>

1. 如需在 EKS Pod 身分識別代理程式中停用 `IPv6`，可新增以下組態至 EKS 附加元件的**選用組態設定**。

   1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

   1. 在左側導覽窗格中，選取 **Clusters** (叢集)，然後選取您要為其設定附加元件之叢集的名稱。

   1. 選擇**附加元件**索引標籤。

   1. 選取 EKS Pod 身分識別代理程式附加元件方塊右上方的方塊，然後選擇**編輯**。

   1. 在**設定 EKS Pod 身分識別代理程式**頁面：

      1. 選取您要使用的**版本**。建議您保留與上一步驟相同的版本，並執行單獨的動作來更新版本與組態。

      1. 展開**選用組態設定**。

      1. 請輸入**組態值**中包含索引鍵 `"additionalArgs":` 的巢狀 JSON 物件的 JSON 索引鍵 `"agent":` 和值。產生的文字必須是有效的 JSON 物件。如果此金鑰和值是文字方塊中唯一的資料，請以大括號 `{ }` 括住該金鑰和值。以下範例顯示已啟用網路政策：

         ```
         {
             "agent": {
                 "additionalArgs": {
                     "-b": "169.254.170.23"
                 }
             }
         }
         ```

         此組態將 `IPv4` 位址設定為代理程式使用的唯一位址。

   1. 如需透過取代 EKS Pod 身分識別代理程式 Pod 來套用新的組態，選擇**儲存變更**。

      Amazon EKS 藉由*推展*適用於 EKS Pod 身分識別代理程式的 Kubernetes `DaemonSet`，來套用變更至 EKS 附加元件。您可在 AWS 管理主控台 的附加元件**更新歷程記錄**中，以及透過 `kubectl rollout status daemonset/eks-pod-identity-agent --namespace kube-system` 來追蹤推展狀態。

       `kubectl rollout` 具有下列命令：

      ```
      $ kubectl rollout
      
      history  -- View rollout history
      pause    -- Mark the provided resource as paused
      restart  -- Restart a resource
      resume   -- Resume a paused resource
      status   -- Show the status of the rollout
      undo     -- Undo a previous rollout
      ```

      若推展時間太長，Amazon EKS 會復原推展，並且類型為**附加元件更新**及狀態為**失敗**的訊息，則會新增至附加元件的**更新歷程記錄**。如需對任何問題展開調查，請從推展歷程記錄著手，並在 EKS Pod 身分識別代理程式 Pod 上執行 `kubectl logs`，以查看 EKSPod 身分識別代理程式的日誌。

1. 若**更新歷程記錄**中新項目的狀態為**成功**，則表示推展已完成，並且在所有 EKS Pod 身分識別代理程式 Pod 中，附加元件均會使用新的組態。

## AWS CLI
<a name="pod-id-cli"></a>

1. 如需在 EKS Pod 身分識別代理程式中停用 `IPv6`，可新增以下組態至 EKS 附加元件的**組態值**。

   執行下列 AWS CLI 命令。將 `my-cluster` 取代為您的叢集名稱，並將 IAM 角色 ARN 取代為您正在使用的角色。

   ```
   aws eks update-addon --cluster-name my-cluster --addon-name eks-pod-identity-agent \
       --resolve-conflicts PRESERVE --configuration-values '{"agent":{"additionalArgs": { "-b": "169.254.170.23"}}}'
   ```

   此組態將 `IPv4` 位址設定為代理程式使用的唯一位址。

   Amazon EKS 藉由*推展*適用於 EKS Pod 身分識別代理程式的 Kubernetes DaemonSet，來套用變更至 EKS 附加元件。您可在 AWS 管理主控台 的附加元件**更新歷程記錄**中，以及透過 `kubectl rollout status daemonset/eks-pod-identity-agent --namespace kube-system` 來追蹤推展狀態。

    `kubectl rollout` 具有下列命令：

   ```
   kubectl rollout
   
   history  -- View rollout history
   pause    -- Mark the provided resource as paused
   restart  -- Restart a resource
   resume   -- Resume a paused resource
   status   -- Show the status of the rollout
   undo     -- Undo a previous rollout
   ```

   若推展時間太長，Amazon EKS 會復原推展，並且類型為**附加元件更新**及狀態為**失敗**的訊息，則會新增至附加元件的**更新歷程記錄**。如需對任何問題展開調查，請從推展歷程記錄著手，並在 EKS Pod 身分識別代理程式 Pod 上執行 `kubectl logs`，以查看 EKSPod 身分識別代理程式的日誌。

# 透過 EKS Pod 身分識別所需的信任政策來建立 IAM 角色
<a name="pod-id-role"></a>

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
            "Effect": "Allow",
            "Principal": {
                "Service": "pods.eks.amazonaws.com"
            },
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ]
        }
    ]
}
```

 ** `sts:AssumeRole` **   
EKS Pod 身分識別會先使用 `AssumeRole` 來擔任 IAM 角色，然後將臨時憑證傳至您的 Pod。

 ** `sts:TagSession` **   
EKS Pod Identity 使用 `TagSession` 在對 AWS STS 的請求中包含*工作階段標籤*。

 **設定條件**   
您可以在信任政策的*條件索引鍵*中使用這些標籤，用來限制哪些服務帳戶、命名空間和叢集可以使用此角色。若要了解 Pod 身分識別新增的請求標籤清單，請參閱 [啟用或停用工作階段標籤](pod-id-abac.md#pod-id-abac-tags)。  
舉例來說，您可透過包含新增的 `Condition` 的下列信任政策，來限制哪些 Pod 可擔任 Pod 身分識別 IAM 角色，且限制為特定的 `ServiceAccount` 和 `Namespace`：

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
            "Effect": "Allow",
            "Principal": {
                "Service": "pods.eks.amazonaws.com"
            },
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/kubernetes-namespace": [
                        "Namespace"
                    ],
                    "aws:RequestTag/kubernetes-service-account": [
                        "ServiceAccount"
                    ]
                }
            }
        }
    ]
}
```

如需 Amazon EKS 條件金鑰的清單，請參閱*服務授權參考*中的 [Amazon Elastic Kubernetes Service 定義的條件](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-policy-keys)。若要了解您可以搭配哪些動作和資源使用條件索引鍵，請參閱 [Amazon Elastic Kubernetes Service 定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-actions-as-permissions)。