

 **協助改進此頁面** 

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

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

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

# 為服務帳戶設定 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
   ```