Snowflake China 与国内云对象存储的多云集成实战指南:一套架构打通多云对象存储

点击查看原文>

2026 年,智能体将在企业级应用中取得哪些实质性突破?点击下载《2026 年 AI 与数据发展预测》白皮书,获悉专家一手前瞻,抢先拥抱新的工作方式!

背景:Snowflake 与多云环境

数据在阿里云,日志在腾讯云,而你却想用 Snowflake 做全局建模?这不再是“既要又要”的幻想。随着企业数据上云的持续深入,不少使用云服务的企业,会把数仓原始数据、日志、媒体文件集中存放在对象存储中,同时希望利用 Snowflake 的能力做统一建模与分析。

在全球范围内,Snowflake 诞生之初便构建在多云架构(Multi-cloud)之上。目前 Snowflake 全球服务已广泛部署于 AWS、Google Cloud 和 Azure,实现了跨云、跨区域的无缝数据流动与统一治理 。在国内市场,Snowflake China 自 2024 年正式落地 AWS 宁夏区域以来,其与国际版一致的架构能力已在本土环境中得到深度验证 。Snowflake 与 21 世纪互联运营的 Azure 及 AWS 中国区域的底层互通与稳定性早已是业界公认的成熟方案。

随着企业数字化转型的深入,新的挑战随之而来:数据资产往往散落在阿里云、华为云、腾讯云及火山引擎等多个国产云平台上。如何打通 Snowflake 与国产云厂商之间的“最后一公里”,实现真正的全云架构?

我们基于近期多个跨云实战项目,打磨出一套基于 S3 兼容协议的通用模式。无需大规模搬运数据,通过 External Volume + Apache Iceberg 的强强联手,你就能在保留原位存储的同时,享受 Snowflake 极速的分析体验。Snowflake China 不仅实现了与海外版一致的 AWS、Azure 连接能力,更深入本土生态,通过 S3 兼容协议完成了与阿里云 OSS、华为云 OBS、腾讯云 COS、以及火山引擎 TOS 的全量验证。本文将分享我们如何在异构 Bucket 之上,利用 Apache Iceberg 搭建起高性能、统一治理的数据高速公路。告别数据孤岛,从这一篇开始。

总体架构:基于 S3 兼容协议的“桥接模式”

从架构视角看,无论底层是 OSS、OBS、COS 还是 TOS,Snowflake China 与国内云对象存储的集成逻辑高度一致:统一通过各云厂商提供的 S3 兼容 Endpoint 建立连接,让外部 Bucket 在 Snowflake 中以 External Stage 或 External Volume 的方式呈现。

在该模式下,典型数据流包括:

  • 入站流(对象存储→ Snowflake):通过 COPY INTO  命令,从 External Stage 读取 OSS/OBS/COS/TOS 中的文件,加载到 Snowflake 表中;

  • 出站流(Snowflake → 对象存储):通过 COPY INTO  命令,将 Snowflake 表数据导出为文件写回对象存储,用于归档、共享或下游消费。

实施流程

无论是接入阿里云、华为云、腾讯云还是火山引擎,整体实施可以抽象为以下三个步骤:

步骤 1:准备对象存储环境

在对应云厂商控制台中完成:

创建 Bucket

  • 选择合适的 Region(如杭州、北京等);

  • 根据业务场景选择存储类型(标准存储、低频存储等);

  • 建议权限设置为私有,后续通过访问控制体系授权 Snowflake 使用。

创建访问凭证

生产环境中,建议为 Snowflake 集成单独创建专用用户,并基于 Bucket / 前缀粒度配置最小权限策略

步骤 2:在 Snowflake China 侧完成 Endpoint 白名单

由于 Snowflake China 运行在隔离网络中,任何访问外部对象存储的 Endpoint 都需要先由 Snowflake Support 加入白名单。

通用流程为:

1. 登录 Snowflake China 的 Jira Support Portal(中国区支持门户)。

2. 创建 Support Case,说明希望将指定 S3 兼容 Endpoint 加入白名单。

3. 在 Case 中建议包含:

○ Snowflake 账号信息(Account Locator)。

