跨云分析:使用IAM将BigQuery连接到Amazon S3 Tables
DataHot 速览
本文演示如何让Google BigQuery用户直接查询存储在Amazon S3 Tables上的Iceberg表,实现跨云lakehouse访问,无需复制数据。Part 1聚焦AWS IAM方式,通过单一策略同时控制表元数据和数据访问;AWS Lake Formation方式将在Part 2介绍。该方案避免跨云复制带来的成本、延迟和对账开销,支持单一受治理数据集服务多云团队。
为什么值得关注:跨云数据湖仓的免复制访问架构与IAM权限设计,是多云分析平台实践中的关键参考,值得数据平台从业者关注。
本文目录 29 节
- 跨云分析场景
- 跨云边界的模式演进
- 无需数据重复的多云分析
- 针对不频繁查询数据集的成本优化
- 跨引擎解耦计算
- 解决方案概述
- 前提条件
- 设置Amazon S3 Tables
- 创建表桶和命名空间
- 将S3 Tables与Glue Data Catalog集成
- 使用IAM模式设置S3 Tables与Glue Data Catalog的集成
- 创建表并插入数据
- 配置跨云访问
- 创建 OIDC 身份提供方
- 创建跨云 IAM 角色
- 附加权限
- 将 BigQuery 连接到 S3 Tables
- 创建联合目录
- 对于 IAM 模式:
- 检索 BigLake 服务账号 ID
- 更新 AWS 信任策略
- 设置元数据同步
- 从 BigQuery 查询
- 架构演变
- 元数据新鲜度
- OIDC 身份联合
- 网络路径
- 清理
- 结论
译文
AI 逐段翻译在多个云上运行分析工作负载的组织经常遇到同样的摩擦:数据存储在一个云上,而查询数据的引擎却位于另一个云上。跨边界复制数据会创建第二个数据集,必须保持同步,增加了成本、延迟和对账开销。在本文中,我们针对该模式的一个具体实例:您的Google BigQuery用户需要使用存储在Amazon S3 Tables(亚马逊简单存储服务(Amazon S3)的一项功能)中的数据,该数据位于AWS上。理想的结果是,一个受治理的单一数据集能同时服务于两个云中的团队,而无需在两者之间建立持续的复制管道。
通过Amazon S3 Tables,您可以获得托管式Apache Iceberg表,具备内置的压缩、快照管理以及与AWS Glue Data Catalog的集成。由于S3 Tables以开放的Iceberg格式存储数据,如果存在正确的访问路径,受支持的外部引擎可以直接读取数据。
本系列博文分为两部分,演示了如何使用AWS Glue通过跨云湖仓将Google BigQuery连接到Amazon S3 Tables。我们涵盖两种访问控制方法:
- AWS身份与访问管理(IAM):您可以定义一个使用IAM权限来设置对表元数据和数据访问权限的单一策略。
- AWS Lake Formation:您可以使用临时颁发的凭证进行数据访问,元数据访问由Lake Formation权限管理。
本文重点介绍基于IAM的方法。第2部分介绍了面向需要跨多个引擎使用凭证颁发访问权限的组织的Lake Formation方法。
最终,您将能够让BigQuery查询存储在S3 Tables上的Iceberg表,而无需复制或重复数据,从而实现对Iceberg数据的实时访问。
跨云分析场景
在多种场景下,组织可以从跨云查询能力中受益。以下是此架构解决的一些常见模式:
跨云边界的模式演进
当源模式频繁变化时,写入BigQuery托管存储的流式管道需要对BigQuery表和下游视图进行协调的DDL更改。团队通常通过将负载存储为无类型列并在稍后解析来绕过这一挑战。
借助S3 Tables上的Iceberg,模式演进在表元数据中进行跟踪。当写入引擎添加新列时,BigQuery的湖仓刷新会在下一个同步周期自动拾取更新的模式。
无需数据重复的多云分析
一家公司在AWS上拥有其生产数据环境(数据湖、数据仓库、流式处理),但收购了一个仅在BigQuery上运行分析的业务部门。从BigQuery进行就地查询可将您的数据保留在Amazon S3 Tables中,因此您只需支付一份副本的费用,使用实时数据,并避免同步第二个存储库的运营开销。
针对不频繁查询数据集的成本优化
一个组织在AWS上有数百个数据集,但只有一小部分每天从BigQuery查询。将它们全部复制到Google Cloud Storage会带来不必要的存储和传输成本。借助Lakehouse目录联合,您可以将数据保留在S3 Tables上。BigQuery仅在查询时读取数据,因此您按查询付费,而不是按副本存储付费。
跨引擎解耦计算
数据团队希望在AWS上存储数据,并允许多个引擎灵活读取相同的数据:BigQuery和Amazon Redshift用于数据仓库用例,Amazon Athena用于交互式临时查询,Amazon SageMaker AI用于机器学习(ML)。借助Apache Iceberg的开放格式,您可以使用一个存储层、多个计算引擎,无需在它们之间复制数据。
解决方案概述
您使用AWS Glue Iceberg REST目录(IRC)作为BigQuery和S3 Tables之间的桥梁。BigQuery的跨云Lakehouse创建一个联合目录,从Glue IRC同步元数据,然后使用同步的元数据直接读取Iceberg数据文件。

