Amazon DataZone 问题排查 - Amazon DataZone

Amazon DataZone 问题排查

如果您在使用 Amazon DataZone 时遇到拒绝访问或类似的问题,请参阅此部分中的主题。

对 Amazon DataZone 的 AWS Lake Formation 权限进行问题排查

此部分包含您在为 Amazon DataZone 配置 Lake Formation 权限时可能遇到的问题的问题排查说明。

数据门户中的错误消息 解决方案

无法代入数据访问角色。

当 Amazon DataZone 无法代入您用于在账户中启用 DefaultDataLakeBlueprintAmazonDataZoneGlueDataAccessRole 时,将显示此错误。要修复此问题,请使用数据资产所在的账户转至 AWS IAM 控制台,并确保 AmazonDataZoneGlueDataAccessRole 与 Amazon DataZone 服务主体建立了正确的信任关系。有关更多信息,请参阅 AmazonDataZoneGlueAccess-<region>-<domainId>

数据访问角色没有必要的权限,无法读取您尝试订阅的资产的元数据。

当 Amazon DataZone 成功代入 AmazonDataZoneGlueDataAccessRole 角色但该角色没有必要的权限时,将显示此错误。要修复此问题,请使用数据资产所在的账户转至 AWS IAM 控制台,并确保该角色已附加 AmazonDataZoneGlueManageAccessRolePolicy。有关更多信息,请参阅 AmazonDataZoneGlueAccess-<region>-<domainId>

资产是一项资源链接。Amazon DataZone 不支持订阅资源链接。

当您尝试发布到 Amazon DataZone 的资产是指向 AWS Glue 表的资源链接时,将显示此错误。

资产不由 AWS Lake Formation 管理。

此错误指明未对要发布的资产强制实施 AWS Lake Formation 权限。此错误会在以下情况下出现。

  • 资产的 Amazon S3 位置未注册到 AWS Lake Formation。要修复此问题,请使用表所在的账户登录 AWS Lake Formation 控制台,然后在 AWS Lake Formation 模式或混合模式下注册 Amazon S3 位置。有关更多信息,请参阅 Registering an Amazon S3 location(注册 Amazon S3 位置)。在几种情况下,需要进行进一步的修改。这些情况包括加密的 AmazonS3 存储桶或跨账户 S3 存储桶和 AWS Glue 目录设置。在这些情况下,可能需要修改 KMS 和/或 S3 设置。有关更多信息,请参阅 Registering an encrypted Amazon S3 location

  • Amazon S3 位置已在 AWS Lake Formation 模式下注册,但 IAMAllowedPrincipal 已添加到表的权限。要修复此问题,您可以从表的权限中删除 IAMAllowedPrincipal,也可以在混合模式下注册 S3 位置。有关更多信息,请参阅关于升级为 Lake Formation 权限模型。如果您的 S3 位置已加密或 S3 位置与您的 AWS Glue 表位于不同的账户中,请按照 Registering an encrypted Amazon S3 location 中的说明进行操作。

数据访问角色没有必要的 Lake Formation 权限,无法授予对该资产的访问权限。

此错误指明,您用于在账户中启用 DefaultDataLakeBlueprintAmazonDataZoneGlueDataAccessRole 不具有 Amazon DataZone 的必要权限,无法管理已发布的资产的权限。您可通过以 AWS Lake Formation 管理员身份添加 AmazonDataZoneGlueDataAccessRole 或向 AmazonDataZoneGlueDataAccessRole 授予要发布的资产的以下权限来解决此问题。

  • 对资产所在的数据库的“描述”和“描述可授予”权限

  • 对数据库中所有资产的“描述”、“选择”、“描述可授予”、“选择可授予”权限,您希望 Amazon DataZone 代表您管理这些资产的访问权限。

对与上游资产关联的 Amazon DataZone 世系资产进行问题排查

此部分包含您可能遇到的与 Amazon DataZone 世系相关的问题的问题排查说明。对于一些与 AWS Glue 和 Amazon Redshift 相关的开放世系运行事件,您可能会发现资产世系未链接到上游数据集。本主题说明了场景和几种缓解问题的方法。有关世系的更多信息,请参阅 Amazon DataZone 中的数据血统支持

