Snowflake 中的 DevOps¶
Snowflake 提供了一系列工具和实践,支持以代码形式管理 Snowflake 环境,在变更进入生产环境前进行验证,并通过 CI/CD 管道实现自动化部署。
什么是 Snowflake DevOps?¶
Snowflake 中的 DevOps 将软件工程的最佳实践引入到了数据基础设施管理中。其核心原则包括:
定义即代码。 在版本控制文件中声明 Snowflake 对象的期望状态。Snowflake 会确定并应用必要的变更(创建、更改或删除),以达到该状态。
部署前验证。 在将计划步骤中建议的变更应用到您的账户之前,先预览这些变更。审查创建、更改和删除操作,确信变更无误后再行部署。
利用 CI/CD 实现自动化。 将 Snowflake 集成到现有的 CI/CD 管道中,通过拉取请求、合并或计划运行触发部署,无需手动步骤。
推荐方法是使用 :doc:`DCM Projects </user-guide/dcm-projects/dcm-projects-overview>`(数据库变更管理项目),该方案将声明式对象管理、先计划再部署验证、多环境定向以及 CI/CD 自动化统一集成到了单个工作流中。
将 Snowflake 对象定义为代码¶
DCM Projects(推荐)¶
:doc:`DCM Projects </user-guide/dcm-projects/dcm-projects-overview>`(数据库变更管理项目)为管理 Snowflake 环境提供了一种声明式的“基础设施即代码”方法。您无需编写指定每个步骤的命令式脚本,只需定义对象期望的目标状态即可。Snowflake 会将这些定义与当前状态进行对比,并确定所需的变更。
DCM 项目包括:
清单文件 (
manifest.yml),用于指定每个环境的部署目标、所有者角色及模板配置。**定义文件**(
sources/definitions/下的 SQL 文件)包含 Snowflake 对象的 DEFINE 语句、访问控制的 GRANT 语句以及数据质量预期的 ATTACH 语句。
以下示例展示了一个使用 Jinja2 模板为多个团队创建基础设施的定义文件:
有关 DCM Projects 的完整文档(包括如何设置项目文件、管理多环境及自动化部署),请参阅 Snowflake DCM Projects。
Snowflake 上的 dbt 项目¶
Snowflake 上的 dbt 项目 支持将 dbt Core (https://www.getdbt.com/) 项目作为原生 Snowflake 对象进行部署和运行。您可以在 dbt 模型中定义 SQL 转换,将其部署为带版本的 DBT PROJECT 对象,并使用 Snowflake SQL 或 Snowflake CLI 执行。您可以通过 Snowflake 任务安排计划运行,并将部署集成到 CI/CD 管道中。
有关更多信息,请参阅 Snowflake 上的 dbt 项目。
替代方案:使用带版本的脚本进行 CREATE OR ALTER¶
对于 DCM 项目之外的单个对象变更,可以使用 CREATE OR ALTER <对象> 命令,该命令可以创建对象或更改对象,使其与命令指定的定义相匹配。通过在远程存储库中的版本化文件中使用此命令,您可以将变更回滚到以前的版本:只需执行该文件的以前版本即可。
备注
您还可以使用 Snowflake Python APIs 和 Snowflake CLI 来管理 Snowflake 资源。如果您更喜欢在 Python 中进行数据工程工作,Snowflake 的一流 Python API 可让您使用自己最擅长的语言进行相同的资源管理。
验证并预览变更¶
在将变更部署到 Snowflake 账户之前,您可以预览建议的改动,以验证其是否符合预期。
使用 DCM Projects 进行计划¶
DCM Projects 采用先计划再部署模型。PLAN 命令会将定义文件与账户的当前状态进行对比,并生成一份建议变更列表,期间不会对环境做任何实际修改。
您可以使用 Snowflake CLI 运行计划:
或使用 SQL:
在继续部署前,请检查输出结果,确认其中的创建、修改和删除操作符合预期。
利用 CI/CD 实现自动化部署¶
您可以将 Snowflake 集成到 CI/CD 管道中,以便通过拉取请求合并、分支推送或计划运行等事件自动触发部署。
下表映射了常见的 CI/CD 管道作业及其对应的 Snowflake CLI 命令:
管道作业 |
CLI 命令 |
描述 |
|---|---|---|
拉取请求时计划 |
|
生成一份计划,预览将应用于目标环境的变更。您可以将计划输出作为 PR 注释发布,供团队审查。 |
合并时部署 |
|
将计划的变更应用于目标环境。通常在 PR 合并到主分支后运行。 |
刷新动态表 |
|
在部署后触发动态表刷新,确保下游数据是最新的。 |
测试预期 |
|
运行 DCM 项目中定义的预期检查,以验证部署是否产生了预期结果。 |
GitHub Actions¶
您可以使用 GitHub Actions (https://docs.github.com/en/actions) 来自动执行构成 CI/CD 管道的作业。
为了安全地进行身份验证,Snowflake 建议配合 OpenID Connect (OIDC) 使用工作负载身份联合 (WIF),而非密码或私钥等静态凭据。通过 WIF OIDC,GitHub Actions 会从 GitHub 的 OIDC 提供商请求一个短期令牌,由 Snowflake 直接进行验证。存储库中不会存储长期密钥。
要设置 WIF OIDC,请创建一个信任 GitHub 的 OIDC 提供商的 Snowflake 服务用户:
有关配置主体声明及 WIF 的更多信息,请参阅 Workload identity federation。
以下示例展示了一个使用 WIF OIDC 和 DCM Projects 的工作流,在向 main 分支推送代码时规划并部署变更:
有关使用 Snowflake CLI 设置 CI/CD(包括其他身份验证方法)的更多信息,请参阅 将 CI/CD 集成到 Snowflake CLI 中。
管理环境¶
通过为开发、测试和生产维护独立的环境,您的团队可以将开发活动与生产环境隔离开来,从而降低意外后果和数据损坏的几率。
用于定位环境的连接配置文件¶
借助 DCM Projects,您可以在 manifest.yml 文件中定义多个部署目标。每个目标分别映射到特定的 Snowflake 账户(或数据库)、项目对象、所有者角色以及模板配置。相同的定义文件可以通过配置文件应用特定环境的设置,从而部署到所有环境。
有关多项目设置和团队协作等企业级模式,请参阅 DCM Projects 的企业用例。
高级:用于自定义脚本的 Jinja 参数化¶
DCM Projects 在定义文件中原生支持 Jinja2 模板。您可以使用模板变量、循环、条件、宏和字典,使定义内容在不同环境下实现复用。变量值来自 manifest.yml 中的配置文件或运行时替换。
有关 DCM 模板化的详细信息,请参阅 DCM Projects 文件和模板。
您还可以通过 EXECUTE IMMEDIATE FROM 配合 Jinja2,对独立 SQL 脚本(DCM 项目之外)进行参数化。Snowflake CLI 同样允许您将环境变量传递给 Python 脚本。
例如,要更改部署目标,您可以将目标数据库的名称替换为 SQL 脚本中的 {{ environment }} 等 Jinja 变量,或 Python 脚本中的环境变量。下面的 SQL 和 Python 代码示例演示了这一技术:
开始使用¶
要开始使用 DCM Projects,请参阅 Snowflake DCM Projects 以获取该功能的完整概述,包括如何设置项目文件、配置环境及部署变更。
如需示例项目、CI/CD 模板和快速入门指南,请参阅 snowflake-labs DCM 存储库 (https://github.com/Snowflake-Labs/snowflake_dcm_projects)。
如需分步教程,请尝试 开始使用 Snowflake DCM Projects 快速入门。