为 Amazon EMR on EKS 设置跨账户访问权限 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

为 Amazon EMR on EKS 设置跨账户访问权限

您可为 Amazon EMR on EKS 设置跨账户访问权限。跨账户访问可让用户使用一个Amazon账户运行 Amazon EMR on EKS 任务,并访问属于另一个Amazon账户的基础数据。

Prerequisites

要为 Amazon EMR on EKS 设置跨账户访问权限,您需要在登录以下Amazon账户时完成任务:

  • AccountA - 一个Amazon账户,即通过使用 EKS 集群的命名空间注册 Amazon EMR,来创建 Amazon EMR on EKS 虚拟集群的账户。

  • AccountB - 一个Amazon账户,该账户包含您希望 Amazon EMR on EKS 任务访问的 Amazon S3 存储桶或 DynamoDB 表。

您必须在设置跨账户访问权限之前,为您的Amazon账户做好以下准备:

如何访问跨账户 Amazon S3 存储桶或 DynamoDB 表

要为 Amazon EMR on EKS 设置跨账户访问权限,请完成以下步骤。

  1. 创建 Amazon S3 存储桶,即 AccountB 中的 cross-account-bucket。有关更多信息,请参阅创建存储桶。如果您希望跨账户访问 DynamoDB,还可以在 AccountB 中创建 DynamoDB 表。有关更多信息,请参阅创建 DynamoDB 表

  2. AccountB 中创建 Cross-Account-Role-B IAM 角色,以便可以访问 cross-account-bucket

    1. 登录到 IAM 控制台。

    2. 选择 Roles (角色) 并创建新角色:Cross-Account-Role-B。有关如何创建 IAM 角色的更多信息,请参阅《IAM 用户指南》中的创建 IAM 角色

    3. 创建 IAM 策略来指定针对 Cross-Account-Role-B 的权限以访问 cross-account-bucket S3 存储桶,如以下策略声明所示。然后将 IAM 策略附加到 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 策略,该策略指定访问跨账户 DynamoDB 表的权限。然后将 IAM 策略附加到 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" } ] }
  3. 编辑 Cross-Account-Role-B 角色的信任关系。

    1. 要为角色配置信任关系,请选择 IAM 控制台的 Trust Relationships (信任关系) 选项卡,以用于在步骤 2 中创建的角色:Cross-Account-Role-B

    2. 选择 Edit Trust Relationship (编辑信任关系)

    3. 添加以下策略文档,该文档允许使用 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" } ] }
  4. 授予 AccountA 中的 Job-Execution-Role-A STS 承担角色权限,以承担 Cross-Account-Role-B

    1. 在Amazon账户 AccountA 中的 IAM 控制台中,选择 Job-Execution-Role-A

    2. 添加以下 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" } ] }
  5. 对于 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

  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" }}}'