View a markdown version of this page

在亚马逊 SageMaker 统一工作室中使用可信身份传播 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

在亚马逊 SageMaker 统一工作室中使用可信身份传播

本教程介绍如何使用可信身份传播 (TIP) 设置 EMR 无服务器应用程序。然后,您可以通过 Amazon U SageMaker nified Studio 使用基于身份的访问控制来查询示例表。通过这种设置,EMR Serverless 使用他们自己的 IAM 身份中心身份运行每个用户的 Spark 查询,而 Lake Formation 会强制每个用户对 Amazon Glue 数据目录表的权限。

EMR Studio 交互式工作负载不支持 TIP

通过 EMR Studio 的交互式工作负载不支持使用 EMR 无服务器进行可信身份传播。使用亚马逊 SageMaker 统一工作室作为 TIP-enabled 交互式工作负载的面向客户端的应用程序。

成本

本教程使用的 Amazon 服务可能会产生费用,包括EMR Serverless、 Amazon Lake Formation、 Amazon IAM Identity Center、亚马逊简单存储服务和亚马逊 SageMaker 统一工作室。为避免持续收费,请按照本教程末尾的清理步骤进行操作。有关定价信息,请参阅每项服务的定价页面。

先决条件和设置

在使用可信身份传播查询数据之前,完成以下步骤以设置所有必需的资源。

第 1 步:设置 IAM 身份中心

  1. https://docs.amazonaws.cn/singlesignon/latest/userguide/enable-identity-center.html在您的 Amazon 账户中启用 IAM 身份中心。IAM 身份中心实例只能存在于每个账户的单个区域中。

    重要

    记下您的 IAM 身份中心部署在哪个区域。所有后续资源(Lake Formation、EMR Serverless、 Amazon Glue)都必须在同一个区域中创建。例如,如果您的 IAM 身份中心位于 us-west-2 中,则所有资源也必须位于 us-west-2 中。

  2. 手动或通过外部身份提供商(例如 Okta 或 Microsoft Entra ID)进行同步,将用户和群组配置到 IAM 身份中心。

  3. 记下您的 IAM 身份中心实例 ARN。在后续步骤中您将需要它。在 IAM 身份中心控制台的 “设置” 下找到它。

    要以编程方式查找您的实例,请运行:

    aws sso-admin list-instances --region your-region

    输出示例:

    { "Instances": [ { "InstanceArn": "arn:aws:sso:::instance/ssoins-1234567890abcdef", "IdentityStoreId": "d-1234567890", "OwnerAccountId": "123456789012", "Status": "ACTIVE" } ] }

