

 **協助改進此頁面** 

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

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

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

# 服務帳戶的 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"}]}
   ```