○ 对应云厂商的 Endpoint(例如 oss-cn-hangzhou.aliyuncs.com、obs.cn-north-4.myhuaweicloud.com 等)。

○ 使用场景说明(数据湖接入、离线导入/导出等)。

○ 预计访问的 Bucket 名称与数据规模。

步骤 3:在 Snowflake 中创建 External Stage / External Volume + Iceberg

白名单生效后,即可在 Snowflake 中创建:

  • External Stage:用于文件级别的 COPY INTO 导入 / 导出;

  • External Volume + Iceberg Table:用于在对象存储上构建 Lakehouse 架构,由 Snowflake 负责 Iceberg 元数据与查询引擎,对象存储负责数据文件与元数据文件的持久化。

接下来进入四大云厂商的统一集成实战。

集成实战

配置总览

各厂商常用 Region Endpoint 速查

阿里云 OSS

华为云 OBS
腾讯云 COS
火山引擎 TOS(必须使用 S3 兼容端点)

注意:火山引擎 TOS 有两种端点——普通端点 tos-cn-{region}.volces.com 和 S3 兼容端点 tos-s3-cn-{region}.volces.com。与 Snowflake 集成必须使用 S3 兼容端点

External Stage 创建

四家云厂商的 External Stage 创建 SQL 遵循完全相同的模板,仅 URL、Endpoint 和凭证不同:

-- 通用模板CREATE OR REPLACE STAGE {STAGE_NAME}  URL = 's3compat://{bucket-name}[/{path}/]'  ENDPOINT = '{s3_compatible_endpoint}'  CREDENTIALS = (    AWS_KEY_ID = '{your_access_key}'    AWS_SECRET_KEY = '{your_secret_key}'  );
复制代码

四家实际示例

USE DATABASE YOUR_DATABASE;USE SCHEMA YOUR_SCHEMA;-- 阿里云 OSS(杭州)CREATE OR REPLACE STAGE ALIYUN_OSS_STAGE  URL = 's3compat://snowflake-oss-test/data/'  ENDPOINT = 'oss-cn-hangzhou.aliyuncs.com'  CREDENTIALS = (    AWS_KEY_ID = 'YOUR_ACCESS_KEY_ID'    AWS_SECRET_KEY = 'YOUR_ACCESS_KEY_SECRET'  );-- 华为云 OBS(北京四)CREATE OR REPLACE STAGE HUAWEI_OBS_STAGE  URL = 's3compat://snowflake-test-obs/'  ENDPOINT = 'obs.cn-north-4.myhuaweicloud.com'  CREDENTIALS = (    AWS_KEY_ID = 'YOUR_ACCESS_KEY_ID'    AWS_SECRET_KEY = 'YOUR_SECRET_ACCESS_KEY'  );-- 腾讯云 COS(北京)-- 注意:Bucket 名称必须包含 APPID 后缀CREATE OR REPLACE STAGE TENCENT_COS_STAGE  URL = 's3compat://snowflake-test-cos-{APPID}/'  ENDPOINT = 'cos.ap-beijing.myqcloud.com'  CREDENTIALS = (    AWS_KEY_ID = 'YOUR_SECRET_ID'    AWS_SECRET_KEY = 'YOUR_SECRET_KEY'  );-- 火山引擎 TOS(北京)-- 注意:必须使用 S3 兼容端点 tos-s3-{region}.volces.comCREATE OR REPLACE STAGE VOLCENGINE_TOS_STAGE  URL = 's3compat://snowflake-test-tos/'  ENDPOINT = 'tos-s3-cn-beijing.volces.com'  CREDENTIALS = (    AWS_KEY_ID = 'YOUR_ACCESS_KEY_ID'    AWS_SECRET_KEY = 'YOUR_SECRET_ACCESS_KEY'  );
复制代码

通过 LIST 命令验证每个 Stage 的连通性:

LIST @ALIYUN_OSS_STAGE;LIST @HUAWEI_OBS_STAGE;LIST @TENCENT_COS_STAGE;LIST @VOLCENGINE_TOS_STAGE;
复制代码

双向 COPY 示例

