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 アカウントで以下を準備する必要があります。
ジョブを実行する、
AccountA内の Amazon EMR on EKS 仮想クラスター。仮想クラスターでジョブを実行するために必要な許可を持つ、
AccountA内のジョブ実行ロール。詳細については、「ジョブ実行ロールを作成する」および「Amazon EMR on EKS でのジョブ実行ロールの使用」を参照してください。
クロスアカウントの Amazon S3 バケットまたは DynamoDB テーブルにアクセスする方法
Amazon EMR on EKS のクロスアカウントアクセスを設定するには、次の手順を実行します。
Amazon S3 バケット
cross-account-bucketをAccountBに作成します。詳細については、「バケットの作成」を参照してください。DynamoDB へのクロスアカウントアクセスが必要な場合は、AccountBで DynamoDB テーブルを作成することもできます。詳細については、「DynamoDB テーブルの作成」を参照してください。AccountBに、cross-account-bucketにアクセスできるCross-Account-Role-BIAM ロールを作成します。IAM コンソールにサインインします。
[ロール] を選択し、新しいロール
Cross-Account-Role-Bを作成します。IAM ロールの作成方法の詳細については、「IAM ユーザーガイド」の「IAM ロールの作成」を参照してください。以下のポリシーステートメントに示すように、
cross-account-bucketS3 バケットにアクセスするためのCross-Account-Role-Bの許可を指定する IAM ポリシーを作成します。IAM ポリシーをCross-Account-Role-Bにアタッチします。詳細については、「IAM ユーザーガイド」の「新しいポリシーの作成」を参照してください。DynamoDB アクセスが必要な場合は、クロスアカウントの DynamoDB テーブルにアクセスするための許可を指定する IAM ポリシーを作成します。IAM ポリシーを
Cross-Account-Role-Bにアタッチします。詳細については、「IAM ユーザーガイド」の「DynamoDB テーブルの作成」を参照してください。DynamoDB テーブル
CrossAccountTableにアクセスするためのポリシーを以下に示します。
Cross-Account-Role-Bロールの信頼関係を編集します。ロールの信頼関係を設定するには、IAM コンソールで、ステップ 2 で作成したロール
Cross-Account-Role-Bの [信頼関係] タブを選択します。[信頼関係の編集] を選択します。
以下のポリシードキュメントを追加します。これにより、
AccountA内のJob-Execution-Role-AにこのCross-Account-Role-Bロールを引き受けることを許可します。
Cross-Account-Role-Bを引き受けるように、STS ロール引き受け許可を使用してAccountA内でJob-Execution-Role-Aを付与します。AWS アカウント
AccountAの IAM コンソールで、Job-Execution-Role-Aを選択します。次のポリシーステートメントを
Job-Execution-Role-Aに追加して、Cross-Account-Role-Bロールに対してAssumeRoleアクションを許可します。
Amazon S3 アクセスの場合、Amazon EMR on EKS にジョブを送信するときに、以下の
spark-submitパラメータ (spark conf) を設定します。注記
デフォルトでは、EMRFS はジョブ実行ロールを使用して、ジョブから S3 バケットにアクセスします。ただし、
customAWSCredentialsProviderがAssumeRoleAWSCredentialsProviderに設定されている場合、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 設定で、エグゼキュターとドライバーの両方の
envにASSUME_ROLE_CREDENTIALS_ROLE_ARNを設定する必要があります。DynamoDB のクロスアカウントアクセスの場合、
--conf spark.dynamodb.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProviderを設定する必要があります。次の例に示すように、クロスアカウントアクセスを使用して 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" }}}'