

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EMR on EKS のクラスターアクセスを有効にする
<a name="setting-up-cluster-access"></a>

以下の各セクションでは、クラスターアクセスを有効にする方法をいくつか示します。1 つ目の方法は、Amazon EKS クラスターアクセス管理 (CAM) を使用することによるものです。もう 1 つの方法は、クラスターアクセスを有効にするための手動手順を実施する方法を示すものです。

## EKS アクセスエントリを使用してクラスターアクセスを有効にする (推奨)
<a name="setting-up-cluster-access-cam-integration"></a>

**注記**  
`aws-auth` ConfigMap は非推奨です。Kubernetes API へのアクセスを管理する際は、[アクセスエントリ](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) と統合されているため、Amazon EKS クラスターの名前空間で Amazon EMR Spark ジョブを実行するために必要な AuthN ポリシーと AuthZ ポリシーの設定を自動化できます。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 EMR と Amazon EKS の 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 ID マッピングコマンドがサービス名として `emr-containers` と共に使用されると、`eksctl` で自動的に行われます。これらの操作は、次のコマンドを使用して簡単に実行できます。

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

{{my\_eks\_cluster}} は使用する Amazon EKS クラスターの名前に置き換え、{{kubernetes\_namespace}} は Amazon EMR ワークロードを実行するために作成された Kubernetes 名前空間に置き換えます。

**重要**  
この機能を使用するには、前のステップである [kubectl と eksctl の設定](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)を使用して最新の eksctl をダウンロードする必要があります。

### 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 ロールを作成します。このロールは、Amazon EMR on EKS に必要な RBAC アクセス許可を付与します。

   ```
   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 ロールを作成します。このロールは、Amazon EMR on EKS に必要な RBAC アクセス許可を付与します。

   ```
   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. ファイルを保存し、テキストエディタを終了します。

## Amazon SageMaker Unified Studio のクラスターアクセスを有効にする
<a name="setting-up-cluster-access-smus"></a>

Amazon EMR on EKS と Amazon SageMaker Unified Studio には、Amazon EKS クラスターへのアクセスが必要です。[EMR on EKS と SageMaker Unified Studio の EKS クラスターアクセスを有効にする](https://docs.aws.amazon.com/sagemaker-unified-studio/latest/adminguide/enable-eks-cluster-access-for-emr-on-eks-and-sagemaker-unified-studio.html)の手順に従って、アクセスを提供します。