

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

# 啟用 Amazon EMR on EKS 的叢集存取權
<a name="setting-up-cluster-access"></a>

下列各節顯示啟用叢集存取的幾種方式。第一種是使用 Amazon EKS 叢集存取管理 (CAM)，後一種是示範如何採取手動步驟來啟用叢集存取。

## 使用 EKS Access Entry 啟用叢集存取 （建議）
<a name="setting-up-cluster-access-cam-integration"></a>

**注意**  
ConfigMap `aws-auth` 已棄用。管理 Kubernetes APIs 存取的建議方法是[存取項目](https://docs.aws.amazon.com/eks/latest/userguide/access-entries.html)。

Amazon EMR 已與 [Amazon EKS 叢集存取管理 (CAM)](https://docs.aws.amazon.com/eks/latest/userguide/access-entries.html) 整合，因此您可以自動設定必要的 AuthN 和 AuthZ 政策，以在 Amazon EKS 叢集命名空間中執行 Amazon EMR Spark 任務。當您從 Amazon EKS 叢集命名空間建立虛擬叢集時，Amazon EMR 會自動設定所有必要的許可，因此您不需要在目前的工作流程中新增任何額外的步驟。

**注意**  
Amazon EMR 與 Amazon EKS CAM 整合僅支援新的 Amazon EMR on EKS 虛擬叢集。您無法遷移現有的虛擬叢集以使用此整合。

### 先決條件
<a name="setting-up-cluster-access-cam-integration-prereqs"></a>
+ 請確定您正在執行 2.15.3 版或更新版本的 AWS CLI
+ 您的 Amazon EKS 叢集必須位於 1.23 版或更新版本。

### 設定
<a name="setting-up-cluster-access-cam-integration-setup"></a>

若要從 Amazon EKS 設定 Amazon EMR 與 AccessEntry API 操作之間的整合，請確定您已完成下列項目：
+ 請確定 Amazon EKS 叢集`authenticationMode`的 設定為 `API_AND_CONFIG_MAP`。

  ```
  aws eks describe-cluster --name <eks-cluster-name>
  ```

  如果尚未設定，請將 `authenticationMode`設定為 `API_AND_CONFIG_MAP`。

  ```
  aws eks update-cluster-config 
      --name <eks-cluster-name> 
      --access-config authenticationMode=API_AND_CONFIG_MAP
  ```

  如需身分驗證模式的詳細資訊，請參閱[叢集身分驗證模式](https://docs.aws.amazon.com/eks/latest/userguide/access-entries.html#authentication-modes)。
+ 請確定您用來執行 `CreateVirtualCluster`和 `DeleteVirtualCluster` API 操作的 [IAM 角色](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-iam.html)也具有下列許可：

  ```
  {
    "Effect": "Allow",
    "Action": [
      "eks:CreateAccessEntry"
    ],
    "Resource": "arn:<AWS_PARTITION>:eks:<AWS_REGION>:<AWS_ACCOUNT_ID>:cluster/<EKS_CLUSTER_NAME>"
  }, 
  {
    "Effect": "Allow",
    "Action": [
      "eks:DescribeAccessEntry",
      "eks:DeleteAccessEntry",
      "eks:ListAssociatedAccessPolicies",
      "eks:AssociateAccessPolicy",
      "eks:DisassociateAccessPolicy"
    ],
    "Resource": "arn:<AWS_PARTITION>:eks:<AWS_REGION>:<AWS_ACCOUNT_ID>:access-entry/<EKS_CLUSTER_NAME>/role/<AWS_ACCOUNT_ID>/AWSServiceRoleForAmazonEMRContainers/*"
  }
  ```

### 概念和術語
<a name="setting-up-cluster-access-cam-integration-concepts"></a>

以下是與 Amazon EKS CAM 相關的術語和概念清單。
+ 虛擬叢集 (VC) – 在 Amazon EKS 中建立的命名空間邏輯表示法。這是 Amazon EKS 叢集命名空間的 1：1 連結。您可以使用它在指定命名空間內的 Amazon EKS 叢集上執行 Amazon EMR 工作負載。
+ 命名空間 – 隔離單一 EKS 叢集內資源群組的機制。
+ 存取政策 – 將存取權和動作授予 EKS 叢集中 IAM 角色的許可。
+ 存取項目 – 使用角色 arn 建立的項目。您可以將存取項目連結至存取政策，以在 Amazon EKS 叢集中指派特定許可。
+ EKS 存取項目整合虛擬叢集 – 使用來自 Amazon EKS 的[存取項目 API 操作](https://docs.aws.amazon.com/eks/latest/APIReference/API_Operations_Amazon_Elastic_Kubernetes_Service.html)建立的虛擬叢集。

## 使用 啟用叢集存取 `aws-auth`
<a name="setting-up-cluster-access-aws-auth"></a>

必須採取下列動作，以允許 Amazon EMR on EKS 存取叢集中的特定命名空間：建立 Kubernetes 角色、將角色繫結至 Kubernetes 使用者，以及將 Kubernetes 使用者映射至服務連結角色 [https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/using-service-linked-roles.html](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/using-service-linked-roles.html)。當 IAM 身分映射命令與 `emr-containers` 一起用作服務名稱時，會在 `eksctl` 中自動化這些動作。可以透過使用下列命令輕鬆執行這些操作。

```
eksctl create iamidentitymapping \
    --cluster my_eks_cluster \
    --namespace kubernetes_namespace \
    --service-name "emr-containers"
```

將 *my\$1eks\$1cluster* 取代為 Amazon EKS 叢集的名稱，並將 *kubernetes\$1namespace* 取代為執行 Amazon EMR 工作負載而建立的 Kubernetes 命名空間。

**重要**  
您必須使用上一個步驟 [設定 kubectl 和 eksctl 下載最新的 eksctl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)，才能使用此功能。

### 啟用 Amazon EMR on EKS 的叢集存取權的手動步驟
<a name="setting-up-cluster-access-manual"></a>

也可使用以下手動步驟來啟用 Amazon EMR on EKS 的叢集存取權。

1. **在特定命名空間中建立 Kubernetes 角色**

------
#### [ Amazon EKS 1.22 - 1.29 ]

   使用 Amazon EKS 1.22 - 1.29，執行下列命令在特定命名空間中建立 Kubernetes 角色。此角色將必要的 RBAC 許可授予 Amazon EMR on EKS。

   ```
   namespace=my-namespace
   cat - >>EOF | kubectl apply -f - >>namespace "${namespace}"
   apiVersion: rbac.authorization.k8s.io/v1
   kind: Role
   metadata:
     name: emr-containers
     namespace: ${namespace}
   rules:
     - apiGroups: [""]
       resources: ["namespaces"]
       verbs: ["get"]
     - apiGroups: [""]
       resources: ["serviceaccounts", "services", "configmaps", "events", "pods", "pods/log"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"]
     - apiGroups: [""]
       resources: ["secrets"]
       verbs: ["create", "patch", "delete", "watch"]
     - apiGroups: ["apps"]
       resources: ["statefulsets", "deployments"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
     - apiGroups: ["batch"]
       resources: ["jobs"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
     - apiGroups: ["extensions", "networking.k8s.io"]
       resources: ["ingresses"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
     - apiGroups: ["rbac.authorization.k8s.io"]
       resources: ["roles", "rolebindings"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"]
     - apiGroups: [""]
       resources: ["persistentvolumeclaims"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete",  "deletecollection", "annotate", "patch", "label"]
   EOF
   ```

------
#### [ Amazon EKS 1.21 and below ]

   使用 Amazon EKS 1.21 及以下版本，執行下列命令在特定命名空間中建立 Kubernetes 角色。此角色將必要的 RBAC 許可授予 Amazon EMR on EKS。

   ```
   namespace=my-namespace
   cat - >>EOF | kubectl apply -f - >>namespace "${namespace}"
   apiVersion: rbac.authorization.k8s.io/v1
   kind: Role
   metadata:
     name: emr-containers
     namespace: ${namespace}
   rules:
     - apiGroups: [""]
       resources: ["namespaces"]
       verbs: ["get"]
     - apiGroups: [""]
       resources: ["serviceaccounts", "services", "configmaps", "events", "pods", "pods/log"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"]
     - apiGroups: [""]
       resources: ["secrets"]
       verbs: ["create", "patch", "delete", "watch"]
     - apiGroups: ["apps"]
       resources: ["statefulsets", "deployments"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
     - apiGroups: ["batch"]
       resources: ["jobs"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
     - apiGroups: ["extensions"]
       resources: ["ingresses"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
     - apiGroups: ["rbac.authorization.k8s.io"]
       resources: ["roles", "rolebindings"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"]
     - apiGroups: [""]
       resources: ["persistentvolumeclaims"]
       verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"]
   EOF
   ```

------

1. **建立範圍為命名空間的 Kubernetes 角色繫結**

   執行下列命令，在指定命名空間中建立 Kubernetes 角色繫結。此角色繫結會將在上一個步驟建立的角色中定義的許可授予名為 `emr-containers` 的使用者。此使用者可識別 [Amazon EMR on EKS 的服務連結角色](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/using-service-linked-roles.html)，因此可讓 Amazon EMR on EKS 執行您建立的角色所定義的動作。

   ```
   namespace=my-namespace
   
   cat - <<EOF | kubectl apply -f - --namespace "${namespace}"
   apiVersion: rbac.authorization.k8s.io/v1
   kind: RoleBinding
   metadata:
     name: emr-containers
     namespace: ${namespace}
   subjects:
   - kind: User
     name: emr-containers
     apiGroup: rbac.authorization.k8s.io
   roleRef:
     kind: Role
     name: emr-containers
     apiGroup: rbac.authorization.k8s.io
   EOF
   ```

1. **更新 Kubernetes `aws-auth` 組態地圖**

   可以使用下列其中一個選項，將 Amazon EMR on EKS 服務連結角色與上一個步驟中受 Kubernetes 角色繫結的 `emr-containers` 使用者進行映射。

   **選項 1：使用 `eksctl`**

   執行下列 `eksctl` 命令，將 Amazon EMR on EKS 服務連結角色與 `emr-containers` 使用者進行映射。

   ```
   eksctl create iamidentitymapping \
       --cluster my-cluster-name \
       --arn "arn:aws:iam::my-account-id:role/AWSServiceRoleForAmazonEMRContainers" \
       --username emr-containers
   ```

   **選項 2：不使用 eksctl**

   1. 執行下列命令，在文字編輯器中開啟 `aws-auth` 組態映射。

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```
**注意**  
如果收到錯誤訊息，指出 `Error from server (NotFound): configmaps "aws-auth" not found`，請參閱《Amazon EKS 使用者指南》中的[新增使用者角色](https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html)中的步驟，以套用儲存的 ConfigMap。

   1. 將 Amazon EMR on EKS 服務連結角色詳細資訊新增至 `data` 下 `ConfigMap` 的 `mapRoles` 章節。若此區段在檔案不存在，則將其新增。資料下的已更新 `mapRoles` 章節類似下列範例。

      ```
      apiVersion: v1
      data:
        mapRoles: |
          - rolearn: arn:aws:iam::<your-account-id>:role/AWSServiceRoleForAmazonEMRContainers
            username: emr-containers
          - ... <other previously existing role entries, if there's any>.
      ```

   1. 儲存檔案並結束您的文字編輯器。