

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

# 步驟 1：設定 Amazon EKS 叢集和設定 IAM 許可
<a name="EKS-tutorial-step1"></a>

**設定 Amazon EKS 叢集並建立允許 Amazon EKS 服務帳戶連線到 Amazon Keyspaces 資料表所需的 IAM 資源**

1. 為 Amazon EKS 叢集建立 Open ID Connect (OIDC) 提供者。這是針對服務帳戶使用 IAM 角色的必要條件。如需 OIDC 提供者以及如何建立它們的詳細資訊，請參閱《*Amazon EKS 使用者指南*》中的[為您的叢集建立 IAM OIDC 提供者](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。

   1. 使用下列命令為您的叢集建立 IAM OIDC 身分提供者。此範例假設您的叢集名稱為 `my-eks-cluster`。如果您有不同名稱的叢集，請記得更新所有未來命令中的名稱。

      ```
      eksctl utils associate-iam-oidc-provider --cluster my-eks-cluster --approve 
      ```

   1. 確認 OIDC 身分提供者已使用下列命令向 IAM 註冊。

      ```
      aws iam list-open-id-connect-providers --region us-east-1
      ```

      輸出看起來應該與此類似。請記下 OIDC 的 Amazon Resource Name (ARN)，當您為服務帳戶建立信任政策時，需要在下一個步驟中使用它。

      ```
      {
          "OpenIDConnectProviderList": [
              ..
              {
                  "Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
              }
          ]
      }
      ```

1. 為 Amazon EKS 叢集建立服務帳戶。服務帳戶為在 *Pod* 中執行的程序提供身分。Pod 是最小且最簡單的 Kubernetes 物件，可用來部署容器化應用程式。接著，建立服務帳戶可擔任的 IAM 角色，以取得 資源的許可。您可以從已設定為使用服務帳戶的 AWS Pod 存取任何服務，該帳戶可擔任具有該服務存取許可的 IAM 角色。

   1. 為服務帳戶建立新的命名空間。命名空間有助於隔離為此教學課程建立的叢集資源。您可以使用下列命令建立新的命名空間。

      ```
      kubectl create namespace my-eks-namespace
      ```

   1. 若要使用自訂命名空間，您必須將其與 Fargate 設定檔建立關聯。下列程式碼為範例。

      ```
      eksctl create fargateprofile \
          --cluster my-eks-cluster \
          --name my-fargate-profile \
          --namespace my-eks-namespace \
          --labels *=*
      ```

   1. 使用下列命令，在 Amazon EKS 叢集`my-eks-namespace`的命名空間`my-eks-serviceaccount`中建立名稱為 的服務帳戶。

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

   1. 執行下列命令來建立信任政策檔案，指示 IAM 角色信任您的服務帳戶。在委託人可以擔任角色之前，需要此信任關係。您需要對 檔案進行下列編輯：
      + 針對 `Principal`，輸入 IAM 傳回命令的 ARN`list-open-id-connect-providers`。ARN 包含您的帳戶號碼和區域。
      + 在 `condition`陳述式中，取代 AWS 區域 和 OIDC ID。
      + 確認服務帳戶名稱和命名空間正確無誤。

      建立 IAM 角色時，您需要在下一個步驟中連接信任政策檔案。

      ```
      cat >trust-relationship.json <<EOF
      {
          "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:my-eks-namespace:my-eks-serviceaccount",
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
                      }
                  }
              }
          ]
      }
      EOF
      ```

      選用：您也可以在 `StringEquals`或 `StringLike`條件中新增多個項目，以允許多個服務帳戶或命名空間擔任該角色。若要讓您的服務帳戶在不同帳戶中 AWS 擔任 IAM 角色，請參閱《*Amazon EKS 使用者指南*》中的[跨帳戶 IAM 許可](https://docs.aws.amazon.com/eks/latest/userguide/cross-account-access.html)。

1. 使用要擔任`my-iam-role`的 Amazon EKS 服務帳戶的名稱建立 IAM 角色。將最後一個步驟中建立的信任政策檔案連接到角色。信任政策會指定 IAM 角色可信任的服務帳戶和 OIDC 提供者。

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

1. 連接存取政策，將 IAM 角色許可指派給 Amazon Keyspaces。

   1. 連接存取政策，以定義 IAM 角色可在特定 Amazon Keyspaces 資源上執行的動作。在本教學課程中，我們使用 AWS 受管政策 `AmazonKeyspacesFullAccess`，因為我們的應用程式會將資料寫入您的 Amazon Keyspaces 資料表。不過，做為最佳實務，建議建立實作最低權限原則的自訂存取政策。如需詳細資訊，請參閱[Amazon Keyspaces 如何與 IAM 搭配使用](security_iam_service-with-iam.md)。

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

      使用下列陳述式確認政策已成功連接至 IAM 角色。

      ```
      aws iam list-attached-role-policies --role-name my-iam-role
      ```

      輸出看起來應該像這樣。

      ```
      {
          "AttachedPolicies": [
              {
                  "PolicyName": "AmazonKeyspacesFullAccess",
                  "PolicyArn": "arn:aws:iam::aws:policy/AmazonKeyspacesFullAccess"
              }
          ]
      }
      ```

   1. 使用可以擔任的 IAM 角色的 Amazon Resource Name (ARN) 來標註服務帳戶。請務必使用您的帳戶 ID 更新角色 ARN。

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

1. 確認 IAM 角色和服務帳戶已正確設定。

   1. 確認 IAM 角色的信任政策已使用下列陳述式正確設定。

      ```
      aws iam get-role --role-name my-iam-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/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:my-eks-namespace:my-eks-serviceaccount"
                      }
                  }
              }
          ]
      }
      ```

   1. 確認 Amazon EKS 服務帳戶已標註 IAM 角色。

      ```
      kubectl describe serviceaccount my-eks-serviceaccount -n my-eks-namespace
      ```

      輸出看起來應該與此類似。

      ```
      Name: my-eks-serviceaccount 
      Namespace:my-eks-namespace
      Labels: <none>
      Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-iam-role 
      Image pull secrets: <none> 
      Mountable secrets: <none> 
      Tokens: <none> 
      [...]
      ```

在您建立 Amazon EKS 服務帳戶、IAM 角色並設定必要的關係和許可之後，請繼續[步驟 2：設定應用程式](EKS-tutorial-step2.md)。