访问另一个 S3 中的数据 AWS 来自EMR无服务器的账户 - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

访问另一个 S3 中的数据 AWS 来自EMR无服务器的账户

您可以从一个服务器运行 Amazon EMR 无服务器作业 AWS 账户并将它们配置为访问属于另一个存储桶的 Amazon S3 存储桶中的数据 AWS account。本页介绍如何配置从 S EMR erverless 对 S3 的跨账户访问权限。

在 S EMR erverless 上运行的作业可以使用 S3 存储桶策略或代入角色从其他服务器访问 Amazon S3 中的数据 AWS account。

先决条件

要为 Amazon EMR Serverless 设置跨账户访问权限,您必须在登录后完成任务 AWS 账户:

  • AccountA— 这是 AWS 您在其中创建 Amazon EMR 无服务器应用程序的账户。在设置跨账户访问权限之前,您必须在此账户中准备好以下内容:

    • 您要在其中运行作业的 Amazon EMR 无服务器应用程序。

    • 具有在应用程序中运行作业所需的权限的任务执行角色。有关更多信息,请参阅 Amazon EMR Serverless 的 Job 运行时角色

  • AccountB— 这是 AWS 包含您希望 Amazon EMR 无服务器任务访问的 S3 存储桶的账户。

使用 S3 存储桶策略访问跨账户 S3 数据

要访问 S3 存储桶 account B from account A,将以下策略附加到中的 S3 存储桶 account B.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions 1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA:root" }, "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::bucket_name_in_AccountB" ] }, { "Sid": "Example permissions 2", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA:root" }, "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::bucket_name_in_AccountB/*" ] } ] }

有关使用 S3 存储桶策略进行 S3 跨账户访问的更多信息,请参阅 A mazon 简单存储服务用户指南中的示例 2:授予跨账户存储桶权限的存储桶拥有者

使用代入的角色访问跨账户 S3 数据

为 Amazon EMR Serverless 设置跨账户访问权限的另一种方法是使用中的AssumeRole操作 AWS Security Token Service (AWS STS). AWS STS 是一项全球 Web 服务,允许您为用户申请临时的、权限有限的证书。您可以使用自己创建的临时安全证书API调用 S EMR erverless 和 Amazon S3。AssumeRole

以下步骤说明如何使用代入的角色从 S EMR erverless 访问跨账户 S3 数据:

  1. 创建 Amazon S3 存储桶,cross-account-bucket,在AccountB。有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的创建存储桶。如果您希望跨账户访问 DynamoDB,还可以在 AccountB 中创建 DynamoDB 表。有关更多信息,请参阅亚马逊 DynamoDB 开发者指南中的创建 Dy namoD B 表。

  2. 在中创建一个AccountB可以访问的Cross-Account-Role-BIAM角色 cross-account-bucket.

    1. 登录 AWS Management Console 然后打开IAM控制台,网址为https://console.aws.amazon.com/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用户指南》中的创建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 Amazon 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控制台中为在步骤 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. 格兰特Job-Execution-Role-AAccountA在 AWS STS AssumeRole允许假设Cross-Account-Role-B

    1. 在IAM控制台中 AWS 帐户AccountA,选择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" } ] }

假设角色示例

您可以使用单个代入角色访问账户中的所有 S3 资源,或者在 Amazon EMR 6.11 及更高版本中,您可以配置多个IAM角色,以便在访问不同的跨账户 S3 存储桶时代入。

使用一个代入的角色访问 S3 资源

注意

当您将任务配置为使用单个代入角色时,整个任务中的所有 S3 资源都将使用该角色,包括entryPoint脚本。

如果您想使用单个代入角色访问账户 B 中的所有 S3 资源,请指定以下配置:

  1. fs.s3.customAWSCredentialsProvider将EMRFS配置指定为spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider

  2. 对于 Spark,使用spark.emr-serverless.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARNspark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN来指定驱动程序和执行程序上的环境变量。

  3. 对于 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无服务器作业。

Spark

以下示例说明如何使用代入的角色启动具有对 S3 的跨账户访问权限的 EMR Serverless Spark 作业。

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "sparkSubmit": { "entryPoint": "entrypoint_location", "entryPointArguments": [":argument_1:", ":argument_2:"], "sparkSubmitParameters": "--conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1" } }' \ --configuration-overrides '{ "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.hadoop.fs.s3.customAWSCredentialsProvider": "spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider", "spark.emr-serverless.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B", "spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B" } }] }'
Hive

以下示例说明如何使用代入的角色启动具有跨账户访问权限的 S EMR erverless Hive 作业。

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "hive": { "query": "query_location", "parameters": "hive_parameters" } }' \ --configuration-overrides '{ "applicationConfiguration": [{ "classification": "hive-site", "properties": { "fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.serverless.credentialsprovider.AssumeRoleAWSCredentialsProvider", "hive.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B", "tez.am.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B", "tez.task.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B" } }] }'

使用多个代入角色访问 S3 资源

在 S EMR erverless 版本 6.11.0 及更高版本中,您可以配置多个IAM角色,以便在访问不同的跨账户存储桶时代入。如果您想在账户 B 中使用不同的代入角色访问不同的 S3 资源,请在开始运行任务时使用以下配置:

  1. fs.s3.customAWSCredentialsProvider将EMRFS配置指定为com.amazonaws.emr.serverless.credentialsprovider.BucketLevelAssumeRoleCredentialsProvider

  2. 指定EMRFS配置fs.s3.bucketLevelAssumeRoleMapping以定义从 S3 存储桶名称到账户 B 中要担任的IAM角色的映射。该值的格式应为bucket1->role1;bucket2->role2

例如,您可以使用arn:aws:iam::AccountB:role/Cross-Account-Role-B-1访问存储桶bucket1,使用arn:aws:iam::AccountB:role/Cross-Account-Role-B-2访问存储桶bucket2。以下示例说明如何通过多个代入角色启动具有跨账户访问权限的EMR无服务器作业。

Spark

以下示例说明如何使用多个代入的角色来创建EMR无服务器 Spark 作业运行。

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "sparkSubmit": { "entryPoint": "entrypoint_location", "entryPointArguments": [":argument_1:", ":argument_2:"], "sparkSubmitParameters": "--conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1" } }' \ --configuration-overrides '{ "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.hadoop.fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.serverless.credentialsprovider.BucketLevelAssumeRoleCredentialsProvider", "spark.hadoop.fs.s3.bucketLevelAssumeRoleMapping": "bucket1->arn:aws:iam::AccountB:role/Cross-Account-Role-B-1;bucket2->arn:aws:iam::AccountB:role/Cross-Account-Role-B-2" } }] }'
Hive

以下示例说明如何使用多个假设角色来创建EMR无服务器 Hive 作业运行。

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "hive": { "query": "query_location", "parameters": "hive_parameters" } }' \ --configuration-overrides '{ "applicationConfiguration": [{ "classification": "hive-site", "properties": { "fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.serverless.credentialsprovider.AssumeRoleAWSCredentialsProvider", "fs.s3.bucketLevelAssumeRoleMapping": "bucket1->arn:aws:iam::AccountB:role/Cross-Account-Role-B-1;bucket2->arn:aws:iam::AccountB:role/Cross-Account-Role-B-2" } }] }'