以下 COPY INTO 语法对四家云完全通用,仅需替换 Stage 名称。

导出:Snowflake → 对象存储

-- 创建测试表CREATE OR REPLACE TABLE INTEGRATION_TEST (  id INT,  name STRING,  region STRING,  cloud_provider STRING,  created_at TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP());-- 插入测试数据INSERT INTO INTEGRATION_TEST (id, name, region, cloud_provider) VALUES  (1, 'Snowflake China', 'AWS Ningxia', 'Snowflake'),  (2, 'Aliyun OSS', 'Hangzhou', 'Alibaba Cloud'),  (3, 'Huawei OBS', 'Beijing', 'Huawei Cloud'),  (4, 'Tencent COS', 'Beijing', 'Tencent Cloud'),  (5, 'Volcengine TOS', 'Beijing', 'ByteDance');-- 导出到各家云存储(以阿里云 OSS 为例,替换 Stage 名即可)COPY INTO @ALIYUN_OSS_STAGE/export/FROM INTEGRATION_TESTFILE_FORMAT = (  TYPE = CSV  COMPRESSION = NONE  FIELD_OPTIONALLY_ENCLOSED_BY = '"')OVERWRITE = TRUEHEADER = TRUE;
复制代码

导入:对象存储→ Snowflake

-- 创建目标表CREATE OR REPLACE TABLE INTEGRATION_TEST_IMPORT (  id INT,  name STRING,  region STRING,  cloud_provider STRING,  created_at STRING);-- 从各家云存储导入(以阿里云 OSS 为例,替换 Stage 名即可)COPY INTO INTEGRATION_TEST_IMPORTFROM @ALIYUN_OSS_STAGE/export/FILE_FORMAT = (  TYPE = CSV  SKIP_HEADER = 1  FIELD_OPTIONALLY_ENCLOSED_BY = '"');-- 验证导入结果SELECT * FROM INTEGRATION_TEST_IMPORT;
复制代码

External Volume + Iceberg Lakehouse

在很多生产场景下,你可能希望数据长期保留在对象存储上,同时由 Snowflake 提供 Iceberg Catalog 与查询能力,实现开放格式与统一治理兼得。这时可以采用 External Volume + Iceberg Table 的 Lakehouse 模式。

在该模式下:

  • Catalog:由 Snowflake 托管 Iceberg 表的状态与元数据指针;

  • Metadata 文件:Iceberg 的 JSON / Avro 等元数据文件写入你自己的 Bucket;

  • Data 文件:Parquet 等数据文件同样写在 Bucket 中,可被 Spark / Flink 等引擎直接访问。

(1)创建 External Volume(通用模板)

CREATE OR REPLACE EXTERNAL VOLUME {VOLUME_NAME}  STORAGE_LOCATIONS = (    (      NAME = '{location_name}'      STORAGE_PROVIDER = 'S3COMPAT'      STORAGE_BASE_URL = 's3compat://{bucket-name}/{path}/'      STORAGE_ENDPOINT = '{s3_compatible_endpoint}'      CREDENTIALS = (        AWS_KEY_ID = '{your_access_key}'        AWS_SECRET_KEY = '{your_secret_key}'      )      ENCRYPTION = (TYPE = 'NONE')    )  );
复制代码

(2) External Volume 示例

