Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
从 EMR Serverless 访问另一 Amazon 账户中的 S3 数据
您可以从一个 Amazon 账户运行 Amazon EMR Serverless 作业,对其进行配置,以访问属于另一 Amazon 账户的 Amazon S3 存储桶中的数据。本页介绍了如何配置从 EMR Serverless 对 S3 的跨账户访问。
在 EMR Serverless 上运行的作业可以使用 S3 存储桶策略或代入角色从其他 Amazon 账户访问 Amazon S3 中的数据。
先决条件
要为 Amazon EMR Serverless 设置跨账户访问,请在登录两个 Amazon 账户时完成以下任务:
使用 S3 存储桶策略访问跨账户 S3 数据
要从 account A 访问 account B 中的 S3 存储桶,请将以下策略附加到 account B 中的 S3 存储桶。
- JSON
-
-
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "ExamplePermissions1",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket-name"
]
},
{
"Sid": "ExamplePermissions2",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::my-bucket-name/*"
]
}
]
}
有关使用 S3 存储桶策略进行 S3 跨账户访问的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的示例 2:存储桶所有者授予跨账户存储桶权限。
使用代入角色跨账户访问 S3 数据
为 Amazon EMR Serverless 设置跨账户访问的另一种方法是使用 Amazon Security Token Service(Amazon STS)中的 AssumeRole 操作。Amazon STS 是一项全局 Web 访问,允许您为用户请求临时、有限权限的凭证。您可以使用通过 AssumeRole 创建的临时安全凭证对 EMR Serverless 和 Amazon S3 进行 API 调用。
以下步骤说明了如何使用代入角色从 EMR Serverless 跨账户访问 S3 数据:
-
在 AccountB 中创建一个 Amazon S3 存储桶 cross-account-bucket。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的创建存储桶。如果您希望跨账户访问 DynamoDB,还请在 AccountB 中创建 DynamoDB 表。有关更多信息,请参阅《Amazon DynamoDB 开发人员指南》中的创建 DynamoDB 表。
-
在 AccountB 中创建一个可以访问 cross-account-bucket 的 Cross-Account-Role-B IAM 角色。
登录 Amazon Web Services 管理控制台,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/。
-
选择 Roles (角色) 并创建新角色:Cross-Account-Role-B。有关如何创建 IAM 角色的更多信息,请参阅《IAM 用户指南》中的创建 IAM 角色。
-
创建一个 IAM 策略,来指定 Cross-Account-Role-B 访问 cross-account-bucket S3 存储桶的权限,如以下策略声明所示。然后将 IAM policy 附加到 Cross-Account-Role-B。有关更多信息,请参阅《IAM 用户指南》中的创建 IAM 策略。
- JSON
-
-
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::cross-account-bucket",
"arn:aws:s3:::cross-account-bucket/*"
],
"Sid": "AllowS3"
}
]
}
如果需要访问 DynamoDB,请创建 IAM 策略,指定跨账户访问 DynamoDB 表的权限。然后将 IAM policy 附加到 Cross-Account-Role-B。有关更多信息,请参阅《IAM 用户指南》中的 Amazon DynamoDB:允许访问特定表。
以下是允许访问 DynamoDB 表 CrossAccountTable 的策略。
- JSON
-
-
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:*"
],
"Resource": [
"arn:aws:dynamodb:*:123456789012:table/CrossAccountTable"
],
"Sid": "AllowDYNAMODB"
}
]
}
-
编辑 Cross-Account-Role-B 角色的信任关系。
-
要配置角色的信任关系,请在 IAM 控制台中为您在步骤 2 中创建的 Cross-Account-Role-B 角色选择信任关系选项卡。
-
选择 Edit Trust Relationship (编辑信任关系)。
-
添加以下策略文档。这允许 AccountA 中的 Job-Execution-Role-A 代入 Cross-Account-Role-B 角色。
- JSON
-
-
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": "arn:aws:iam::123456789012:role/Job-Execution-Role-A",
"Sid": "AllowSTSAssumerole"
}
]
}
-
授予 AccountA 中的 Job-Execution-Role-A 代入 Cross-Account-Role-B 的 Amazon STS AssumeRole 权限。
-
在Amazon账户 AccountA 中的 IAM 控制台中,选择 Job-Execution-Role-A。
-
添加以下 Job-Execution-Role-A 策略语句以便对 Cross-Account-Role-B 角色执行 AssumeRole 操作。
- JSON
-
-
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::123456789012:role/Cross-Account-Role-B"
],
"Sid": "AllowSTSAssumerole"
}
]
}
代入角色示例
使用单个代入角色访问账户中的所有 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_ARN、tez.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 作业运行。
- 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": "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
-
以下示例展示了如何使用代入角色启动有权跨账户访问 S3 的 EMR Serverless 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 资源
在 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-1 访问存储桶 bucket1,使用 arn:aws:iam::AccountB:role/Cross-Account-Role-B-2 访问存储桶 bucket2。以下示例展示了如何通过多个代入角色启动具有跨账户访问权限的 EMR Serverless 作业运行。
- Spark
-
以下示例展示了如何使用多个代入角色来创建 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": "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 Serverless 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"
}
}]
}'