在另一個存取 S3 資料 AWS 來自EMR無伺服器的帳戶 - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在另一個存取 S3 資料 AWS 來自EMR無伺服器的帳戶

您可以從一個方式執行 Amazon EMR 無伺服器任務 AWS 帳戶並將其設定為存取屬於另一個儲存貯體的 Amazon S3 儲存貯體中的資料 AWS 帳戶。本頁說明如何設定從EMR無伺服器對 S3 的跨帳戶存取。

在EMR無伺服器上執行的任務可以使用 S3 儲存貯體政策或假定角色從不同的角色存取 Amazon S3 中的資料 AWS 帳戶。

必要條件

若要為 Amazon EMR 無伺服器設定跨帳戶存取,您必須在登入兩個任務時完成任務 AWS 帳戶:

  • AccountA— 這就是 AWS 您已建立 Amazon EMR 無伺服器應用程式的帳戶。在設定跨帳戶存取權之前,您必須在此帳戶中準備好下列項目:

  • 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 跨帳戶存取的詳細資訊,請參閱 Amazon 簡單儲存貯體服務使用者指南中的範例 2:儲存貯體擁有者授予跨帳戶儲存貯體許可。

使用假定角色存取跨帳戶 S3 資料

另一種為 Amazon EMR 無伺服器設定跨帳戶存取的方法是使AssumeRole用 AWS Security Token Service (AWS STS). AWS STS 是一項全域 Web 服務,可讓您為使用者請求臨時、有限權限的憑證。您可以使用您建立的臨時安全登入資料API呼叫EMR無伺服器和 Amazon S3。AssumeRole

下列步驟說明如何使用假定角色從EMR無伺服器存取跨帳戶 S3 資料:

  1. 創建一個 Amazon S3 存儲桶,cross-account-bucket,在中AccountB。如需詳細資訊,請參Amazon 簡單儲存服務使用者指南中的建立儲存貯體。如果想要擁有對 DynamoDB 的跨帳戶存取權,也可以在 AccountB 中建立 DynamoDB 資料表。如需詳細資訊,請參閱 Amazon DynamoDB 開發人員指南中的建立 DynamoDB 表格

  2. 在中建立可AccountB存取的Cross-Account-Role-BIAM角色 cross-account-bucket.

    1. 登入 AWS Management Console 然後在開啟IAM主控台https://console.aws.amazon.com/iam/

    2. 選擇角色,並建立一個新角色 Cross-Account-Role-B。如需有關如何建立IAM角色的詳細資訊,請參閱《IAM使用指南》中的〈建立IAM角色〉。

    3. 建立指定存取權限Cross-Account-Role-B的IAM策略 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。如需詳細資訊,請參閱 Amazon DynamoDB:允許存取IAM使用者指南中的特定表格

    以下是允許存取 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. 若要設定角色的信任關係,請為您在步驟 2 中建立的角色選擇IAM主控台中Cross-Account-Role-B的 [信任關係] 索引標籤。

    2. 選取編輯信任關係

    3. 新增下列原則文件。這允許Job-Execution-Role-A在中AccountA擔任該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-A AccountA 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無伺服器 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

下列範例顯示如何使用假定角色,透過跨帳戶存取 S3 來啟動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", "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無伺服器版本 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" } }] }'