-- 阿里云 OSS External VolumeCREATE OR REPLACE EXTERNAL VOLUME ALIYUN_OSS_ICEBERG_VOLUME  STORAGE_LOCATIONS = (    (      NAME = 'aliyun_oss_hangzhou'      STORAGE_PROVIDER = 'S3COMPAT'      STORAGE_BASE_URL = 's3compat://my-iceberg-bucket/iceberg/'      STORAGE_ENDPOINT = 'oss-cn-hangzhou.aliyuncs.com'      CREDENTIALS = (        AWS_KEY_ID = 'YOUR_ACCESS_KEY_ID'        AWS_SECRET_KEY = 'YOUR_ACCESS_KEY_SECRET'      )      ENCRYPTION = (TYPE = 'NONE')    )  );-- 华为云 OBS External VolumeCREATE OR REPLACE EXTERNAL VOLUME HUAWEI_OBS_ICEBERG_VOLUME  STORAGE_LOCATIONS = (    (      NAME = 'huawei_obs_beijing'      STORAGE_PROVIDER = 'S3COMPAT'      STORAGE_BASE_URL = 's3compat://my-iceberg-bucket/iceberg/'      STORAGE_ENDPOINT = 'obs.cn-north-4.myhuaweicloud.com'      CREDENTIALS = (        AWS_KEY_ID = 'YOUR_ACCESS_KEY_ID'        AWS_SECRET_KEY = 'YOUR_SECRET_ACCESS_KEY'      )      ENCRYPTION = (TYPE = 'NONE')    )  );-- 腾讯云 COS External Volume-- 注意:Bucket 名称必须包含 APPID 后缀CREATE OR REPLACE EXTERNAL VOLUME TENCENT_COS_ICEBERG_VOLUME  STORAGE_LOCATIONS = (    (      NAME = 'tencent_cos_beijing'      STORAGE_PROVIDER = 'S3COMPAT'      STORAGE_BASE_URL = 's3compat://my-iceberg-bucket-{APPID}/iceberg/'      STORAGE_ENDPOINT = 'cos.ap-beijing.myqcloud.com'      CREDENTIALS = (        AWS_KEY_ID = 'YOUR_SECRET_ID'        AWS_SECRET_KEY = 'YOUR_SECRET_KEY'      )      ENCRYPTION = (TYPE = 'NONE')    )  );-- 火山引擎 TOS External Volume-- 注意:必须使用 S3 兼容端点CREATE OR REPLACE EXTERNAL VOLUME VOLCENGINE_TOS_ICEBERG_VOLUME  STORAGE_LOCATIONS = (    (      NAME = 'volcengine_tos_beijing'      STORAGE_PROVIDER = 'S3COMPAT'      STORAGE_BASE_URL = 's3compat://my-iceberg-bucket/iceberg/'      STORAGE_ENDPOINT = 'tos-s3-cn-beijing.volces.com'      CREDENTIALS = (        AWS_KEY_ID = 'YOUR_ACCESS_KEY_ID'        AWS_SECRET_KEY = 'YOUR_SECRET_ACCESS_KEY'      )      ENCRYPTION = (TYPE = 'NONE')    )  );
复制代码

(3)在 External Volume 上创建 Iceberg 表(通用语法)

-- 以阿里云 OSS 为例(替换 EXTERNAL_VOLUME 名即可适用其他云)CREATE OR REPLACE ICEBERG TABLE ORDERS_ICEBERG (  order_id    INT,  customer_id INT,  order_ts    TIMESTAMP_NTZ,  amount      NUMBER)  CATALOG         = 'SNOWFLAKE'  EXTERNAL_VOLUME = 'ALIYUN_OSS_ICEBERG_VOLUME'  BASE_LOCATION   = 'orders/';
复制代码

其中:

  • CATALOG = 'SNOWFLAKE':由 Snowflake 管理 Iceberg Catalog 与表状态;

  • EXTERNAL_VOLUME:绑定到上一步创建的 Volume(替换为对应云厂商即可);

  • BASE_LOCATION:指定这张表在 Bucket 内的逻辑子路径。

(4)Iceberg 表数据完整 CRUD 操作

-- INSERT

INSERT INTO ORDERS_ICEBERG VALUES

  (1001, 101, '2026-02-01 10:00:00', 14999.00),

  (1002, 102, '2026-02-01 11:30:00', 7999.00),

  (1003, 103, '2026-02-02 09:15:00', 1999.00);

-- UPDATE

UPDATE ORDERS_ICEBERG

SET amount = 6999.00

WHERE order_id = 1002;

-- DELETE

DELETE FROM ORDERS_ICEBERG

WHERE order_id = 1003;

-- SELECT

SELECT * FROM ORDERS_ICEBERG;

各厂商特殊注意事项

实测验证汇总

以下结果基于 Snowflake China(AWS 宁夏)的实际测试:

External Stage 双向 COPY INTO 验证

Iceberg Table 全量 CRUD 验证

