教程 2:创建带容器的应用程序¶
简介¶
Snowflake Native App Framework 允许提供商在 Snowflake Data Cloud 内构建、销售和分发应用程序。提供商可以创建利用 Snowflake 核心功能的应用程序,与使用者共享数据和应用程序逻辑。Snowflake Native App 的逻辑可包括存储过程和用户定义的函数 (UDFs) 等功能。提供商可以通过在 Snowflake Marketplace 上的列表或专用列表与使用者共享其应用程序。
Snowflake Native App 可以实施 Snowpark Container Services,以促进 Snowflake 生态系统内容器化应用程序的部署、管理和扩展。本教程介绍如何创建 Snowflake Native App with Snowpark Container Services,即在 Snowflake 中运行容器工作负载的 Snowflake Native App。Snowflake Native Apps with Snowpark Container Services 可以运行任何容器化服务,同时利用 Snowflake Native App Framework 的所有功能,包括安全、日志记录、共享数据内容和应用程序逻辑。
备注
本教程同时使用 Snowflake CLI 和 Snowsight 来执行所需的任务。
在本教程中学习的内容¶
在本教程中,您将学习如何执行以下操作:
使用 Snowflake CLI 初始化 Snowflake Native App with Snowpark Container Services 项目。
为应用程序构建 Docker 镜像。
为 Snowflake Native App with Snowpark Container Services 创建应用程序包和所需的应用程序文件。
通过调用容器内的服务函数来测试 Snowflake Native App with Snowpark Container Services。
设置您的 Snowflake 环境¶
要执行本教程,您必须满足以下前提条件:
访问支持 Snowpark Container Services 的 Snowflake 账户。
您必须能够使用 ACCOUNTADMIN 角色来创建本教程中使用的角色,并为该角色授予所需的权限。
您必须在本地计算机上安装 Snowflake CLI 版本
3.0.0
或更高版本。您必须在本地计算机上安装 Docker Desktop。
为本教程设置角色¶
本教程将指导您使用 tutorial_role
角色创建 Snowflake Native App with Snowpark Container Services。在学习本教程之前,具有 ACCOUNTADMIN 角色的 Snowflake 用户必须执行以下步骤来配置该角色。
要创建和设置 tutorial_role
角色,请执行以下步骤:
要创建
tutorial_role
角色,请运行以下命令:CREATE ROLE tutorial_role;
要将
tutorial_role
授予执行教程的 Snowflake 用户,请运行以下命令:GRANT ROLE tutorial_role TO USER <user_name>;
其中:
user_name
指定执行教程的用户的名称。
要授予必要的权限以创建和使用容器应用程序所需的 Snowflake 对象,请运行以下命令:
GRANT CREATE INTEGRATION ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE WAREHOUSE ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE DATABASE ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE APPLICATION PACKAGE ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE APPLICATION ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE COMPUTE POOL ON ACCOUNT TO ROLE tutorial_role WITH GRANT OPTION; GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE tutorial_role WITH GRANT OPTION;
执行本部分中的任务后,只要用户为其账户授予 tutorial_role
角色,就有权创建在创建 Snowflake Native App with Snowpark Container Services 时所需的所有 Snowflake 对象。
在本教程的其余部分,您将一直使用这一角色。
在实际情况中,提供商可能需要类似权限或对现有对象的访问权限,才能开发带容器的应用程序,包括计算池、仓库和数据库。
在账户中创建所需的对象¶
在本部分中,您将创建带容器的应用程序所需的 Snowflake 对象。
创建仓库和镜像仓库¶
要创建所需的对象,请通过 Snowsight 或 Snowflake CLI 执行以下操作。
要在 Snowsight 中设置当前上下文以使用
tutorial_role
角色,请运行以下命令:USE ROLE tutorial_role;
如果使用 Snowflake CLI,您可以改用
--role tutorial_role
。要为 Snowflake Native App with Snowpark Container Services 创建仓库,请运行以下命令:
CREATE OR REPLACE WAREHOUSE tutorial_warehouse WITH WAREHOUSE_SIZE = 'X-SMALL' AUTO_SUSPEND = 180 AUTO_RESUME = true INITIALLY_SUSPENDED = false;
Snowflake Native App 需要仓库来运行 SQL 命令和存储过程。
要创建用于存储容器的镜像仓库,请运行以下命令:
CREATE DATABASE tutorial_image_database; CREATE SCHEMA tutorial_image_schema; CREATE IMAGE REPOSITORY tutorial_image_repo;
在本部分中,您创建了一个仓库,用于为您创建的应用程序执行查询,还创建了一个镜像仓库,用于托管容器镜像。
在下一部分中,您要为容器创建镜像,并将其上传到上面创建的镜像仓库。
为教程创建 Snowflake CLI 连接¶
要运行本教程中的 Snowflake CLI 命令,您必须为本教程设置 Snowflake CLI 连接。
要创建连接,请执行以下任务:
在终端运行以下命令:
snow connection add
输入
tut-connection
作为连接名称。输入 Snowflake CLI 连接的其他信息。
您使用的具体值取决于您的 Snowflake 账户。但是,角色、仓库、数据库和架构属性必须使用以下值:
参数
所需值
连接的角色
tutorial_role
连接的仓库
tutorial_warehouse
连接的数据库
tutorial_image_database
连接的架构
tutorial_image_schema
运行以下命令验证连接:
snow connection test -c tut-connection
该命令的输出应类似于下面的内容:
+----------------------------------------------------------------------------------+ | key | value | |-----------------+----------------------------------------------------------------| | Connection name | tut-connection | | Status | OK | | Host | USER_ACCOUNT.snowflakecomputing.cn | | Account | USER_ACCOUNT | | User | tutorial_user | | Role | TUTORIAL_ROLE | | Database | TUTORIAL_IMAGE_DATABASE | | Warehouse | TUTORIAL_WAREHOUSE | +----------------------------------------------------------------------------------+
小心
如果不创建 tut-connection
连接,您必须使用为角色、数据库和仓库连接属性指定正确值的连接。
为应用程序设置项目¶
在上一部分中,您为教程设置了 Snowflake CLI 连接。
在本部分中,您将使用 Snowflake CLI 为应用程序创建项目。项目包含应用程序所需的所有资源。这些文件存储在本地文件系统中,可在开发工作流程中由版本控制系统进行管理。
使用 Snowflake CLI 创建项目文件¶
要创建项目文件,请运行以下命令:
snow init --template app_basic na-spcs-tutorial
输入项目标识符的值。
您可以在该文件夹中添加其他文件和子文件夹,并在后面的分部中编辑该命令创建的文件。
该命令使用 app_basic
项目模板创建名为 na-spcs-tutorial
的文件夹。
在 na-spcs-tutorial
文件夹中,该命令会创建以下文件和文件夹:
├── README.md
├── app
└── manifest.yml
└── README.md
└── setup_script.sql
├── snowflake.yml
在后面的部分中,您将修改这些文件并为应用程序添加其他资源。
将服务文件添加到应用程序项目中¶
在上一部分中,您创建了一个项目,其中包含应用程序所需的默认应用程序文件。在本部分中,您将添加所需的文件,为应用程序创建容器。
在
na-spcs-tutorial
文件夹内创建名为service
的文件夹。此文件夹包含我们即将构建并发布到 Snowflake 的基于容器的服务的源代码。
要获取教程所需的 Docker 文件,请将
na_spcs_tutorial.zip
文件下载到本地文件系统。将 zip 文件的内容解压到
na-spcs-tutorial/service
文件夹。该文件夹应包含以下文件:echo_service.py
Dockerfile
templates/basic_ui.html
echo_spec.yaml
验证项目的目录结构¶
为应用程序创建项目并为服务和 Docker 容器添加文件后,该项目在 na-spcs-tutorial
文件夹中应具有如下结构:
├── app
└── manifest.yml
└── README.md
└── setup_script.sql
├── README.md
├── service
└── echo_service.py
├── echo_spec.yaml
├── Dockerfile
└── templates
└── basic_ui.html
├── snowflake.yml
为 Snowpark Container Services 服务构建镜像¶
在本部分中,您将构建 Docker 镜像,并将其上传到在上一部分中创建的镜像仓库。
构建 Docker 镜像并将其上传到镜像仓库¶
要构建 Docker 镜像并将其上传到镜像仓库,请执行以下步骤:
从终端窗口切换到
na-spcs-tutorial/service
文件夹。运行以下 Docker CLI 命令。请注意,您必须在命令中指定当前工作目录 (.):
docker build --rm --platform linux/amd64 -t my_echo_service_image:tutorial .
该命令执行以下操作:
使用下载的 zip 文件中包含的 Docker 文件构建 Docker 镜像
为镜像
my_echo_service_image
命名将
tutorial
标签应用于镜像。
要识别上一部分中创建的镜像仓库的 URL,请运行以下命令:
REPO_URL=$(snow spcs image-repository url tutorial_image_database.tutorial_image_schema.tutorial_image_repo -c tut-connection) echo $REPO_URL
镜像仓库的 URL 在
$REPO_URL
变量中捕获,然后打印到控制台。下一步将使用该值。要为包含镜像 URL 的镜像创建标签,请运行以下 Docker CLI 命令:
docker tag <image_name> <image_url>/<image_name>
该命令需要两个参数:
<image_name>
指定镜像名称和标签。<image_url>/<image_name>
指定上传镜像的镜像仓库的 URL,以及远程存储库中存储的镜像名称和标签。
本教程使用
$REPO_URL
和my_echo_service_image:tutorial
:docker tag my_echo_service_image:tutorial $REPO_URL/my_echo_service_image:tutorial
要使用 Snowflake 注册表进行身份验证,请运行以下 Snowflake CLI 命令:
snow spcs image-registry login -c tut-connection
该命令加载必要凭据,以便 Docker CLI 使用 Snowflake 账户中的镜像仓库。如果不使用默认名称,您必须指定连接名称。
如果一切顺利,则显示消息
Login Succeeded
。要将 Docker 镜像上传到镜像仓库,请运行以下
docker push
命令:docker push $REPO_URL/<image_name>
使用与前几步中
<image_name>
相同的值,该命令是:docker push $REPO_URL/my_echo_service_image:tutorial
运行以下命令,确认镜像上传成功:
snow spcs image-repository list-images tutorial_image_database.tutorial_image_schema.tutorial_image_repo -c tut-connection
在本部分中,您创建了包含 echo 服务的 Docker 镜像,并将其推送到在教程前面创建的 tutorial_repository
镜像仓库。
在下一部分中,您将创建可使用该镜像的应用程序包。
开发您的 Snowflake Native App¶
在上一部分中,您使用 Snowflake CLI 根据项目模板创建了一个项目文件。该模板创建了应用程序所需文件的默认版本。
在本部分中,您将为应用程序更新这些默认文件:
- 项目定义文件
YAML 文件,其中包含要创建的 Snowflake 对象的相关信息。该文件名为
snowflake.yml
,由 Snowflake CLI 用于将应用程序包和对象部署到您的账户中。- 清单文件
YAML 文件,其中包含关于应用程序的基本配置和回调信息。该文件名为
manifest.yml
。- 安装脚本
使用者在其账户中安装应用程序时自动运行的 SQL 脚本。该文件的名称可以根据您自己的喜好指定,只要清单引用它即可。
第一个文件由 Snowflake CLI 使用,而后两个文件则是 Snowflake Native App Framework 所必需的。
在本教程中,将了解有关这些文件及其内容的更多信息。
在本部分中,您还可以创建一个自述文件,在查看和发布应用程序时非常有用。
修改默认清单文件¶
要修改应用程序的清单文件,请执行以下步骤:
修改
na-spcs-tutorial/app/manifest.yml
,使其如下所示:manifest_version: 1 artifacts: setup_script: setup_script.sql readme: README.md container_services: images: - /tutorial_image_database/tutorial_image_schema/tutorial_image_repo/my_echo_service_image:tutorial privileges: - BIND SERVICE ENDPOINT: description: "A service that can respond to requests from public endpoints." - CREATE COMPUTE POOL: description: "Permission to create compute pools for running services"
该示例包括以下内容:
artifacts
属性指定了带容器的应用程序所需的资源位置,包括上一步创建的 Docker 镜像的位置,以及在 Snowsight 中可见的项目 README。privileges
属性允许服务响应公共请求并创建自己的计算池。这些属性是教程下一步中实例化服务所必需的。
修改默认设置脚本¶
要修改应用程序包的默认设置脚本,请执行以下步骤:
修改
na-spcs-tutorial/app/setup_script.sql
文件,添加以下内容:CREATE APPLICATION ROLE IF NOT EXISTS app_user; CREATE SCHEMA IF NOT EXISTS core; GRANT USAGE ON SCHEMA core TO APPLICATION ROLE app_user; CREATE OR ALTER VERSIONED SCHEMA app_public; GRANT USAGE ON SCHEMA app_public TO APPLICATION ROLE app_user; CREATE OR REPLACE PROCEDURE app_public.start_app() RETURNS string LANGUAGE sql AS $$ BEGIN -- account-level compute pool object prefixed with app name to prevent clashes LET pool_name := (SELECT CURRENT_DATABASE()) || '_compute_pool'; CREATE COMPUTE POOL IF NOT EXISTS IDENTIFIER(:pool_name) MIN_NODES = 1 MAX_NODES = 1 INSTANCE_FAMILY = CPU_X64_XS AUTO_RESUME = true; CREATE SERVICE IF NOT EXISTS core.echo_service IN COMPUTE POOL identifier(:pool_name) FROM spec='service/echo_spec.yaml'; CREATE OR REPLACE FUNCTION core.my_echo_udf (TEXT VARCHAR) RETURNS varchar SERVICE=core.echo_service ENDPOINT=echoendpoint AS '/echo'; GRANT USAGE ON FUNCTION core.my_echo_udf (varchar) TO APPLICATION ROLE app_user; RETURN 'Service successfully created'; END; $$; GRANT USAGE ON PROCEDURE app_public.start_app() TO APPLICATION ROLE app_user; CREATE OR REPLACE PROCEDURE app_public.service_status() RETURNS VARCHAR LANGUAGE SQL EXECUTE AS OWNER AS $$ DECLARE service_status VARCHAR; BEGIN CALL SYSTEM$GET_SERVICE_STATUS('core.echo_service') INTO :service_status; RETURN PARSE_JSON(:service_status)[0]['status']::VARCHAR; END; $$; GRANT USAGE ON PROCEDURE app_public.service_status() TO APPLICATION ROLE app_user;
修改默认 README¶
要修改应用程序的 README 文件,请执行以下步骤:
修改
na-spcs-tutorial/app/README.md
,使其如下所示:Welcome to your first app with containers!
使用者安装应用程序后,即可看到 README 文件。
修改默认项目定义文件¶
在本部分中,您将修改 Snowflake CLI 所使用的项目定义文件。
修改
na-spcs-tutorial/snowflake.yml
,使其如下所示:definition_version: 2 entities: na_spcs_tutorial_pkg: type: application package manifest: app/manifest.yml artifacts: - src: app/* dest: ./ - service/echo_spec.yaml meta: role: tutorial_role warehouse: tutorial_warehouse na_spcs_tutorial_app: type: application from: target: na_spcs_tutorial_pkg debug: false meta: role: tutorial_role warehouse: tutorial_warehouse
在本部分中,您定义了一个本地文件结构,可作为 Snowflake Native App with Snowpark Container Services 部署到 Snowflake 账户。在下一部分中,您将使用 Snowflake CLI 执行此部署。
创建并测试应用程序¶
为 Snowflake Native App with Snowpark Container Services 定义清单文件、设置脚本和服务规范后,就可以使用 Snowflake CLI 将应用程序部署到账户中进行测试。
将文件上传到暂存区并创建应用程序对象¶
要在开发模式下创建应用程序,请执行以下步骤:
在终端切换到
na-spcs-tutorial
文件夹。运行以下命令,在账户中创建应用程序包和对象:
snow app run -c tut-connection
该命令将显示确认信息,说明已在您的账户中创建了名为
na_spcs_tutorial_pkg
的应用程序包和名为na_spcs_tutorial_app
的应用程序对象。这些名称与前一部分中修改的snowflake.yml
项目定义中的名称相对应。
您可以使用控制台的 URL 输出来查看应用程序。不过,您必须首先确保它拥有所有必要权限,以创建基于容器的服务。
授予权限并测试应用程序¶
在本部分中,您将向应用程序授予所需的权限,并通过调用容器中的服务来测试应用程序。
您可以使用 Snowsight 或 Snowflake CLI 运行 SQL 命令。
要授予权限并测试应用程序,请在 Snowflake 工作表中执行以下步骤:
运行以下过程,向应用程序授予
CREATE COMPUTE POOL
权限:GRANT CREATE COMPUTE POOL ON ACCOUNT TO APPLICATION na_spcs_tutorial_app; GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO APPLICATION na_spcs_tutorial_app;
运行我们在
setup_script.sql
文件中定义的app_public.start_app
过程。CALL na_spcs_tutorial_app.app_public.start_app();
该过程会创建计算池、实例化服务并创建服务函数。
运行以下过程,确认函数已创建:
SHOW FUNCTIONS LIKE '%my_echo_udf%' IN APPLICATION na_spcs_tutorial_app;
备注
使用者看不到正在运行的服务,因为它作为 Snowflake Native App 的一部分运行。例如,运行
SHOW SERVICES IN APPLICATION na_spcs_tutorial_app;
不会返回任何信息。要验证服务是否已创建并正常运行,请运行以下命令:
CALL na_spcs_tutorial_app.app_public.service_status();
该命令调用您在设置脚本中定义的
app_public.service_status
过程:当此过程返回
READY
时,继续下一步。要调用服务函数,向服务发送请求并验证响应,请运行以下命令:
SELECT na_spcs_tutorial_app.core.my_echo_udf('hello');
您将从前面部分配置的服务中看到以下信息:
``Bob said hello``
拆解教程中创建的应用程序和对象¶
小心
如果您计划在完成本教程后执行 教程 3:使用容器升级应用程序,请不要执行本部分中的步骤。本教程中创建的带容器的应用程序是升级教程的前提条件。
由于该应用程序使用计算池,因此它会在您的账户中累积 credit,并产生运行费用。要阻止应用程序使用资源,您必须同时删除应用程序对象和它创建的任何账户级对象(例如计算池)。
要确认计算池当前正在运行,请运行以下命令:
snow object list compute-pool -l "na_spcs_tutorial_app_%"
如果计算池正在运行,则会显示一行由应用程序对象创建的
ACTIVE
计算池。运行以下 Snowflake CLI 命令来删除应用程序:
snow app teardown --cascade --force -c tut-connection
此命令将移除应用程序创建的所有 Snowflake 对象。如果没有
--force
选项,此命令不会删除应用程序包,因为它包含多个版本。要确认计算池已删除,请再次运行以下命令:
snow object list compute-pool -l "na_spcs_tutorial_app_%"
如果计算池已成功删除,此命令将返回
no data
。
备注
snow app teardown
命令会删除应用程序包和应用程序对象。因此,任何有状态数据都会丢失。
了解详情¶
恭喜!您不仅完成了本教程,而且还完成了 Snowflake Native App with Snowpark Container Services 的开发和发布生命周期。
在此过程中,您执行了以下操作:
使用了 Snowsight 和 Snowflake CLI,使用 Snowflake Native App Framework 构建应用程序。
有关如何配置 Snowflake CLI 所用连接的更多信息,请参阅 配置 Snowflake CLI 和连接到 Snowflake。
有关 Snowsight 的更多信息,请参阅 工作表入门 和 在 Snowsight 中管理和使用工作表。
有关 Snowflake CLI 中本地应用程序的更多信息,请参阅 在 Snowflake CLI 中使用 Snowflake Native App。
创建了所有应用程序所需的清单和安装脚本。
有关详细信息,请参阅 为应用程序包创建清单文件 和 创建安装脚本。
创建了一个应用程序包,作为应用程序逻辑和数据内容的容器。
有关详细信息,请参阅 创建应用程序包。
使用 Docker CLI 和 Snowflake CLI 构建容器并将其上传到 Snowflake。
使用 Snowpark Container Services 创建
COMPUTE POOL
,并在 Snowflake Native App 内实例化容器。