图1:架构图,显示BigQuery通过AWS Glue Iceberg REST目录连接到Amazon S3 Tables
此架构中的关键组件:
- Amazon S3 Tables:通过Amazon S3 Tables,您在Amazon S3中获得完全托管的Apache Iceberg表体验,针对分析工作负载进行了优化。您可以在AWS Glue Data Catalog中注册表元数据以进行发现和治理。
- AWS Glue Data Catalog:借助AWS Glue Data Catalog,您可以访问联合的
s3tablescatalog目录,该目录将S3 Tables资源(表桶、命名空间、表)映射到来自受支持分析引擎的目录层次结构中。Glue Data Catalog的标准Iceberg REST端点向外部引擎提供表元数据。BigQuery通过此端点连接。 - Google跨云Lakehouse:借助Google跨云Lakehouse,您可以将BigQuery连接到外部Iceberg目录。它使用OpenID Connect(OIDC)承担AWS IAM角色,调用Glue Iceberg REST端点,并按可配置的刷新间隔同步元数据。
前提条件
开始之前,您需要:
- 一个AWS账户,且您的AWS区域中提供Amazon S3 Tables。
- 一个启用了结算并激活了BigLake API的Google Cloud项目。
- 已安装并配置AWS命令行界面(AWS CLI)和gcloud CLI。
- 一个S3表桶,其中至少包含一个命名空间和包含数据的表。
设置Amazon S3 Tables
如果您已经拥有带数据的S3 Tables,请跳到下一部分。否则,请创建表桶、命名空间并填充表。
创建表桶和命名空间
使用AWS CLI按如下方式创建资源:
# Create a Table bucket
aws s3tables create-table-bucket \
--name <TABLE_BUCKET_NAME> \
--region <REGION>
# Create a Namespace (Database)
aws s3tables create-namespace \
--table-bucket-arn "arn:aws:s3tables:<REGION>:<AWS_ACCOUNT_ID>:bucket/<TABLE_BUCKET_NAME>" \
--namespace <NAMESPACE> \
--region <REGION>将S3 Tables与Glue Data Catalog集成
为了让BigQuery访问S3 Tables,必须通过Glue Data Catalog发现这些表。S3 Tables通过一个名为s3tablescatalog的联合目录与Glue集成。
使用IAM模式设置S3 Tables与Glue Data Catalog的集成
打开Amazon S3控制台:
- 在导航窗格中,选择Table buckets。
- 选择 启用集成,然后选择 启用集成 再次确认。
这会在 Glue 中创建 s3tablescatalog 联合目录,访问完全由调用角色的 IAM 策略控制。这是每个账户和区域的一次性设置。启用后,分析集成将应用于您账户中的所有表桶。