综合来看,无论选择哪家国内云存储,都可以同时通过 External Stage 支持批量文件导入/导出,以及通过 External Volume + Iceberg 构建开放 Lakehouse,将数据长期保留在对象存储中,同时由 Snowflake 提供统一的 SQL 分析与治理能力。

典型工作负载模式与架构选择

在多云环境下,选择何种数据组织方式更多取决于工作负载特征和数据治理需求。下面给出三类常见模式,供设计架构时参考:

模式 A:以 Snowflake 原生表为中心

  • 典型场景:高并发面向业务的报表、大量维度建模与复杂关联分析;

  • 建议:将云对象存储视为“数据来源”或“结果落地端”,通过 External Stage 将数据加载到 Snowflake 原生表中进行建模与计算。

模式 B:开放 Lakehouse(Iceberg on External Volume)

  • 典型场景:需要被 Spark、Flink 等多种引擎共同访问的数据湖;或倾向于统一使用开放格式(Parquet + Iceberg 元数据)的企业;

  • 建议:在对象存储上创建 External Volume + Iceberg 表,由 Snowflake 管理 Catalog 与查询,同时保留文件级开放性。

模式 C:简单数据交换(External Stage Only)

  • 典型场景:批量文件归档、一次性数据导入、审计报表导出等;

  • 建议:仅创建 External Stage,通过 COPY INTO 完成文件级读写,不必额外维护表结构与元数据。

以上三种模式可以在同一账号内灵活组合:同一云厂商下可以同时存在多种模式,不同云厂商之间也可以采用相同的模式,实现统一的数据架构与治理能力。

最佳实践总结:为什么选择以 Snowflake 为中心?

基于综合实测,Snowflake China 与国内云存储的集成表现稳健 。在构建架构时,我们推荐以 Snowflake 为“发散式中心”连接多云,主要基于以下优势:

● 极简的运维体验:无需管理复杂的 Hadoop 堆栈或 Spark 集群。通过 Snowflake,你只需编写标准 SQL 即可横跨多个国产云 Bucket 进行联邦查询或数据加载;

● 统一的治理标准:无论数据物理上位于阿里云还是腾讯云,在 Snowflake 这一层都可以应用统一的角色权限管理(RBAC)、数据脱敏和审计策略,避免了在多个云厂商控制台中重复配置安全策略的混乱;

● 架构的灵活性与前瞻性:支持 Apache Iceberg 开放格式。这意味着企业在享受 Snowflake 极速引擎的同时,数据依然以开放格式保留在自己的国产云 Bucket 中,确保了不被单一供应商锁定的战略灵活性;

● 多云环境下的“数据中枢”:Snowflake 充当了异构云环境之间的桥梁,通过统一的 S3 兼容集成模式,让企业能更专注于业务洞察,而非被底层云基础设施的差异性所困扰。

相关资源与参考文档

为方便实施,建议参考 Snowflake 线上文档及各国产云厂商的 S3 兼容性说明:

● Snowflake 官方文档:

○ Configuring an S3-Compatible Storage Service

○ Working with Iceberg Tables

● 国产云 S3 兼容性参考:

○ 阿里云 OSS: 使用S3 协议访问 OSS

○ 华为云 OBS: OBS S3 协议 API 参考

○ 腾讯云 COS: COS 兼容 S3 协议说明

○ 火山引擎 TOS: TOS S3 兼容端点说明

关于作者

丁煜恒,Snowflake 资深解决方案工程师。前 AWS 解决方案架构师及 Microsoft 软件工程师。拥有逾十年在全球顶级科技公司的一线技术专家经验 。深耕于云计算、大数据架构及人工智能领域,曾主导并实现了包括 Snowflake、Azure、AWS 全球客户入华架构在内的多项核心技术方案落地。凭借对多元技术生态的深刻理解,他持续助力全球 500 强企业构建高效、可扩展的数据智能体系 。他同时持有多项主流云以及数据平台的高级专业认证,致力于将前沿的云原生技术转化为企业的核心生产力。

点击链接立即报名注册:Ascent - Snowflake Platform Training - China更多 Snowflake 精彩活动请关注专区


本文来源:InfoQ