配置 Amazon EMR 步骤的运行时角色 - Amazon EMR

配置 Amazon EMR 步骤的运行时角色

运行时角色是 AWS Identity and Access Management(IAM)角色,您可以通过 Amazon EMR 步骤指定。您使用 Amazon EMR 步骤提交的任务使用运行时角色访问 AWS 资源,例如 Amazon S3 中的对象。您还可以根据 Amazon EMR 运行时角色强制执行表和列权限以使用 AWS Lake Formation 管理对数据湖的访问。Apache Hive 和 Apache Spark 任务将在运行时使用这些权限。这样,您可以单独管理每个 Amazon EMR 步骤的访问控制,而不是共享 Amazon EMR 集群实例配置文件的所有步骤。

注意

当您为 Amazon EMR 步骤指定运行时角色时,您使用 Amazon EMR 步骤提交的任务只能访问附加到运行时角色的策略所允许的 AWS 资源。这些任务不能使用集群的 EC2 实例配置文件来访问任何 AWS 资源。

使用运行时角色启动 Amazon EMR 集群的先决条件

步骤 1:在 Amazon EMR 中设置安全配置

使用以下 JSON 结构创建安全配置,并将 EnableApplicationScopedIAMRole 设置为 true

{ "AuthorizationConfiguration":{ "IAMConfiguration":{ "EnableApplicationScopedIAMRole":true } } }

将运行时角色与 Amazon EMR 步骤结合使用时,您将无需在安全配置中启用 Kerberos。Amazon EMR 会自动将您的集群配置为在本地使用 MIT KDC,并管理集群上运行的 MIT KDC 中的主体。

PropagateSourceIdentity

使用源身份时,您可以监控和控制您对 IAM 角色执行的操作。如果您已经使用了源身份,请将 ApplicationScopedIAMRoleConfiguration/PropagateSourceIdentity 设置为 true 以激活源身份,如下所示。

{ "AuthorizationConfiguration":{ "IAMConfiguration":{ "EnableApplicationScopedIAMRole":true, "ApplicationScopedIAMRoleConfiguration":{ "PropagateSourceIdentity":true } } } }

当您将 PropagateSourceIdentity 设置为 true 时,Amazon EMR 将调用 Amazon EMR AddJobFlowSteps API 所用的会话凭证中的源身份用于您使用运行时角色创建的会话。如果会话凭证中没有源身份,则 Amazon EMR 不会在使用运行时角色创建的会话中设置源身份。要使用该属性,您必须向实例配置文件提供 sts:SetSourceIdentity 权限,并确保您的运行时角色信任您的实例配置文件以设置源身份。了解有关源身份的更多信息,请参阅监控和控制使用所担任角色执行的操作

LakeFormationConfiguration

您可以使用 Lake Formation 为 AWS Glue Data Catalog 中的资源和 Amazon S3 中的数据应用精细访问控制(FGAC)。如果您使用 Lake Formation,您可以将 LakeFormationConfiguration/AuthorizedSessionTagValue 属性设置为 Amazon EMR,以确保这些权限适用于通过 Amazon EMR 步骤提交的任务,如下所示。

{ "AuthorizationConfiguration":{ "IAMConfiguration":{ "EnableApplicationScopedIAMRole":true, "LakeFormationConfiguration":{ "AuthorizedSessionTagValue":"Amazon EMR" } } } }
注意

Amazon EMR 仅支持使用 Apache Hive 和 Apache Spark 的基于 Lake Formation 的访问控制。

创建安全配置后,您就可以启动您的集群。有关如何启动集群的说明,请参阅 为集群指定安全配置

步骤 2:设置 Amazon EMR 运行时角色

将 IAM 策略附加到您的 Amazon EMR 运行时角色,以便您的任务可以访问其他 AWS 资源。要向 IAM 角色添加策略或编辑策略,请参阅添加和删除 IAM 身份权限编辑 IAM 策略

如果想要确保 Lake Formation 可以访问您的数据湖,您可以附加其他策略,以便 Amazon EMR 可以访问 Lake Formation 和 AWS Glue Data Catalog。以下示例展示了如何允许运行时角色创建表、更新表元数据和读取表元数据。您可以根据需要自定义这些策略。

{ "Version":"2012-10-17", "Statement":{ "Sid":"LakeFormationManagedAccess", "Effect":"Allow", "Action":[ "lakeformation:GetDataAccess", "glue:Get*", "glue:Create*", "glue:Update*" ], "Resource":"*" } }

要为此角色定义 Lake Formation 权限,请参阅 步骤 4:设置信任策略。开启 Lake Formation 后,请确保只向 Amazon EMR 运行时角色授予对未与数据湖关联的 S3 存储桶的访问权限。仅通过 Lake Formation 和 AWS Glue Data Catalog 提供对数据湖 S3 存储桶的访问权限。不显式授予 S3 存储桶访问权限。