图 2:在 Amazon S3 控制台中启用 S3 Tables 集成
或者,使用 AWS CLI 创建目录:
aws glue create-catalog --region <REGION> --cli-input-json '{
"Name": "s3tablescatalog",
"CatalogInput": {
"FederatedCatalog": {
"Identifier": "arn:aws:s3tables:<REGION>:<AWS_ACCOUNT_ID>:bucket/*",
"ConnectionName": "aws:s3tables"
},
"CreateDatabaseDefaultPermissions": [
{ "Principal": {"DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"}, "Permissions": ["ALL"] }
],
"CreateTableDefaultPermissions": [
{ "Principal": {"DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"}, "Permissions": ["ALL"] }
]
}
}'创建表并插入数据
现在,要创建表并插入数据,请打开 Amazon Athena 控制台。在查询编辑器中,选择 s3tablescatalog/<TABLE_BUCKET_NAME> 作为数据源,并选择 <NAMESPACE> 作为数据库。然后逐一运行以下 SQL 语句:
CREATE TABLE `<NAMESPACE>`.orders (
order_id STRING,
customer_id STRING,
amount BIGINT,
order_date DATE,
region STRING
)
TBLPROPERTIES ('table_type' = 'iceberg');
INSERT INTO orders
VALUES
('ORD-001', 'C100', 4500, DATE '2024-06-01', 'EMEA'),
('ORD-002', 'C200', 8900, DATE '2024-06-01', 'EMEA'),
('ORD-003', 'C100', 3200, DATE '2024-06-02', 'NAMER'),
('ORD-004', 'C300', 12000, DATE '2024-06-02', 'NAMER'),
('ORD-005', 'C400', 6700, DATE '2024-06-03', 'APJ'),
('ORD-006', 'C200', 4100, DATE '2024-06-03', 'APJ'),
('ORD-007', 'C500', 9500, DATE '2024-06-04', 'EMEA'),
('ORD-008', 'C100', 2800, DATE '2024-06-04', 'LATAM'),
('ORD-009', 'C600', 15000, DATE '2024-06-05', 'NAMER'),
('ORD-010', 'C300', 7200, DATE '2024-06-05', 'LATAM');配置跨云访问
BigQuery 通过 OIDC 联合身份验证假定 AWS IAM 角色以访问 Glue IRC。本节介绍创建角色、OIDC 提供方和权限的步骤。
创建 OIDC 身份提供方
在您的 AWS 账户中将 Google 注册为 OIDC 身份提供方。这允许 AWS 验证 Google 身份服务颁发的令牌:
aws iam create-open-id-connect-provider \
--url https://accounts.google.com \
--client-id-list accounts.google.com \
--thumbprint-list 08745487e891c19e3078c1f2a07e452950ef36f6–thumbprint-list 参数是可选的。省略时,IAM 会自动从 OIDC 提供方的证书中检索指纹。请参阅 AWS 文档 了解详情。
创建跨云 IAM 角色
登录 AWS 控制台,并使用占位信任策略创建角色。在您在 Google Cloud 中创建联合目录后,您将使用实际的 BigLake 服务账号 ID 进行更新。
aws iam create-role \
--role-name bigquery-cross-cloud-role \
--max-session-duration 43200 \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/accounts.google.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"accounts.google.com:sub": ["PLACEHOLDER"],
"accounts.google.com:aud": ["PLACEHOLDER"]
}
}
}]
}'参数--max-session-duration 43200 允许会话最长 12 小时,这对于长时间运行的 BigQuery 查询是必需的。
附加权限
权限策略根据您的访问控制方法而有所不同。对于基于 IAM 的方法,附加以下策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GlueRead",
"Effect": "Allow",
"Action": [
"glue:GetCatalog", "glue:GetDatabase", "glue:GetDatabases",
"glue:GetTable", "glue:GetTables", "glue:GetPartition", "glue:GetPartitions"
],
"Resource": [
"arn:aws:glue:<AWS_REGION>:<AWS_ACCOUNT_ID>:catalog",
"arn:aws:glue:<AWS_REGION>:<AWS_ACCOUNT_ID>:catalog/s3tablescatalog",
"arn:aws:glue:<AWS_REGION>:<AWS_ACCOUNT_ID>:catalog/s3tablescatalog/<TABLE_BUCKET>",
"arn:aws:glue:<AWS_REGION>:<AWS_ACCOUNT_ID>:database/s3tablescatalog/<TABLE_BUCKET>/<NAMESPACE>",
"arn:aws:glue:<AWS_REGION>:<AWS_ACCOUNT_ID>:table/s3tablescatalog/<TABLE_BUCKET>/<NAMESPACE>/*"
]
},
{
"Sid": "S3TablesRead",
"Effect": "Allow",
"Action": [
"s3tables:GetTableBucket", "s3tables:ListTableBuckets",
"s3tables:ListNamespaces", "s3tables:GetNamespace",
"s3tables:ListTables", "s3tables:GetTable",
"s3tables:GetTableMetadataLocation", "s3tables:GetTableData"
],
"Resource": [
"arn:aws:s3tables:<AWS_REGION>:<AWS_ACCOUNT_ID>:bucket/<TABLE_BUCKET>",
"arn:aws:s3tables:<AWS_REGION>:<AWS_ACCOUNT_ID>:bucket/<TABLE_BUCKET>/*"
]
},
{
"Sid": "S3TablesListBuckets",
"Effect": "Allow",
"Action": ["s3tables:ListTableBuckets"],
"Resource": "*"
}
]
}将 BigQuery 连接到 S3 Tables
配置好 AWS 端后,在 Google Cloud 中创建联合目录,将 BigQuery 连接到 Glue IRC。
创建联合目录
使用 gcloud auth login 进行 Google Cloud 身份验证,或使用已预先认证的 Cloud Shell。验证 BigLake API 是否已启用:
gcloud services enable biglake.googleapis.com --project="<GCP_PROJECT_ID>"对于 IAM 模式:
gcloud alpha biglake iceberg catalogs create <FEDERATED_CATALOG_NAME> \
--project="<GCP_PROJECT_ID>" \
--catalog-type=federated \
--federated-catalog-type=glue \
--glue-aws-region=<AWS_REGION> \
--glue-aws-role-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:role/bigquery-cross-cloud-role \
--glue-warehouse=<AWS_ACCOUNT_ID>:s3tablescatalog/<TABLE_BUCKET> \
--primary-location=<GCP_REGION>参数--glue-warehouse 使用格式 <AWS_ACCOUNT_ID>:s3tablescatalog/<TABLE_BUCKET>。这告诉 Glue IRC 将请求范围限定到联合目录层次结构中您特定的 S3 Tables 桶。
参数--primary-location 指的是存储联合目录元数据的 Google Cloud 区域。使用 AWS 到 Google Cloud 区域映射 找到与您的 AWS 区域对应的 GCP 区域。例如,AWS us-east-1 映射到 GCP us-east4。
检索 BigLake 服务账号 ID
目录创建后,Google 会为您的联合目录预配置一个专用服务账号。检索其数字 ID:
BIGLAKE_SA_ID=$(gcloud alpha biglake iceberg catalogs describe <FEDERATED_CATALOG_NAME> \
--project="<GCP_PROJECT_ID>" \
--format="value(biglake-service-account-id)")
echo $BIGLAKE_SA_ID更新 AWS 信任策略
回到 AWS 上,将 IAM 角色信任策略中的占位符替换为实际服务账号 ID:
aws iam update-assume-role-policy \
--role-name bigquery-cross-cloud-role \
--policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/accounts.google.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"accounts.google.com:sub": ["<BIGLAKE_SA_ID>"],
"accounts.google.com:aud": ["<BIGLAKE_SA_ID>"]
}
}
}]
}'将服务账号 ID 注册到 OIDC 提供方的受众列表中。如果不执行此步骤,AWS 会拒绝令牌,因为 aud 声明与任何注册的客户端不匹配:
aws iam add-client-id-to-open-id-connect-provider \
--open-id-connect-provider-arn "arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/accounts.google.com" \
--client-id "<BIGLAKE_SA_ID>"设置元数据同步
等待 3–5 分钟让 IAM 更改全局生效,然后设置后台刷新:
gcloud alpha biglake iceberg catalogs update <FEDERATED_CATALOG_NAME> \
--project="<GCP_PROJECT_ID>" \
--refresh-interval=300s参数--refresh-interval(此示例中为 300 秒)决定 BigQuery 从 Glue IRC 同步元数据的频率。新表和架构更改会在此间隔内出现在 BigQuery 中。
从 BigQuery 查询
目录刷新完成后,BigQuery 自动创建与同步命名空间对应的外部数据集。无需手动 CREATE SCHEMA。
验证同步:
gcloud alpha biglake iceberg namespaces list \
--catalog="<FEDERATED_CATALOG_NAME>" \
--project="<GCP_PROJECT_ID>"在 BigQuery 中运行查询:
SELECT * FROM `<GCP_PROJECT_ID>.<FEDERATED_CATALOG_NAME>.<NAMESPACE>.orders` LIMIT 1000示例查询输出:
SELECT
customer_id,
COUNT(*) as order_count,
SUM(amount) as total_spend
FROM `<PROJECT_ID>.<FEDERATED_CATALOG_NAME>.<NAMESPACE>.orders`
GROUP BY customer_id
ORDER BY total_spend DESC
图 3:直接从 Amazon S3 Tables 数据返回的 BigQuery 查询结果
BigQuery 读取 Iceberg 元数据以识别哪些 Parquet 数据文件包含相关数据。它还在适用时应用分区修剪,并仅从 S3 Tables 托管存储中获取必要的文件。
架构演变
当在 AWS 端(通过 Spark、Athena 或 Glue IRC)向 Iceberg 表添加新列时,架构更改会捕获在 Iceberg 的元数据中。在下一个 Lakehouse 刷新周期,BigQuery 会自动获取新列。无需在 BigQuery 中进行 DDL 更改。
元数据新鲜度
Glue 中的 s3tablescatalog 是一个联合目录,每次请求时都会实时解析 S3 Tables 服务中的表元数据。当流式作业向 S3 Table 提交新数据时,最新元数据可立即通过 AWS Glue IRC 获得。BigQuery 会在其下一个刷新周期(由 --refresh-interval 配置)看到更新。
OIDC 身份联合
Google Cloud 和 AWS 之间的信任关系使用 OpenID Connect。当 BigQuery Lakehouse 需要访问您的数据时,它会呈现一个包含以下内容的签名 JWT 令牌:
iss:accounts.google.com(签发者)sub:BigLake 服务账号 ID(标识哪个目录正在发出请求)aud:相同的服务账号 ID(预期受众)
AWS 在颁发临时凭证之前,会根据已注册的 OIDC 提供方和信任策略条件验证此令牌。每个联合目录都会收到一个唯一的服务账号 ID,提供每目录隔离和通过 AWS CloudTrail 进行审计的能力。
网络路径
默认情况下,BigQuery 和 AWS 之间的流量通过公共互联网传输。对于需要私有连接的工作负载,Google Cloud 支持 Cross-Cloud Interconnect 或 Partner Interconnect。这有助于通过专用网络路径路由查询。请参阅 Google Cloud 文档 以了解私有互联配置。
清理
为避免持续费用,请删除本演练中创建的资源。
在 AWS 上:
# Delete the table (if created for this walkthrough)
aws s3tables delete-table \
--table-bucket-arn "arn:aws:s3tables:<AWS_REGION>:<AWS_ACCOUNT_ID>:bucket/<TABLE_BUCKET>" \
--namespace analytics --name orders --region <AWS_REGION>
# Delete namespace and table bucket
aws s3tables delete-namespace \
--table-bucket-arn "arn:aws:s3tables:<AWS_REGION>:<AWS_ACCOUNT_ID>:bucket/<TABLE_BUCKET>" \
--namespace <NAMESPACE> --region <AWS_REGION>
aws s3tables delete-table-bucket --name <TABLE_BUCKET> --region <AWS_REGION>
# Delete IAM role and OIDC provider (if no longer needed)
aws iam delete-role --role-name bigquery-cross-cloud-role在 Google Cloud 上:
gcloud alpha biglake iceberg catalogs delete <FEDERATED_CATALOG_NAME> \
--project="<GCP_PROJECT_ID>" --location=<GCP_REGION>结论
本文演示了如何使用开放的 Apache Iceberg 格式和作为元数据桥的 AWS Glue Iceberg REST Catalog,从 Google BigQuery 查询 Amazon S3 Tables。利用 Apache Iceberg 的开放格式,您可以在 AWS 上一次写入数据,并从支持 Iceberg 的引擎(包括 BigQuery)读取数据。我们使用基于 IAM 的访问控制来管理对 Glue Data Catalog 元数据和底层 Amazon S3 Tables 数据的访问。这是配置更简单的路径,组件更少。第2部分中,我们介绍了如何配置 AWS Lake Formation 向 BigQuery 提供临时的、作用域受限的凭证以进行数据访问。
要在您自己的环境中开始使用此模式:
- 查阅Amazon S3 Tables 文档以了解表桶的设置。
- 按照Google Cloud 跨云 Lakehouse 设置指南进行 BigQuery 联合配置。
- 探索AWS Glue Iceberg REST Catalog API以了解编程访问模式。
补充来源
1 个信源 · 1 篇报道这篇内容对你有用吗?
反馈只用于改善内容筛选,不等同于收藏