

 **協助改進此頁面** 

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

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

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

# 將 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) 