世系节点上的 SourceIdentifier

世系节点中的 sourceIdentifier 属性表示数据集上发生的事件。有关更多信息,请参阅世系节点中的关键属性

世系节点表示在相应的数据集或作业上发生的所有事件。世系节点包含一个“sourceIdentifier”属性,该属性包含相应的数据集/作业的标识符。由于我们支持 open-lineage 事件,因此默认情况下,sourceIdentifier 值将以数据集、作业和作业运行的“命名空间”和“名称”的组合形式填充。

对于 AWS Glue 和 Amazon Redshift 等 AWS 资源,sourceIdentifier 将是 AWS Glue 表 ARN 和 Redshift 表 ARN,Amazon DataZone 将从中构造 run-event 以及其他详细信息,如下所示:

注意

在 AWS 中,ARN 包含每个资源的 accountId、区域、数据库和表等信息。

  • 这些数据集的 OpenLineage 事件包含数据库和表名。

  • 区域是在运行的“environment-properties”分面捕获的。如果区域不存在,系统将使用调用方凭证中的区域。

  • AccountId 是从调用方凭证中提取的。

DataZone 中资产的 SourceIdentifier

AssetCommonDetailForm 具有一个名为“sourceIdentifier”的属性,该属性表示资产代表的数据集的标识符。对于要链接到上游数据集的资产世系节点,需要将该属性与数据集节点的 sourceIdentifier 所对应的值一起填充。如果资产由数据来源导入,则工作流会自动采用 AWS Glue 表 ARN/Redshift 表 ARN 的形式填充 sourceIdentifier,调用方将为通过 CreateAsset API 创建的其他资产(包括自定义资产)填充该值。

Amazon DataZone 如何从 OpenLineage 事件构造 sourceIdentifier?

对于 AWS Glue 和 Redshift 资产,从 Glue 和 Redshift ARN 构造 sourceIdentifier。以下是 Amazon DataZone 构造它的方式:

AWS Glue ARN

目标是构造一个 OpenLineage 事件,其中输出世系节点的 sourceIdentifier 为:

arn:aws:glue:us-east-1:123456789012:table/testlfdb/testlftb-1

要确定运行是否正在使用 AWS Glue 中的数据,请查看 environment-properties 分面中是否存在某些关键字。具体而言,如果存在这些指定字段中的任一字段,则系统会假定 RunEvent 源自 AWS Glue。

  • GLUE_VERSION

  • GLUE_COMMAND_CRITERIA

  • GLUE_PYTHON_VERSION

