

 **協助改進此頁面** 

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

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

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

# 藉助 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)。