本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
为 Amazon EMR on EKS 设置跨账户访问权限
您可为 Amazon EMR on EKS 设置跨账户访问权限。跨账户访问可让用户使用一个AWS账户运行 Amazon EMR on EKS 任务,并访问属于另一个AWS账户的基础数据。
先决条件
要为 Amazon EMR on EKS 设置跨账户访问权限,您需要在登录以下AWS账户时完成任务:
AccountA
- 一个AWS账户,即通过使用 EKS 集群的命名空间注册 Amazon EMR,来创建 Amazon EMR on EKS 虚拟集群的账户。AccountB
- 一个AWS账户,该账户包含您希望 Amazon EMR on EKS 任务访问的 Amazon S3 存储桶或 DynamoDB 表。
您必须在设置跨账户访问权限之前,为您的AWS账户做好以下准备:
AccountA
中的 Amazon EMR on EKS 虚拟集群,即要运行任务之处。AccountA
中的任务执行角色拥有在虚拟集群中运行任务所需的权限。有关更多信息,请参阅创建任务执行角色和将任务执行角色与 Amazon EMR on EKS 结合使用。
如何访问跨账户 Amazon S3 存储桶或 DynamoDB 表
要为 Amazon EMR on EKS 设置跨账户访问权限,请完成以下步骤。
创建 Amazon S3 存储桶,即
AccountB
中的cross-account-bucket
。有关更多信息,请参阅创建存储桶。如果您希望跨账户访问 DynamoDB,还可以在AccountB
中创建 DynamoDB 表。有关更多信息,请参阅创建 DynamoDB 表。在
AccountB
中创建Cross-Account-Role-B
IAM 角色,以便可以访问cross-account-bucket
。登录到 IAM 控制台。
选择 Roles (角色) 并创建新角色:
Cross-Account-Role-B
。有关如何创建 IAM 角色的更多信息,请参阅《IAM 用户指南》中的创建 IAM 角色。创建 IAM policy 来指定针对
Cross-Account-Role-B
的权限以访问cross-account-bucket
S3 存储桶,如以下策略声明所示。然后将 IAM policy 附加到Cross-Account-Role-B
。有关更多信息,请参阅《IAM 用户指南》中的创建新策略。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::cross-account-bucket", "arn:aws:s3:::cross-account-bucket/*" ] } ] }
如果需要 DynamoDB 访问权限,请创建 IAM policy,该策略指定访问跨账户 DynamoDB 表的权限。然后将 IAM policy 附加到
Cross-Account-Role-B
。有关更多信息,请参阅《IAM 用户指南》中的创建 DynamoDB 表。以下是访问 DynamoDB 表
CrossAccountTable
的策略。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:*", "Resource": "arn:aws:dynamodb:
MyRegion:AccountB
:table/CrossAccountTable" } ] }
编辑
Cross-Account-Role-B
角色的信任关系。要为角色配置信任关系,请选择 IAM 控制台的 Trust Relationships (信任关系) 选项卡,以用于在步骤 2 中创建的角色:
Cross-Account-Role-B
。选择 Edit Trust Relationship (编辑信任关系)。
添加以下策略文档,该文档允许使用
AccountA
中的Job-Execution-Role-A
来假承担该Cross-Account-Role-B
角色。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountA
:role/Job-Execution-Role-A" }, "Action": "sts:AssumeRole" } ] }
授予
AccountA
中的Job-Execution-Role-A
STS 代入角色权限来代入Cross-Account-Role-B
。在AWS账户
AccountA
中的 IAM 控制台中,选择Job-Execution-Role-A
。添加以下
Job-Execution-Role-A
策略语句以便对Cross-Account-Role-B
角色执行AssumeRole
操作。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::
AccountB
:role/Cross-Account-Role-B" } ] }
对于 Amazon S3 访问权限,请设置以下
spark-submit
参数(spark conf
),同时将任务提交至 Amazon EMR on EKS。注意
默认情况下,EMRFS 使用任务执行角色以访问任务的 S3 存储桶。但当
customAWSCredentialsProvider
设置为AssumeRoleAWSCredentialsProvider
时,EMRFS 将使用您通过ASSUME_ROLE_CREDENTIALS_ROLE_ARN
指定的相应角色,而不是通过Job-Execution-Role-A
以访问 Amazon S3。--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" }}}'