本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
从 EMR Serverless 访问另一个 Amazon 账户中的 S3 数据
您可以从一个 Amazon 账户运行 Amazon EMR 无服务器任务,并将其配置为访问属于另一个账户的 Amazon S3 存储桶中的数据。 Amazon 本页介绍了如何配置从 EMR Serverless 对 S3 的跨账户访问。
在 EMR Serverless 上运行的任务可以使用 S3 存储桶策略或代入的角色从其他账户访问 Amazon S3 中的数据。 Amazon
先决条件
要为 Amazon EMR Serverless 设置跨账户访问权限,请在登录两个账户的同时完成任务: Amazon
-
AccountA:这是您在其中创建 Amazon EMR Serverless 应用程序的 Amazon 账户。在设置跨账户访问权限之前,请在此账户中准备好以下内容:-
Amazon EMR Serverless 应用程序,在其中运行作业。
-
作业执行角色,拥有在应用程序中运行作业所需的权限。有关更多信息,请参阅Amazon EMR Serverless 的作业运行时角色。
-
-
AccountB:该 Amazon 账户包含您希望 Amazon EMR Serverless 作业访问的 S3 存储桶。
使用 S3 存储桶策略访问跨账户 S3 数据
要从 account A 访问 account B 中的 S3 存储桶,请将以下策略附加到 account B 中的 S3 存储桶。
有关使用 S3 存储桶策略进行 S3 跨账户访问的更多信息,请参阅 A mazon 简单存储服务用户指南中的示例 2:授予跨账户存储桶权限的存储桶拥有者。
使用代入角色跨账户访问 S3 数据
为 Amazon EMR Serverless 设置跨账户访问权限的另一种方法是使用 () AssumeRole 中的 Amazon Security Token Service 操作。Amazon STS Amazon STS 是一项全球 Web 服务,允许您为用户申请临时的、权限有限的证书。您可以使用通过 AssumeRole 创建的临时安全凭证对 EMR Serverless 和 Amazon S3 进行 API 调用。
以下步骤说明了如何使用代入角色从 EMR Serverless 跨账户访问 S3 数据:
-
创建 Amazon S3 存储桶,即
AccountB中的cross-account-bucket。有关更多信息,请参阅《Amazon 简单存储服务用户指南》中的创建存储桶。如果您想拥有对 DynamoDB 的跨账户访问权限,还可以在中创建一个 DynamoDB 表。AccountB有关更多信息,请参阅亚马逊 DynamoDB 开发者指南中的创建 Dyn amoD B 表。 -
在
AccountB中创建Cross-Account-Role-BIAM 角色,以便可以访问cross-account-bucket。登录 Amazon Web Services Management Console 并打开 IAM 控制台,网址为https://console.aws.amazon.com/iam/
。 -
选择 Roles (角色) 并创建新角色:
Cross-Account-Role-B。有关如何创建 IAM 角色的更多信息,请参阅 IAM 用户指南中的创建 IAM 角色。 -
创建 IAM policy 来指定针对
Cross-Account-Role-B的权限以访问cross-account-bucketS3 存储桶,如以下策略声明所示。然后将 IAM policy 附加到Cross-Account-Role-B。有关更多信息,请参阅 IAM 用户指南中的创建 IAM 策略。
如果需要访问 DynamoDB,请创建 IAM 策略,指定跨账户访问 DynamoDB 表的权限。然后将 IAM policy 附加到
Cross-Account-Role-B。有关更多信息,请参阅 I AM 用户指南中的 Amazon DynamoDB:允许访问特定表。以下是允许访问 DynamoDB 表
CrossAccountTable的策略。 -
编辑
Cross-Account-Role-B角色的信任关系。-
要配置角色的信任关系,请在 IAM 控制台中为您在步骤 2 中创建的
Cross-Account-Role-B角色选择信任关系选项卡。 -
选择 Edit Trust Relationship (编辑信任关系)。
-
添加以下策略文档。这允许
AccountA中的Job-Execution-Role-A代入Cross-Account-Role-B角色。
-
-
授
Job-Execution-Role-AAccountA予假设 Amazon STSAssumeRole权限Cross-Account-Role-B。-
在 Amazon 账户的 IAM 控制台中
AccountA,选择Job-Execution-Role-A。 -
添加以下
Job-Execution-Role-A策略语句以便对Cross-Account-Role-B角色执行AssumeRole操作。
-
代入角色示例
使用单个代入角色访问账户中的所有 S3 资源,或者在 Amazon EMR 6.11 及更高版本中,配置多个 IAM 角色,以便在访问不同的跨账户 S3 存储桶时代入。
使用单个代入角色访问 S3 资源
注意
如果将作业配置为使用单个代入角色,整个作业中的所有 S3 资源都将使用该角色,包括 entryPoint 脚本。
如果您想使用单个代入角色访问账户 B 中的所有 S3 资源,请指定以下配置:
-
将 EMRFS 配置
fs.s3.customAWSCredentialsProvider指定为com.amazonaws.emr.AssumeRoleAWSCredentialsProvider。 -
对于 Spark,使用
spark.emr-serverless.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN和spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN指定驱动程序和执行程序的环境变量。 -
对于 Hive,使用
hive.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARNtez.am.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN、和tez.task.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN指定 Hive 驱动程序、Tez 应用程序主容器和 Tez 任务容器上的环境变量。
以下示例演示如何使用代入角色启动具有跨账户访问权限的 EMR Serverless 作业。
使用多个代入角色访问 S3 资源
在 EMR Serverless 版本 6.11.0 及更高版本中,配置多个 IAM 角色以便在访问不同的跨账户存储桶时扮演。如果要使用账户 B 中的不同代入角色访问不同的 S3 资源,请在启动作业运行时使用以下配置:
-
将 EMRFS 配置
fs.s3.customAWSCredentialsProvider指定为com.amazonaws.emr.serverless.credentialsprovider.BucketLevelAssumeRoleCredentialsProvider。 -
指定 EMRFS 配置
fs.s3.bucketLevelAssumeRoleMapping,定义从 S3 存储桶名称到账户 B 中要代入的 IAM 角色的映射。该值的格式为bucket1->role1;bucket2->role2。
例如,使用arn:aws:iam::访问存储桶AccountB:role/Cross-Account-Role-B-1bucket1,使用arn:aws:iam::访问存储桶AccountB:role/Cross-Account-Role-B-2bucket2。以下示例演示如何通过多个假设角色启动具有跨账户访问权限的 EMR Serverless 作业。