EMR で Amazon のクラスターアクセスを有効にする EKS - Amazon EMR

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

EMR で Amazon のクラスターアクセスを有効にする EKS

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

EKS アクセスエントリを使用してクラスターアクセスを有効にする (推奨)

注記

[aws-auth ConfigMap ] は廃止されました。Kubernetes へのアクセスを管理するための推奨方法は、アクセスエントリ APIsです。

Amazon EMRは Amazon EKSクラスターアクセス管理 (CAM) と統合されているため、Amazon EKSクラスターの名前空間で Amazon Spark EMR ジョブを実行するために必要な AuthN および AuthZ ポリシーの設定を自動化できます。Amazon クラスター名前空間から仮想EKSクラスターを作成すると、Amazon は必要なすべてのアクセス許可EMRを自動的に設定するため、現在のワークフローに追加のステップを追加する必要はありません。

注記

Amazon と Amazon EMRの統合EKSCAMは、EKS仮想クラスターEMR上の新しい Amazon でのみサポートされています。この統合を使用するには、既存の仮想クラスターを移行できません。

前提条件

  • のバージョン 2.15.3 以降が実行されていることを確認します。 AWS CLI

  • Amazon EKSクラスターはバージョン 1.23 以降である必要があります。

セットアップ

Amazon EMRと AccessEntry API Amazon からのオペレーションの統合を設定するにはEKS、以下の項目を完了していることを確認してください。

  • 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

    認証モードの詳細については、「クラスター認証モード」を参照してください。

  • CreateVirtualCluster および DeleteVirtualClusterAPIオペレーションの実行に使用しているIAMロールに、次のアクセス許可があることを確認してください。

    { "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/*" }

概念と用語

以下は、Amazon EKS に関連する用語と概念のリストですCAM。

  • 仮想クラスター (VC) – Amazon で作成された名前空間の論理表現EKS。これは、Amazon EKSクラスター名前空間への 1:1 リンクです。これを使用して、指定された名前空間内の Amazon EKSクラスターで Amazon EMRワークロードを実行できます。

  • 名前空間 – 単一のEKSクラスター内のリソースグループを分離するメカニズム。

  • アクセスポリシー – EKSクラスター内のIAMロールにアクセスとアクションを付与するアクセス許可。

  • アクセスエントリ – ロール arn で作成されたエントリ。アクセスエントリをアクセスポリシーにリンクして、Amazon EKSクラスター内の特定のアクセス許可を割り当てることができます。

  • EKS アクセスエントリ統合仮想クラスター – Amazon からのアクセスエントリAPIオペレーションを使用して作成された仮想クラスターEKS。

を使用してクラスターアクセスを有効にする aws-auth

Amazon EMRがクラスター内の特定の名前空間EKSにアクセスできるようにするには、Kubernetes ロールの作成、Kubernetes ユーザーへのロールのバインド、Kubernetes ユーザーとサービスリンクロールのマッピングのアクションを実行する必要がありますAWSServiceRoleForAmazonEMRContainers。これらのアクションは、IAMアイデンティティマッピングコマンドが をサービス名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 をセットアップして、最新の eksctl をダウンロードする必要があります。

EMR で Amazon のクラスターアクセスを有効にする手動ステップ EKS

以下の手動ステップを使用して、 EMRで Amazon のクラスターアクセスを有効にすることもできますEKS。

  1. 特定の名前空間に Kubernetes ロールを作成する

    Amazon EKS 1.22 - 1.29

    Amazon EKS1.22 ~ 1.29 では、次のコマンドを実行して、特定の名前空間に Kubernetes ロールを作成します。このロールは、 EMR上の Amazon に必要なRBACアクセス許可を付与します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 EKS1.21 以下では、次のコマンドを実行して、特定の名前空間に Kubernetes ロールを作成します。このロールは、 EMR上の Amazon に必要なRBACアクセス許可を付与します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
  2. 名前空間にスコープが設定された Kubernetes ロールバインディングを作成する

    次のコマンドを実行して、特定の名前空間に Kubernetes ロールバインディングを作成します。このロールバインディングは、前のステップで作成したロールに定義されたアクセス許可を、emr-containers という名前のユーザーに付与します。このユーザーは、 EMR で Amazon のサービスにリンクされたロールEKSを識別し、作成したロールで定義されたアクションを実行EKSすることを EMRで Amazon に許可します。

    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
  3. Kubernetes aws-auth 設定マップを更新する

    次のいずれかのオプションを使用して、EKSサービスにリンクされた Amazon EMR on ロールを、前のステップで 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ユーザーガイド」の「ユーザーロールの追加」のステップを参照して、在庫 を適用します ConfigMap。

    2. Amazon EMR on EKSサービスにリンクされたロールの詳細をConfigMap、 の mapRolesセクションの に追加しますdata。ファイルに存在しない場合は、このセクションを追加します。データの下で更新された 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>.
    3. ファイルを保存し、テキストエディタを終了します。