步骤 2:使用 IAM 身份中心配置 Lake Formation

  1. 打开 Lake Formation 控制台。

  2. 设置数据湖管理员。

    重要

    确保在 Lake Formation 中将您用于运行这些命令的 IAM 角色或用户添加为数据湖管理员。否则,您在创建数据库或表时将收到 “Lake Formation 权限不足” 错误。要将您的角色添加为管理员,请执行以下操作:

    aws lakeformation put-data-lake-settings \ --data-lake-settings '{ "DataLakeAdmins": [ {"DataLakePrincipalIdentifier": "arn:aws:iam::account-id:role/your-role"} ], "CreateDatabaseDefaultPermissions": [], "CreateTableDefaultPermissions": [], "Parameters": {"CROSS_ACCOUNT_VERSION": "3", "SET_CONTEXT": "TRUE"} }'
  3. 使用您在步骤 1 中记下的实例 ARN 为 Lake Formation 创建 IAM 身份中心集成:

    aws lakeformation create-lake-formation-identity-center-configuration \ --catalog-id account-id \ --instance-arn "arn:aws:sso:::instance/ssoins-instance-id"
  4. 为 Lake Formation 位置注册创建 IAM 角色。请勿使用服务相关角色进行可信身份传播。有关更多信息,请参阅使用 IAM 身份中心设置 Amazon Lake Formation 。

    信任政策:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lakeformation.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:SetContext" ] } ] }
    sts: SetContext 为必填项

    信任策略必须包括sts:SetContext,这是传播可信身份所必需的。默认向导创建的 IAM 角色是服务相关角色,不包括sts:SetContext。如果您之前使用服务相关角色注册了某个地点,则必须使用包含以下内容的自定义角色重新注册该地点。sts:SetContext

    权限政策(授予对 Amazon S3 数据位置的访问权限):

    { "Version": "2012-10-17", "Statement": [ { "Sid": "LakeFormationDataAccessPermissionsForS3", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::your-data-bucket/*" ] }, { "Sid": "LakeFormationDataAccessPermissionsForS3ListBucket", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::your-data-bucket" ] } ] }

    创建角色并附加策略:

    aws iam create-role \ --role-name LFLocationRegistrationRole \ --assume-role-policy-document file://lf-trust-policy.json \ --description "Lake Formation location registration role with sts:SetContext for TIP" aws iam put-role-policy \ --role-name LFLocationRegistrationRole \ --policy-name LFDataAccessPolicy \ --policy-document file://lf-permissions-policy.json
  5. 使用您创建的角色向 Lake Formation 注册您的 Amazon S3 数据位置:

    aws lakeformation register-resource \ --resource-arn "arn:aws:s3:::your-data-bucket" \ --role-arn "arn:aws:iam::account-id:role/LFLocationRegistrationRole"
  6. 在 Glue 数据目录 Amazon 中创建指向示例数据的数据库和表。

  7. 授予 IAM 身份中心用户或群组对数据库和表的权限。

    重要

    除了表上的 SELECT 和 DESCRIBE 之外,还必须对数据库授予 DESCRIBE。如果没有数据库级权限,使用基于身份的访问权限时,数据库将不会出现在 SHOW DATABASES 结果中。

    使用控制台:

    1. 在 Lake Formation 控制台中,选择数据湖权限 > 授权。

    2. 在 “委托人” 下,选择 IAM 身份中心用户和群组,然后选择您的用户或群组。

    3. 在 “命名数据目录资源” 下,选择您的数据库。

    4. 在 “数据库权限” 下,选择 “描述” 。

    5. 选择授权。

    6. 重复第 1 步到第 5 步,这次选择表并授予 “在表下选择” 和 “描述” 权限。

    使用 Amazon CLI:

    重要

    在 Lake Formation 补助金中,IAM 身份中心用户的主体标识符格式为:arn:aws:identitystore:::user/<UserId>。注意三重冒号 (:::)。未指定区域或账户。 UserId 从 Identity Store 获取:

    # List users to get their UserIds aws identitystore list-users --identity-store-id identity-store-id --region your-region # Grant DESCRIBE on the database aws lakeformation grant-permissions \ --principal '{"DataLakePrincipalIdentifier": "arn:aws:identitystore:::user/UserId"}' \ --permissions '["DESCRIBE"]' \ --resource '{"Database": {"DatabaseName": "tip_tutorial_db", "CatalogId": "account-id"}}' # Grant SELECT and DESCRIBE on the table aws lakeformation grant-permissions \ --principal '{"DataLakePrincipalIdentifier": "arn:aws:identitystore:::user/UserId"}' \ --permissions '["SELECT","DESCRIBE"]' \ --resource '{"Table": {"DatabaseName": "tip_tutorial_db", "Name": "employees", "CatalogId": "account-id"}}'

步骤 3:创建 TIP-enabled EMR 无服务器应用程序

确保您的 IAM 角色拥有创建应用程序所需的 IAM 身份中心权限:

"sso:DescribeInstance", "sso:CreateApplication", "sso:DeleteApplication", "sso:PutApplicationAuthenticationMethod", "sso:PutApplicationAssignmentConfiguration", "sso:PutApplicationGrant", "sso:PutApplicationAccessScope"

创建具有可信身份传播、启用 Apache Livy 端点并将 Amazon Glue 数据目录配置为元存储的应用程序:

aws emr-serverless create-application \ --release-label emr-7.8.0 \ --type "SPARK" \ --identity-center-configuration '{"identityCenterInstanceArn": "arn:aws:sso:::instance/ssoins-instance-id"}' \ --interactive-configuration '{"livyEndpointEnabled":true}' \ --runtime-configuration '[{"classification": "spark-defaults", "properties": {"spark.sql.catalogImplementation": "hive", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"}}]'
重要

Amazon CLI 版本要求:--identity-center-configuration--interactive-configuration、和--runtime-configuration标志需要 Amazon CLI v2.15+。如果你收到 “未知选项” 错误,请升级你的 Amazon CLI 或使用 Python boto3 (v1.35+) 作为替代方案:

import boto3 session = boto3.Session(profile_name='your-profile', region_name='your-region') client = session.client('emr-serverless') response = client.create_application( name='tip-tutorial-app', releaseLabel='emr-7.8.0', type='SPARK', identityCenterConfiguration={ 'identityCenterInstanceArn': 'arn:aws:sso:::instance/ssoins-instance-id' }, interactiveConfiguration={ 'livyEndpointEnabled': True }, runtimeConfiguration=[ { 'classification': 'spark-defaults', 'properties': { 'spark.sql.catalogImplementation': 'hive', 'spark.hadoop.hive.metastore.client.factory.class': 'com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory' } } ] ) print(response['applicationId'])
Glue 数据目录元存储配置

Amazon Glue metastore 工厂类的runtimeConfiguration设置确保 Spark 会话可以访问 Glue 数据目录中的所有表格类型(CSV、Parquet、ORC、Iceberg) Amazon 。spark.sql.catalogImplementation如果没有此配置,可能只有 Iceberg 表格可见。

TIP 需要 Apache Livy 端点

可信身份传播需要--interactive-configuration '{"livyEndpointEnabled":true}'。TIP 仅为 Apache Livy 端点启用。

如果您没有所需的 IAM 身份中心权限,请创建不带--identity-center-configuration参数的应用程序,并要求您的 IAM 身份中心管理员稍后使用更新应用程序 API 启用 TIP:

aws emr-serverless update-application \ --application-id application-id \ --identity-center-configuration '{"identityCenterInstanceArn": "arn:aws:sso:::instance/ssoins-instance-id"}'

步骤 4:配置任务执行角色

任务执行角色的信任策略必须包括sts:SetContext以允许 EMR Serverless 使用用户的身份增强凭证:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "emr-serverless.amazonaws.com" }, "Action": ["sts:AssumeRole", "sts:SetContext"] } ] }

创建该角色:

aws iam create-role \ --role-name emr-serverless-tip-job-role \ --assume-role-policy-document file://trust-policy.json \ --description "EMR Serverless job execution role with TIP support"

为任务将访问的下游服务附加权限。该角色需要 Lake Formation、 Amazon Glue、Amazon S3 和 Amazon L CloudWatch ogs 权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "LakeFormationAndGlueAccess", "Effect": "Allow", "Action": [ "lakeformation:GetDataAccess", "glue:GetTable", "glue:GetTables", "glue:GetDatabase", "glue:GetDatabases", "glue:GetPartitions" ], "Resource": "*" }, { "Sid": "S3DataAccess", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::your-data-bucket", "arn:aws:s3:::your-data-bucket/*" ] }, { "Sid": "CloudWatchLogsAccess", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": "arn:aws:logs:region:account-id:*" } ] }
除了 Lake Formation 权限外,还需要 S3 权限

除了 Lake Formation 和 Glue 权限外s3:PutObject,还需要数据存储桶上的 Amazon S3 权限(s3:GetObject Amazon 、、s3:ListBucket)。Spark 暂存和随机播放数据需要该s3:PutObject权限。如果没有 Amazon S3 权限,Spark 任务在读取基础数据文件或写入临时数据时可能会因访问被拒绝错误而失败。

CloudWatch 需要日志权限

传输 Spark 驱动程序和执行器日志需要亚马逊 CloudWatch 日志权限。没有它们,Spark 会话可能无法启动。

将该策略附加到角色:

aws iam put-role-policy \ --role-name emr-serverless-tip-job-role \ --policy-name tip-lakeformation-access \ --policy-document file://permissions-policy.json

向任务执行角色授予 Lake Formation 权限:

任务执行角色还需要数据库和表的 Lake Formation 权限。这是对 IAM 身份中心用户的补助金之外的补助。

# Grant DESCRIBE on the database to the job role aws lakeformation grant-permissions \ --principal '{"DataLakePrincipalIdentifier": "arn:aws:iam::account-id:role/emr-serverless-tip-job-role"}' \ --permissions '["DESCRIBE"]' \ --resource '{"Database": {"DatabaseName": "tip_tutorial_db", "CatalogId": "account-id"}}' # Grant SELECT and DESCRIBE on the table to the job role aws lakeformation grant-permissions \ --principal '{"DataLakePrincipalIdentifier": "arn:aws:iam::account-id:role/emr-serverless-tip-job-role"}' \ --permissions '["SELECT","DESCRIBE"]' \ --resource '{"Table": {"DatabaseName": "tip_tutorial_db", "Name": "employees", "CatalogId": "account-id"}}'

有关其他下游服务配置,请参阅在 EMR 无服务器中使用 Lake Formation 和在 EMR 无服务器中使用 Amazon S3 访问授权。

通过 Amazon U SageMaker nified Studio 通过可信身份传播查询数据

完成设置后,您可以使用 TIP-enabled EMR 无服务器应用程序在亚马逊 SageMaker 统一工作室项目中作为计算来查询数据。EMR Serverless 使用他们自己的 IAM 身份中心身份运行每个用户的查询,Lake Formation 强制执行每个用户的权限。

先决条件

  • TIP-enabled EMR 无服务器应用程序(在上述步骤 3 中完成)。

  • 配置了 IAM 身份中心身份验证的 Amazon U SageMaker nified Studio 域。

  • 向您的 IAM 身份中心用户或群组授予目标数据库和表上的 Lake Formation 权限(在上面的步骤 2 中完成)。

第 5 步:创建启用 TIP 的 Amazon U SageMaker nified Studio 项目

  1. 使用您的 IAM 身份中心证书登录亚马逊 SageMaker 统一工作室。

  2. 创建新项目,或打开现有 项目。

  3. 在项目设置中,确保配置文件已在蓝图参数true中enableTrustedIdentityPropagationPermissions设置为。

步骤 6:将 EMR Serverless 应用程序添加为计算应用程序

亚马逊 SageMaker 统一工作室项目计算配置目前不支持通过控制台添加现有的 EMR 无服务器应用程序。 Amazon CLI 使用创建连接:

aws datazone create-connection \ --domain-identifier domain-id \ --name "my-emr-serverless-connection" \ --environment-identifier environment-id \ --props '{ "sparkEmrProperties": { "computeArn": "arn:aws:emr-serverless:region:account-id:/applications/application-id", "runtimeRole": "arn:aws:iam::account-id:role/emr-serverless-tip-job-role" } }'

替换以下值:

  • domain-id:您的亚马逊 SageMaker 统一工作室域名标识符。

  • environment-id:项目的环境标识符(使用工具环境)。

  • application-id:步骤 3 中的 EMR 无服务器应用程序 ID。

  • emr-serverless-tip-job-role:步骤 4 中的任务执行角色。

重要

create-connectionAPI 要求调用者是 DataZone 项目的成员。如果您收到AccessDeniedException,请在创建连接之前将您的 IAM 角色添加为项目参与者:

import boto3 session = boto3.Session(profile_name='your-profile', region_name='your-region') client = session.client('datazone') client.create_project_membership( domainIdentifier='domain-id', projectIdentifier='project-id', designation='PROJECT_CONTRIBUTOR', member={'userIdentifier': 'arn:aws:iam::account-id:role/your-role'} )

配置项目的 DataZone 用户角色以获得 EMR 无服务器访问权限。

项目环境的 DataZone 用户角色必须具有与 EMR Serverless 应用程序交互的权限。向角色添加以下内联策略(角色名称遵循模式datazone_usr_role_<project-id>_<environment-id>):

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:GetApplication", "emr-serverless:StartApplication", "emr-serverless:StopApplication", "emr-serverless:ListApplications", "emr-serverless:CreatePresignedUrl", "emr-serverless:AccessLivyEndpoints", "emr-serverless:StartJobRun", "emr-serverless:GetJobRun", "emr-serverless:ListJobRuns", "emr-serverless:CancelJobRun", "emr-serverless:GetDashboardForJobRun" ], "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/emr-serverless-tip-job-role", "Condition": { "StringLike": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } } ] }

向 DataZone 用户角色授予 Lake Formation 权限:

# Grant DESCRIBE on the database aws lakeformation grant-permissions \ --principal '{"DataLakePrincipalIdentifier": "arn:aws:iam::account-id:role/datazone_usr_role_project-id_environment-id"}' \ --permissions '["DESCRIBE"]' \ --resource '{"Database": {"DatabaseName": "tip_tutorial_db", "CatalogId": "account-id"}}' # Grant SELECT and DESCRIBE on the table aws lakeformation grant-permissions \ --principal '{"DataLakePrincipalIdentifier": "arn:aws:iam::account-id:role/datazone_usr_role_project-id_environment-id"}' \ --permissions '["SELECT","DESCRIBE"]' \ --resource '{"Table": {"DatabaseName": "tip_tutorial_db", "Name": "employees", "CatalogId": "account-id"}}'
EMR 无服务器连接的控制台限制

亚马逊 SageMaker 统一工作室目前支持通过控制台计算配置在 EC2 集群上添加现有的亚马逊 EMR。对于 EMR 无服务器应用程序,使用上面显示 Amazon CLI 的方法。

第 7 步:查询示例表

  1. 在 Amazon SageMaker Unified Studio 项目中打开 JupyterLab IDE 空间。

  2. 选择 EMR 无服务器连接作为笔记本电脑执行的计算方式。

  3. 在新的笔记本电脑单元中,运行以下 PySpark 查询:

    %%pyspark my-emr-serverless-connection spark.sql("SHOW DATABASES").show() %%pyspark my-emr-serverless-connection spark.sql("SELECT * FROM tip_tutorial_db.employees LIMIT 10").show()
  4. 验证查询是否返回数据。这确认了您的 IAM 身份中心身份已传播到 Lake Formation,并且访问权限是根据您的身份授予的。

应用程序冷启动

创建连接后首次运行单元时,EMR Serverless 会启动应用程序(冷启动)。这可能需要 2 到 3 分钟。会话处于活动状态时,后续单元将在几秒钟内运行。

针对访问被拒绝错误进行问题排查

如果您收到 “访问被拒绝” 错误,请验证:

  • 您的 IAM 身份中心用户或群组已获得数据库和 Lake Formation 表格 SELECT/DESCRIBE 上的 DESCRIBE 权限。

  • 任务执行角色具有lakeformation:GetDataAccess和 Amazon Glue 数据目录权限。

  • DataZone 用户角色对数据库和表具有 Lake Formation 权限。

  • Lake Formation Amazon S3 位置使用自定义角色注册,该角色包含sts:SetContext(不是服务相关角色)。

问题排查

错误 原因 Fix
AccessDeniedException: emr-serverless:GetApplication DataZone 用户角色缺乏 EMR 无服务器权限。 将 EMR 无服务器内联策略添加到 DataZone 用户角色(请参阅步骤 6)。
等待应用程序达到 “已启动” 状态时超时 EMR 无服务器应用程序冷启动超过了默认超时。 Re-run 细胞。该应用程序继续在后台启动,并将在下次尝试时准备就绪。
未找到会话。由于空闲超时已清理。 由于任务执行角色的权限不足,Spark 会话无法启动。 确保任务执行角色拥有 Amazon S3、Amazon L CloudWatch ogs、 Amazon Glue 和 Lake Formation 权限(参见步骤 4)。
湖泊形成权限不足:需要在数据库上进行描述 您的身份或角色没有数据库级 Lake Formation 权限。 向 IAM 身份中心用户、任务执行角色和 DataZone 用户角色授予数据库上的 DESCRIBE。
TABLE_OR_VIEW_NOT_FOUND Spark 会话未配置为使用 Amazon Glue 数据目录。 确保 EMR 无服务器应用程序在其中包含spark.sql.catalogImplementation=hive和 Gl Amazon ue 元数据仓工厂类runtimeConfiguration(参见步骤 3)。
AccessDeniedException: CreateConnection 调用者不是该 DataZone 项目的成员。 在致电之前,将您的角色添加为项目参与者create-connection(参见步骤 6)。

清理资源

要避免为此教程创建的资源持续产生费用,您应删除:

  1. 删除 EMR 无服务器应用程序。

  2. 移除亚马逊 SageMaker 统一工作室连接并删除亚马逊 SageMaker 统一工作室项目(以及域名,如果您仅为本教程创建了域名)。

  3. 撤消您授予的 Lake Formation 权限,并注销 Amazon S3 数据位置的注册。

  4. 删除您在步骤 2 和步骤 4 中创建的 IAM 角色。

  5. 删除所有测试 Amazon S3 存储桶和示例数据。

后续步骤

  • 要在中验证身份传播 CloudTrail,请使用 sts:SetContext EMR 无服务器服务查找AssumeRole事件。

  • 要限制不同用户的访问权限,请创建额外的 IAM 身份中心用户,并在同一个表上向他们授予不同的 Lake Formation 权限(例如,列级或行级筛选)。

  • 对于生产部署,将任务执行角色的 Amazon S3 和 Amazon Glue 权限范围限定为特定资源,而不是使用通配符。

  • 有关在 Amazon Unified Studio 中使用 EMR Serverless 的更多信息,请参阅 Amazon U SageMaker nified Studio 中的 EMR 无服务器。 SageMaker