步骤 3:为 Amazon EMR 集群设置 EC2 实例配置文件

要将运行时角色与 Amazon EMR 步骤配合使用,请将以下策略添加到计划用作实例配置文件角色的 IAM 角色。使用这些策略,Amazon EMR 集群的底层 EC2 实例可以担任运行时角色并向该运行时角色应用标签。如果您在 步骤 1:在 Amazon EMR 中设置安全配置 中设置的安全配置中开启源身份传播,则只需要 PropagateSourceIdentity 语句。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"AllowRuntimeRoleUsage", "Effect":"Allow", "Action":[ "sts:AssumeRole", "sts:TagSession" ], "Resource":[ <runtime-role-ARN> ] }, { // If propagating source identity "Sid":"PropagateSourceIdentity", "Effect":"Allow", "Action":"sts:SetSourceIdentity", "Resource":[ <runtime-role-ARN> ], "Condition":{ "StringEquals":{ "sts:SourceIdentity":<source-identity> } } } ] }

要向 IAM 角色添加策略或编辑现有的内联式或托管式策略,请参阅添加和删除 IAM 身份权限

步骤 4:设置信任策略

对于您计划用作运行时角色的每个 IAM 角色,请更新信任关系,以便 EC2 实例配置文件角色可以担任运行时角色。以下示例策略实例配置文件为实例配置文件 EMR_EC2_DefaultRole 应用了 LakeFormationAuthorizedCaller 标签。如果您在 步骤 1:在 Amazon EMR 中设置安全配置 中设置的安全配置中开启了源身份传播,则只需要 AllowSetSourceIdentity 语句。如果您在安全配置中激活了 Lake Formation,则只需要 AllowPassSessionTagsAndTransitive 语句。要修改 IAM 角色的信任策略,请参阅修改角色信任策略

{ "Sid":"AllowAssumeRole", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::<AWS_ACCOUNT_ID>:role/EMR_EC2_DefaultRole" }, "Action":"sts:AssumeRole" }, { "Sid":"AllowPassSessionTagsAndTransitive", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::<AWS_ACCOUNT_ID>:role/EMR_EC2_DefaultRole" }, "Action":"sts:TagSession" }, { "Sid":"AllowSetSourceIdentity", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::<AWS_ACCOUNT_ID>:role/EMR_EC2_DefaultRole" }, "Action":[ "sts:SetSourceIdentity", "sts:AssumeRole" ], "Condition":{ "StringEquals":{ "sts:SourceIdentity":<source-identity> } } }

(可选)步骤 5:设置 Amazon EMR 集群以使用 Lake Formation

如果您使用 Lake Formation 访问数据湖,请使用此步骤。您需要将此步骤用于 Amazon EMR 任务以访问 Lake Formation。确保使用 AuthorizedSessionTagValueList 中的 Amazon EMR,如下面的示例所示。

aws lakeformation put-data-lake-settings --cli-input-json file://datalakesettings.json
{ "DataLakeSettings":{ "DataLakeAdmins":[ { "DataLakePrincipalIdentifier":"arn:aws:iam::<AWS_ACCOUNT_ID>:user/lakeAdmin" } ], "CreateDatabaseDefaultPermissions":[ ], "CreateTableDefaultPermissions":[ ], "TrustedResourceOwners":[ ], "AllowExternalDataFiltering":true, "ExternalDataFilteringAllowList":[ { "DataLakePrincipalIdentifier":<AWS_ACCOUNT_ID> } ], "AuthorizedSessionTagValueList":[ "Amazon EMR" ] } }

通过基于角色的访问控制启动 Amazon EMR 集群

设置配置后,您可以使用 步骤 1:在 Amazon EMR 中设置安全配置 安全配置来启动 Amazon EMR 集群。使用发行版标签 emr-6.7.0 或者更高版本,然后选择 Hive 和/或 Spark 作为集群应用程序。有关如何启动集群的说明,请参阅 为集群指定安全配置

使用 Amazon EMR 步骤提交 Spark 任务

下面示范了如何运行 Apache Spark 包含的 HdfsTest 示例。只有在提供的 Amazon EMR 运行时角色有权访问 S3_LOCATION 时,API 调用才会成功。

RUNTIME_ROLE_ARN=<runtime-role-arn> S3_LOCATION=<s3-path> REGION=<aws-region> CLUSTER_ID=<cluster-id> aws emr add-steps --cluster-id $CLUSTER_ID \ --steps '[{ "Name": "Spark Example", "ActionOnFailure": "CONTINUE","HadoopJarStep": { "Jar":"command-runner.jar","Args" : ["spark-example","HdfsTest", "$S3_LOCATION"] } }]' \ --execution-role-arn $RUNTIME_ROLE_ARN \ --region $REGION
注意

我们建议您关闭对 Amazon EMR 集群的 SSH 访问权限,并且只允许 Amazon EMR AddJobFlowSteps API 访问集群。

使用 Amazon EMR 步骤提交 Hive 任务

以下示例使用带有 EMR 步骤的 Apache Hive 提交任务以运行 QUERY_FILE.hql 文件。仅当提供的运行时角色可以访问查询文件的 S3 路径时,此查询才会成功。

RUNTIME_ROLE_ARN=<runtime-role-arn> REGION=<aws-region> CLUSTER_ID=<cluster-id> aws emr add-steps --cluster-id $CLUSTER_ID \ --steps '[{ "Name": "Run hive query using command-runner.jar - simple select","ActionOnFailure":"CONTINUE","HadoopJarStep": { "Jar": "command-runner.jar","Args" :["hive - f","s3://DOC_EXAMPLE_BUCKET/QUERY_FILE.hql"] } }]' \ --execution-role-arn $RUNTIME_ROLE_ARN \ --region $REGION

控制对 Amazon EMR 运行时角色的访问

您可以使用条件键 elasticmapreduce:ExecutionRoleArn 控制对运行时角色的访问。以下策略允许 IAM 主体使用名为 Caller 的 IAM 角色,或任何以字符串 CallerTeamRole 开头的 IAM 角色,作为具有 Amazon EMR 步骤的运行时角色。

重要

向调用者授予调用 AddJobFlowSteps API 的访问权限时,您必须创建基于 elasticmapreduce:ExecutionRoleArn 上下文键的条件,如以下示例所示。

{ "Sid":"AddStepsWithSpecificExecRoleArn", "Effect":"Allow", "Action":[ "elasticmapreduce:AddJobFlowSteps" ], "Resource":"*", "Condition":{ "StringEquals":{ "elasticmapreduce:ExecutionRoleArn":[ "arn:aws:iam::<AWS_ACCOUNT_ID>:role/Caller" ] }, "StringLike":{ "elasticmapreduce:ExecutionRoleArn":[ "arn:aws:iam::<AWS_ACCOUNT_ID>:role/CallerTeamRole*" ] } } }

使用具有运行时角色的外部 ID

当您使用外部 ID 担任运行时角色时,可以断言您正在操作的环境。您可以使用具有运行时角色的外部 ID 来断言只有附加了特定安全配置的 Amazon EMR 集群才能通过 Amazon EMR 步骤担任 IAM 运行时角色。

Amazon EMR 将为对于已激活的 Amazon EMR 步骤具有运行时角色的每个安全配置生成唯一标识符 ExternalId。您可以使用 Amazon EMR DescribeSecurityConfiguration API 查找外部 ID,如以下示例所示。集群上运行时角色的所有 AssumeRole 调用都将使用此外部 ID。您可以选择使用此外部 ID 更改运行时角色的信任策略。

aws emr describe-security-configuration --name 'iamconfig-with-lf'{"Name": "iamconfig-with-lf", "SecurityConfiguration": "{\"AuthorizationConfiguration\":{\"IAMConfiguration\":{\"EnableApplicationScopedIAMRole\ ":true,\"ApplicationScopedIAMRoleConfiguration\":{\"PropagateSourceIdentity\":true,\"Exter nalId\":\"FXH5TSACFDWUCDSR3YQE2O7ETPUSM4OBCGLYWODSCUZDNZ4Y\"}},\"Lake FormationConfiguration\":{\"AuthorizedSessionTagValue\":\"Amazon EMR\"}}}", "CreationDateTime": "2022-06-03T12:52:35.308000-07:00" }

其它注意事项

此外,在为 Amazon EMR 配置运行时角色时,请考虑以下事项。

  • Amazon EMR 步骤仅支持商业 AWS 区域。

  • 您必须使用 Amazon EMR 发行版 emr-6.7.0 或者更高版本。

  • Amazon EMR 步骤支持 Apache Spark 和 Apache Hive(搭配 Apache Tez)。

  • 您只能为通过 Amazon EMR 步骤提交的任务指定运行时角色。

  • 目前,我们仅支持使用 AddJobFlowSteps 的步骤。我们不支持使用 RunJobFlow 的步骤。

  • Amazon EMR 步骤支持 Livy 端点和 JDBC/ODBC 客户端。

  • 通过 Apache Spark 和 Apache Hive 支持基于 Lake Formation 的访问控制的操作包括 selectdescribeshow databaseshow tableshow columnshow partition

  • 通过不受监管的 Apache Spark 表支持基于 Lake Formation 的访问控制的操作包括 insert intoinsert overwritealter table

  • Amazon EMR 不支持基于 Lake Formation 的访问控制。这些功能包括:

    • 写入受监管表

    • 写入不受监管的 Apache Hive 表

    • 使用 Lake Formation 数据筛选条件

    • 使用任何 DDL

  • Amazon EMR 步骤不支持高可用性集群。

  • Amazon EMR 步骤不支持 Apache Ranger。