翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon EMR on EKS のクロスアカウントアクセスを設定する
Amazon EMR on EKS のクロスアカウントアクセスを設定できます。クロスアカウントアクセスにより、ある AWS アカウントのユーザーは Amazon EMR on EKS ジョブを実行し、別の AWS アカウントに属する基盤となるデータにアクセスできます。
前提条件
Amazon EMR on EKS のクロスアカウントアクセスを設定するには、次の AWS アカウントにサインインしている間にタスクを完了します。
AccountA- EKS クラスターの名前空間に Amazon EMR を登録して 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 アカウント の IAM コンソールで
AccountA、 を選択します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" }}}'