サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でクラスターアクセス権限を設定する - Amazon EMR

サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でクラスターアクセス権限を設定する

このセクションでは、AWS Identity and Access Management ロールを引き受けるように Kubernetes サービスアカウントを設定する方法を例を示して説明します。これにより、サービスアカウントを使用するポッドが、ロールにアクセス権限がある任意の AWS サービスにアクセスできるようになります。

以下の例では、Spark アプリケーションを実行して Amazon S3 内のファイルの単語をカウントします。これを行うには、サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) を設定して、Kubernetes サービスアカウントを認証および認可します。

注記

この例では、Spark 演算子と Spark アプリケーションを送信する名前空間に「spark-operator」名前空間を使用しています。

前提条件

このページの例を試す前に、以下の前提条件を完了します。

IAM ロールを引き受けるように Kubernetes サービスアカウントを設定する

以下の手順に従って、Kubernetes サービスアカウントを設定し、AWS サービスにアクセスするためにポッドが使用できる IAM ロール (同サービスにアクセス権限を持つ) を引き受けるようにします。

  1. 前提条件 を完了したら、AWS Command Line Interface を使用して、Amazon S3 にアップロードしたファイルへの読み取り専用アクセスを許可する example-policy.json ファイルを作成します。

    cat >example-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::my-pod-bucket", "arn:aws:s3:::my-pod-bucket/*" ] } ] } EOF
  2. 続いて、IAM ポリシー example-policy を作成します。

    aws iam create-policy --policy-name example-policy --policy-document file://example-policy.json
  3. 次に、IAM ロール example-role を作成し、それを Spark ドライバーの Kubernetes サービスアカウントに関連付けます。

    eksctl create iamserviceaccount --name driver-account-sa --namespace spark-operator \ --cluster my-cluster --role-name "example-role" \ --attach-policy-arn arn:aws:iam::111122223333:policy/example-policy --approve
  4. Spark ドライバーサービスアカウントに必要なクラスターロールバインディングを含む yaml ファイルを作成します。

    cat >spark-rbac.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: driver-account-sa --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: spark-role roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: edit subjects: - kind: ServiceAccount name: driver-account-sa namespace: spark-operator EOF
  5. クラスターロールバインディング設定を適用します。

    kubectl apply -f spark-rbac.yaml

kubectl コマンドを実行すると、アカウントが正常に作成されたことを確認できます。

serviceaccount/driver-account-sa created clusterrolebinding.rbac.authorization.k8s.io/spark-role configured

Spark 演算子からアプリケーションを実行する

Kubernetes サービスアカウントを設定すると、前提条件 の一部としてアップロードしたテキストファイル内の単語数をカウントする Spark アプリケーションを実行できます。

  1. ワードカウントアプリケーションの SparkApplication 定義を含む新しいファイル word-count.yaml を作成します。

    cat >word-count.yaml <<EOF apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: word-count namespace: spark-operator spec: type: Java mode: cluster image: "895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.10.0:latest" imagePullPolicy: Always mainClass: org.apache.spark.examples.JavaWordCount mainApplicationFile: local:///usr/lib/spark/examples/jars/spark-examples.jar arguments: - s3://my-pod-bucket/poem.txt hadoopConf: # EMRFS filesystem fs.s3.customAWSCredentialsProvider: com.amazonaws.auth.WebIdentityTokenCredentialsProvider fs.s3.impl: com.amazon.ws.emr.hadoop.fs.EmrFileSystem fs.AbstractFileSystem.s3.impl: org.apache.hadoop.fs.s3.EMRFSDelegate fs.s3.buffer.dir: /mnt/s3 fs.s3.getObject.initialSocketTimeoutMilliseconds: "2000" mapreduce.fileoutputcommitter.algorithm.version.emr_internal_use_only.EmrFileSystem: "2" mapreduce.fileoutputcommitter.cleanup-failures.ignored.emr_internal_use_only.EmrFileSystem: "true" sparkConf: # Required for EMR Runtime spark.driver.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/* spark.driver.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native spark.executor.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/* spark.executor.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native sparkVersion: "3.3.1" restartPolicy: type: Never driver: cores: 1 coreLimit: "1200m" memory: "512m" labels: version: 3.3.1 serviceAccount: my-spark-driver-sa executor: cores: 1 instances: 1 memory: "512m" labels: version: 3.3.1 EOF
  2. Spark アプリケーションを送信します。

    kubectl apply -f word-count.yaml

    kubectl コマンドは、word-count という SparkApplication オブジェクトが正常に作成されたことを示す確認を返します。

    sparkapplication.sparkoperator.k8s.io/word-count configured
  3. SparkApplication オブジェクトのイベントを確認するには、以下のコマンドを実行します。

    kubectl describe sparkapplication word-count -n spark-operator

    kubectl コマンドは、SparkApplication の説明とイベントを返します。

    Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SparkApplicationSpecUpdateProcessed 3m2s (x2 over 17h) spark-operator Successfully processed spec update for SparkApplication word-count Warning SparkApplicationPendingRerun 3m2s (x2 over 17h) spark-operator SparkApplication word-count is pending rerun Normal SparkApplicationSubmitted 2m58s (x2 over 17h) spark-operator SparkApplication word-count was submitted successfully Normal SparkDriverRunning 2m56s (x2 over 17h) spark-operator Driver word-count-driver is running Normal SparkExecutorPending 2m50s spark-operator Executor [javawordcount-fdd1698807392c66-exec-1] is pending Normal SparkExecutorRunning 2m48s spark-operator Executor [javawordcount-fdd1698807392c66-exec-1] is running Normal SparkDriverCompleted 2m31s (x2 over 17h) spark-operator Driver word-count-driver completed Normal SparkApplicationCompleted 2m31s (x2 over 17h) spark-operator SparkApplication word-count completed Normal SparkExecutorCompleted 2m31s (x2 over 2m31s) spark-operator Executor [javawordcount-fdd1698807392c66-exec-1] completed

アプリケーションが S3 ファイル内の単語数をカウントするようになりました。単語数を確認するには、ドライバーのログファイルを参照してください。

kubectl logs pod/word-count-driver -n spark-operator

kubectl コマンドは、ワードカウントアプリケーションの結果を含むログファイルの内容を返します。

INFO DAGScheduler: Job 0 finished: collect at JavaWordCount.java:53, took 5.146519 s Software: 1

Spark 演算子を使用して Spark にアプリケーションを送信する方法の詳細については、GitHub の Apache Spark 用 Kubernetes 演算子 (spark-on-k8s-operator) ドキュメントの「Using a SparkApplication」を参照してください。