Amazon EMR on EKS のクロスアカウントアクセスを設定する - Amazon EMR

Amazon EMR on EKS のクロスアカウントアクセスを設定する

Amazon EMR on EKS のクロスアカウントアクセスを設定できます。クロスアカウントアクセスを使用すると、ある AWS アカウントのユーザーが Amazon EMR on EKS ジョブを実行し、別の AWS アカウントに属する基盤となるデータにアクセスできます。

前提条件

Amazon EMR on EKS のクロスアカウントアクセスを設定するには、以下の AWS アカウントにサインインしている間にタスクを完了します。

  • AccountA ‐ Amazon EMR を EKS クラスター上の名前空間に登録して Amazon EMR on EKS 仮想クラスターを作成した AWS アカウント。

  • AccountB ‐ Amazon EMR on EKS ジョブがアクセスする Amazon S3 バケットまたは DynamoDB テーブルが含まれている AWS アカウント。

クロスアカウントアクセスを設定する前に、AWS アカウントで以下を準備する必要があります。

クロスアカウントの Amazon S3 バケットまたは DynamoDB テーブルにアクセスする方法

Amazon EMR on EKS のクロスアカウントアクセスを設定するには、次の手順を実行します。

  1. Amazon S3 バケット cross-account-bucketAccountB に作成します。詳細については、「バケットの作成」を参照してください。DynamoDB へのクロスアカウントアクセスが必要な場合は、AccountB で DynamoDB テーブルを作成することもできます。詳細については、「DynamoDB テーブルの作成」を参照してください。

  2. AccountB に、cross-account-bucket にアクセスできる Cross-Account-Role-B IAM ロールを作成します。

    1. IAM コンソールにサインインします。

    2. [ロール] を選択し、新しいロール Cross-Account-Role-B を作成します。IAM ロールの作成方法の詳細については、「IAM ユーザーガイド」の「IAM ロールの作成」を参照してください。

    3. 以下のポリシーステートメントに示すように、cross-account-bucket S3 バケットにアクセスするための Cross-Account-Role-B の許可を指定する IAM ポリシーを作成します。IAM ポリシーを Cross-Account-Role-B にアタッチします。詳細については、「IAM ユーザーガイド」の「新しいポリシーの作成」を参照してください。

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::cross-account-bucket", "arn:aws:s3:::cross-account-bucket/*" ], "Sid": "AllowS3" } ] }

      DynamoDB アクセスが必要な場合は、クロスアカウントの DynamoDB テーブルにアクセスするための許可を指定する IAM ポリシーを作成します。IAM ポリシーを Cross-Account-Role-B にアタッチします。詳細については、「IAM ユーザーガイド」の「DynamoDB テーブルの作成」を参照してください。

      DynamoDB テーブル CrossAccountTable にアクセスするためのポリシーを以下に示します。

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": [ "arn:aws:dynamodb:us-east-1:*:table/CrossAccountTable" ], "Sid": "AllowDYNAMODB" } ] }
  3. Cross-Account-Role-B ロールの信頼関係を編集します。

    1. ロールの信頼関係を設定するには、IAM コンソールで、ステップ 2 で作成したロール Cross-Account-Role-B[信頼関係] タブを選択します。

    2. [信頼関係の編集] を選択します。

    3. 以下のポリシードキュメントを追加します。これにより、AccountA 内の Job-Execution-Role-A にこの Cross-Account-Role-B ロールを引き受けることを許可します。

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": [ "arn:aws:iam::*:role/Job-Execution-Role-A" ], "Sid": "AllowSTSAssumerole" } ] }
  4. Cross-Account-Role-B を引き受けるように、STS ロール引き受け許可を使用して AccountA 内で Job-Execution-Role-A を付与します。

    1. AWS アカウント AccountA の IAM コンソールで、Job-Execution-Role-A を選択します。

    2. 次のポリシーステートメントを Job-Execution-Role-A に追加して、Cross-Account-Role-B ロールに対して AssumeRole アクションを許可します。

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": [ "arn:aws:iam::*:role/Cross-Account-Role-B" ], "Sid": "AllowSTSAssumerole" } ] }
  5. Amazon S3 アクセスの場合、Amazon EMR on EKS にジョブを送信するときに、以下の spark-submit パラメータ (spark conf) を設定します。

    注記

    デフォルトでは、EMRFS はジョブ実行ロールを使用して、ジョブから S3 バケットにアクセスします。ただし、customAWSCredentialsProviderAssumeRoleAWSCredentialsProvider に設定されている場合、EMRFS は、Amazon S3 アクセスに Job-Execution-Role-A ではなく ASSUME_ROLE_CREDENTIALS_ROLE_ARN で指定された対応するロールを使用します。

    • --conf spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider

    • --conf spark.kubernetes.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::AccountB:role/Cross-Account-Role-B \

    • --conf spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::AccountB:role/Cross-Account-Role-B \

    注記

    ジョブの Spark 設定で、エグゼキュターとドライバーの両方の envASSUME_ROLE_CREDENTIALS_ROLE_ARN を設定する必要があります。

    DynamoDB のクロスアカウントアクセスの場合、--conf spark.dynamodb.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider を設定する必要があります。

  6. 次の例に示すように、クロスアカウントアクセスを使用して Amazon EMR on EKS ジョブを実行します。

    aws emr-containers start-job-run \ --virtual-cluster-id 123456 \ --name myjob \ --execution-role-arn execution-role-arn \ --release-label emr-6.2.0-latest \ --job-driver '{"sparkSubmitJobDriver": {"entryPoint": "entryPoint_location", "entryPointArguments": ["arguments_list"], "sparkSubmitParameters": "--class <main_class> --conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=2 --conf spark.driver.cores=1 --conf spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider --conf spark.kubernetes.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::AccountB:role/Cross-Account-Role-B --conf spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::AccountB:role/Cross-Account-Role-B"}} ' \ --configuration-overrides '{"applicationConfiguration": [{"classification": "spark-defaults", "properties": {"spark.driver.memory": "2G"}}], "monitoringConfiguration": {"cloudWatchMonitoringConfiguration": {"logGroupName": "log_group_name", "logStreamNamePrefix": "log_stream_prefix"}, "persistentAppUI":"ENABLED", "s3MonitoringConfiguration": {"logUri": "s3://my_s3_log_location" }}}'