"run": { "runId":"4e3da9e8-6228-4679-b0a2-fa916119fthr", "facets":{ "environment-properties":{ "_producer":"https://github.com/OpenLineage/OpenLineage/tree/1.9.1/integration/spark", "_schemaURL":"https://openlineage.io/spec/2-0-2/OpenLineage.json#/$defs/RunFacet", "environment-properties":{ "GLUE_VERSION":"3.0", "GLUE_COMMAND_CRITERIA":"glueetl", "GLUE_PYTHON_VERSION":"3" } } }

对于 AWS Glue 运行,可以使用 symlinks 分面中的名称来获取数据库和表名,它们可用于构造 ARN。

需要确保名称为 databaseName.tableName

"symlinks": { "_producer":"https://github.com/OpenLineage/OpenLineage/tree/1.9.1/integration/spark", "_schemaURL":"https://openlineage.io/spec/facets/1-0-0/SymlinksDatasetFacet.json#/$defs/SymlinksDatasetFacet", "identifiers":[ { "namespace":"s3://object-path", "name":"testlfdb.testlftb-1", "type":"TABLE" } ] }

示例 COMPLETE 事件:

{ "eventTime":"2024-07-01T12:00:00.000000Z", "producer":"https://github.com/OpenLineage/OpenLineage/tree/1.9.1/integration/glue", "schemaURL":"https://openlineage.io/spec/2-0-2/OpenLineage.json#/$defs/RunEvent", "eventType":"COMPLETE", "run": { "runId":"4e3da9e8-6228-4679-b0a2-fa916119fthr", "facets":{ "environment-properties":{ "_producer":"https://github.com/OpenLineage/OpenLineage/tree/1.9.1/integration/spark", "_schemaURL":"https://openlineage.io/spec/2-0-2/OpenLineage.json#/$defs/RunFacet", "environment-properties":{ "GLUE_VERSION":"3.0", "GLUE_COMMAND_CRITERIA":"glueetl", "GLUE_PYTHON_VERSION":"3" } } } }, "job":{ "namespace":"namespace", "name":"job_name", "facets":{ "jobType":{ "_producer":"https://github.com/OpenLineage/OpenLineage/tree/1.9.1/integration/glue", "_schemaURL":"https://openlineage.io/spec/facets/2-0-2/JobTypeJobFacet.json#/$defs/JobTypeJobFacet", "processingType":"BATCH", "integration":"glue", "jobType":"JOB" } } }, "inputs":[ { "namespace":"namespace", "name":"input_name" } ], "outputs":[ { "namespace":"namespace.output", "name":"output_name", "facets":{ "symlinks":{ "_producer":"https://github.com/OpenLineage/OpenLineage/tree/1.9.1/integration/spark", "_schemaURL":"https://openlineage.io/spec/facets/1-0-0/SymlinksDatasetFacet.json#/$defs/SymlinksDatasetFacet", "identifiers":[ { "namespace":"s3://object-path", "name":"testlfdb.testlftb-1", "type":"TABLE" } ] } } } ] }

根据提交的 OpenLineage 事件,输出世系节点的 sourceIdentifier 将为:

arn:aws:glue:us-east-1:123456789012:table/testlfdb/testlftb-1

输出世系节点将连接到资产的世系节点,其中资产的 sourceIdentifier 为:

arn:aws:glue:us-east-1:123456789012:table/testlfdb/testlftb-1
屏幕截图显示资产的源标识符。
屏幕截图显示资产的源标识符。

Amazon Redshift ARN

目标是构造一个 OpenLineage 事件,其中输出世系节点的 sourceIdentifier 为:

arn:aws:redshift:us-east-1:123456789012:table/workgroup-20240715/tpcds_data/public/dws_tpcds_7

系统根据命名空间来确定输入或输出是否存储在 Redshift 中。具体而言,如果命名空间以 redshift:// 开头或包含字符串 redshift-serverless.amazonaws.com.rproxy.govskope.caredshift.amazonaws.com,则它是 Redshift 资源。

"outputs": [ { "namespace":"redshift://workgroup-20240715.123456789012.us-east-1.redshift.amazonaws.com:5439", "name":"tpcds_data.public.dws_tpcds_7" } ]

请注意,命名空间需采用以下格式:

provider://{cluster_identifier}.{region_name}:{port}

对于:redshift-serverless

"outputs": [ { "namespace":"redshift://workgroup-20240715.123456789012.us-east-1.redshift-serverless.amazonaws.com:5439", "name":"tpcds_data.public.dws_tpcds_7" } ]

这将产生以下 sourceIdentifier

arn:aws:redshift-serverless:us-east-1:123456789012:table/workgroup-20240715/tpcds_data/public/dws_tpcds_7

根据提交的 OpenLineage 事件,要映射到下游(即事件的输出)世系节点的 sourceIdentifier 为:

arn:aws:redshift-serverless:us-e:us-east-1:123456789012:table/workgroup-20240715/tpcds_data/public/dws_tpcds_7

该映射可帮助您可视化目录中资产的世系。

替代方法

当上述条件均不满足时,系统使用命名空间/名称来构造 sourceIdentifier

"inputs": [ { "namespace":"arn:aws:redshift:us-east-1:123456789012:table", "name":"workgroup-20240715/tpcds_data/public/dws_tpcds_7" } ], "outputs": [ { "namespace":"arn:aws:glue:us-east-1:123456789012:table", "name":"testlfdb/testlftb-1" } ]

排查资产世系节点缺少上游的问题

如果您看不到资产世系节点的上游,则可以执行以下操作来排查它未与数据集关联的原因:

  1. 在提供 domainIdassetId 的同时调用 GetAsset

    aws datazone get-asset --domain-identifier <domain-id> --identifier <asset-id>

    响应如下所示:

    { ..... "formsOutput": [ ..... { "content": "{\"sourceIdentifier\":\"arn:aws:glue:eu-west-1:123456789012:table/testlfdb/testlftb-1\"}", "formName": "AssetCommonDetailsForm", "typeName": "amazon.datazone.AssetCommonDetailsFormType", "typeRevision": "6" }, ..... ], "id": "<asset-id>", .... }
  2. 调用 GetLineageNode 以获取数据集世系节点的 sourceIdentifier。由于无法直接获取相应数据集节点的世系节点,因此您可以先对作业运行调用 GetLineageNode

    aws datazone get-lineage-node --domain-identifier <domain-id> --identifier <job_namespace>.<job_name>/<run_id> if you are using the getting started scripts, job name and run ID are printed in the console and namespace is "default". Otherwise you can get these values from run event content.

    示例响应看起来与以下内容类似:

    { ..... "downstreamNodes": [ { "eventTimestamp": "2024-07-24T18:08:55+08:00", "id": "afymge5k4v0euf" } ], "formsOutput": [ <some forms corresponding to run and job> ], "id": "<system generated node-id for run>", "sourceIdentifier": "default.redshift.create/2f41298b-1ee7-3302-a14b-09addffa7580", "typeName": "amazon.datazone.JobRunLineageNodeType", .... "upstreamNodes": [ { "eventTimestamp": "2024-07-24T18:08:55+08:00", "id": "6wf2z27c8hghev" }, { "eventTimestamp": "2024-07-24T18:08:55+08:00", "id": "4tjbcsnre6banb" } ] }
  3. 通过传入下游/上游节点标识符(您认为该标识符应关联到资产节点)再次调用 GetLineageNode,因为它们对应于数据集:

    使用上面的示例响应的示例命令:

    aws datazone get-lineage-node --domain-identifier <domain-id> --identifier afymge5k4v0euf

    这将返回与数据集对应的世系节点详细信息:afymge5k4v0euf

    { ..... "domainId": "dzd_cklzc5s2jcr7on", "downstreamNodes": [], "eventTimestamp": "2024-07-24T18:08:55+08:00", "formsOutput": [ ..... ], "id": "afymge5k4v0euf", "sourceIdentifier": "arn:aws:redshift:us-east-1:123456789012:table/workgroup-20240715/tpcds_data/public/dws_tpcds_7", "typeName": "amazon.datazone.DatasetLineageNodeType", "typeRevision": "1", .... "upstreamNodes": [ ... ] }
  4. 比较此数据集节点的 sourceIdentifier 和来自 GetAsset 的响应。如果它们未关联,则它们不匹配,因此在世系 UI 中将不可见。

不匹配的场景和缓解措施

以下是它们不匹配的常见场景以及可能的缓解措施:

根本原因:表存在于与 Amazon DataZone 域账户不同的账户中。

缓解措施:您可以从关联账户调用 PostLineageEvent 操作。由于将从调用方凭证中选取用于构造 ARN 的 accountId,因此在运行入门脚本或调用 PostLineageEvent 时,您可以从包含表的账户代入角色。这样做将有助于正确构造 ARN 并与资产节点关联。

根本原因:Redshift 表/视图的 ARN 包含基于 OpenLineage 运行事件中相应数据集信息的命名空间和名称属性的 Redshift/Redshift-serverless。

缓解措施:由于没有确定的方法来获知给定名称是属于集群还是工作组,因此我们将使用以下启发法:

  • 如果与数据集对应的“名称”包含“redshift-serverless.amazonaws.com”,则我们使用 redshift-serverless 作为 ARN 的一部分,否则默认为“redshift”。

  • 上述情况表示工作组名称的别名不起作用。

根本原因:自定义资产的上游数据集未正常关联。

缓解措施:请务必通过调用与数据集节点的 sourceIdentifier 匹配的 CreateAsset/CreateAssetRevision(对于自定义节点,为 <namespace>/<name>)来填充资产的 sourceIdentifier