借助 Lakehouse 运行时目录中的凭证发放模式,您可以将 Cloud Storage 访问权限委托给查询引擎,并在目录、命名空间和表级别为 Apache Iceberg 表强制执行精细的 Identity and Access Management (IAM) 政策。您无需授予直接存储桶权限,而是将 Apache Iceberg REST Catalog 端点配置为针对授权表路径提供短期、范围缩小的存储令牌。自动表管理也需要此模式。
何时使用凭据发放
以下是一些常见使用场景:
- 强制执行表级访问权限,无需存储桶级角色:向分析师和工作负载授予对特定 Apache Iceberg 表的访问权限,同时防止直接访问底层 Cloud Storage 存储桶或同级表目录。
- 集中管理多个查询引擎的访问权限治理:使用短期、路径范围的令牌,在 BigQuery、Managed Service for Apache Spark、开源 Apache Spark 和 Trino 中应用一致的 IAM 政策。
- 在服务边界内隔离仓库存储桶:将表数据存储在受 VPC Service Controls 保护的 Cloud Storage 存储桶中,同时通过单个目录端点服务账号授权存储读取和写入。
凭证分发的工作原理
使用凭据分发模式时,操作序列会在访问存储空间之前强制执行 IAM 政策。下图展示了查询引擎如何从湖仓一体运行时目录获取降级存储令牌,以便直接在 Cloud Storage 中安全地读取和写入数据:
上图中显示的操作顺序如下:
- 请求:用户向支持的引擎(例如 Spark 或 BigQuery)提交 SQL 语句,例如查询、DML 或 DDL 操作。
- 元数据查找:引擎向 Lakehouse 运行时目录发送请求以解析表。
- 身份验证和政策:Lakehouse 运行时目录会对用户进行身份验证,并检查其对 Lakehouse 资源的 IAM 权限。
- 响应:由于启用了凭证分发模式,Lakehouse 运行时目录会将元数据和短期存储令牌(范围缩小的存储凭证)返回给引擎。令牌的作用域限定为与表关联的路径,并缩小到所需的最低权限(例如,对不需要写入文件的查询的只读访问权限)。
- 访问:引擎使用此令牌直接从 Cloud Storage 读取或写入特定授权文件。
- 计算:引擎处理数据或执行操作,并返回结果。
启用自动表管理 (gcp.biglake.table-management.enabled) 后,压缩、快照过期和垃圾回收等后台维护任务会使用目录的自动预配服务账号直接向 Cloud Storage 进行身份验证并更新底层数据文件。
支持的引擎
如需将凭据分发与查询引擎搭配使用,您必须在 Lakehouse 运行时目录中以凭据分发模式配置 Apache Iceberg REST 目录端点。Apache Hive 目录端点不支持凭证发放。
- 开源引擎:Spark 和 Trino 等受支持的引擎使用 Lakehouse 运行时目录提供的短期存储令牌。您的客户端应用必须在
X-Iceberg-Access-Delegation标头中指定对凭据发放的支持。 - BigQuery:BigQuery 使用 Cloud Storage 访问权限的供应商凭据,而不是最终用户凭据。
所需的服务账号权限
启用凭据分发模式后,请确保以下服务账号具有必要的角色:
- 自动预配的目录端点服务账号:您必须在所有关联的 Cloud Storage 存储桶上向此账号授予 Storage Object User 角色 (
roles/storage.objectUser)。如果没有此访问权限,则出售的凭据无法读取或写入存储空间。如果您使用Google Cloud 控制台,点击设置存储桶权限会验证此角色。对于 Google Cloud CLI、Terraform 或 REST API,您必须手动授予此角色。 - 查询引擎服务账号:运行查询引擎作业(例如 Managed Service for Apache Spark 或 Dataflow)的服务账号需要 BigLake Editor 角色 (
roles/biglake.editor) 才能获取具有写入范围的已售凭证。
将 VPC Service Controls 与凭证发放搭配使用
在 VPC Service Controls 服务边界内,将 Apache Iceberg REST Catalog 端点与 Cloud Storage 存储桶搭配使用时,您可以支持以下用例:
- 在受保护的存储桶中创建和修改 Apache Iceberg 表:当仓库存储桶位于服务边界内时,从 BigQuery、Managed Service for Apache Spark、Spark 或 Trino 运行
CREATE TABLE或 DML 语句。 - 在存储边界内委托精细的表读取:使用短期、范围缩小的存储令牌强制执行表级 IAM 政策,而无需向最终用户或查询运行时授予对边界保护的存储桶的直接 IAM 角色。
在凭证分发模式下,查询引擎和 Lakehouse 会使用为目录端点的自动预配服务账号 (blirc-PROJECT_NUMBER-ID@gcp-sa-biglakerestcatalog.) 颁发的凭证向 Cloud Storage 进行身份验证。由于此服务代理属于服务边界之外的 Google 管理的项目,因此每当存储桶项目的边界限制 storage.googleapis.com 时,Cloud Storage 都会将使用其凭证进行身份验证的请求评估为边界入站流量。即使目录端点、查询作业和存储桶位于同一项目和服务边界内,此评估也适用。
如需允许访问,请在 Access Context Manager 中,在保护存储桶项目的边界上配置入站流量规则,并进行以下设置:
- 来源身份:
serviceAccount:blirc-PROJECT_NUMBER-ID@gcp-sa-biglakerestcatalog. - 目标项目:存储桶项目 (
projects/BUCKET_PROJECT_NUMBER) - 服务:
storage.googleapis.com及其所有方法 ('*'),或特定的受支持服务方法
以下 ingress.yaml 示例允许目录端点的服务账号访问存储桶项目中的 storage.googleapis.com:
- ingressFrom:
identities:
- serviceAccount:CATALOG_ENDPOINT_SERVICE_ACCOUNT
sources:
- accessLevel: '*'
ingressTo:
operations:
- serviceName: storage.googleapis.com
methodSelectors:
- method: '*'
resources:
- projects/BUCKET_PROJECT_NUMBER
替换以下内容:
CATALOG_ENDPOINT_SERVICE_ACCOUNT:目录端点的自动预配服务账号邮箱 (blirc-PROJECT_NUMBER-ID@gcp-sa-biglakerestcatalog.)。如需检索此邮箱,请描述目录端点:gcloud biglake iceberg catalogs describe CATALOG_ID \ --project=PROJECT_ID \ --format='value(biglake-service-account)'在此命令中,
CATALOG_ID是目录端点的 ID,PROJECT_ID是包含目录端点的项目的 ID。BUCKET_PROJECT_NUMBER:包含 Cloud Storage 存储桶的项目编号。
如果表创建或查询请求被 VPC Service Controls 屏蔽,则出错提示会包含 vpcServiceControlsUniqueIdentifier 值。通过将 protoPayload.metadata.vpcServiceControlsUniqueId 与该标识符进行匹配,在 Cloud Audit Logs 中搜索政策拒绝审核日志,并检查 ingressViolations 是否存在 blirc-... 主账号。如需了解详情,请参阅从审核日志中检索 VPC Service Controls 错误。