为应用程序添加服务¶
该主题介绍了如何在 Snowflake Native App with Snowpark Container Services 中配置和使用服务。有关在应用程序中使用作业服务的信息,请参阅 向应用程序添加作业服务。
在使用者账户中创建服务所需的权限¶
要让应用程序在使用者账户中创建服务,使用者必须首先授予以下权限:
CREATE COMPUTE POOL
所有服务都需要此权限。在使用者账户中创建服务需要一个或多个计算池。
BIND SERVICE ENDPOINT
任何公开端点的服务都需要此权限。如果服务需要与 Snowflake 以外的 URLs 建立连接,则应用程序需要此权限才能创建所需的外部访问集成。
在应用程序中创建服务时的注意事项¶
在 Snowflake Native App with Snowpark Container Services 中创建服务时要注意以下几点:
对仓库的引用。有关在 Snowflake Native App with Snowpark Container Services 中使用仓库的信息,请参阅 在应用程序中使用服务时的最佳实践。
不支持应用程序中的服务名称包含引号。
不能在版本化架构中创建服务。
不能使用在应用程序中创建的容器映像在应用程序外部创建服务。
在应用程序中使用服务时的最佳实践¶
以下是在 Snowflake Native App with Snowpark Container Services 中使用服务时的最佳实践和注意事项:
创建一个 Streamlit 应用程序或存储过程,以允许使用者与服务交互。
在某些情况下,用户可能需要创建、启动、停止、重启和管理应用程序提供的服务。
使用一个存储过程来验证使用者是否授予了所有必要的权限。
一项服务可能要求使用者向应用程序授予多种权限。例如,一项服务可能需要 CREATE COMPUTE POOL、CREATE WAREHOUSE、BIND SERVICE ENDPOINT 和其他权限。应用程序还可能需要引用使用者账户中的现有对象。
在这种情况下,Snowflake 建议使用单个存储过程来验证是否满足所有先决条件。验证所有先决条件后,该存储过程将创建服务。
如果服务需要仓库来执行查询,应用程序应直接在使用者账户中创建仓库。这就要求使用者向应用程序授予 CREATE WAREHOUSE 全局权限。有关更多信息,请参阅 向使用者请求全局权限。
使用规范模板创建服务时,请将使用者提供的实参存储在应用程序实例中。这样就可以在升级服务时将它们作为实参传递。
在应用程序中创建服务¶
要在应用程序中创建服务,请使用安装脚本中的 CREATE SERVICE 命令。供应商应始终考虑在存储过程中调用该命令,而不是直接运行它。
在使用容器的应用程序中,可使用规范文件或 规范模板 创建服务。
使用规范文件创建服务¶
要使用规范文件创建服务,请使用 CREATE SERVICE 命令并包括对服务规范文件的引用:
CREATE SERVICE IF NOT EXISTS app_service
IN COMPUTE POOL app_compute_pool
FROM SPECIFICATION_FILE = '/containers/service1_spec.yaml';
此示例演示了如何使用 FROM SPECIFICATION_FILE 子句创建服务,该子句使用文件的相对路径。FROM SPECIFICATION_FILE 子句指向特定于应用程序版本的服务规范文件。该路径相对于应用程序根目录。
不过,您也可以使用暂存区上的规范文件。有关更多信息,请参阅 CREATE SERVICE。
使用规范模板创建服务¶
要使用 规范模板 创建服务,请使用 CREATE SERVICE 命令的 FROM SPECIFICATION_TEMPLATE_FILE 子句,如以下示例所示:
CREATE SERVICE IF NOT EXISTS app_service
IN COMPUTE POOL app_compute_pool
FROM SPECIFICATION_TEMPLATE_FILE = '/containers/service1_spec.yaml';
有关更多信息,请参阅 规范模板。
将 CREATE SERVICE 命令添加到存储过程¶
Snowflake Native Apps with Snowpark Container Services 支持在存储过程中创建服务的多种方法。
提供商可以使用这些方法的任意组合在使用者账户中创建服务。
使用 grant_callback
属性创建服务¶
grant_callback
是清单文件中的一个属性,允许提供商指定回调函数。回调函数是一个存储过程,可以创建计算池、服务以及执行应用程序所需的其他设置任务。
备注
使用 grant_callback
属性指定回调函数仅受 Snowflake Native Apps with Snowpark Container Services 支持。
使用 grant_callback
指定回调函数的好处是,在使用者向应用程序授予所需权限之前,存储过程不会被调用。这可确保应用程序拥有在使用者账户中创建服务和其他对象所需的权限。
要使用 grant_callback
,请将其添加到 manifest.yml
文件的 configuration
部分:
configuration:
log_level: INFO
trace_level: ALWAYS
grant_callback: core.grant_callback
然后,在安装脚本中定义一个回调函数,如下例所示:
CREATE SCHEMA core;
CREATE APPLICATION ROLE app_public;
CREATE OR REPLACE PROCEDURE core.grant_callback(privileges array)
RETURNS STRING
AS $$
BEGIN
IF (ARRAY_CONTAINS('CREATE COMPUTE POOL'::VARIANT, privileges)) THEN
CREATE COMPUTE POOL IF NOT EXISTS app_compute_pool
MIN_NODES = 1
MAX_NODES = 3
INSTANCE_FAMILY = GPU_NV_M;
END IF;
IF (ARRAY_CONTAINS('BIND SERVICE ENDPOINT'::VARIANT, privileges)) THEN
CREATE SERVICE IF NOT EXISTS core.app_service
IN COMPUTE POOL my_compute_pool
FROM SPECIFICATION_FILE = '/containers/service1_spec.yaml';
END IF;
RETURN 'DONE';
END;
$$;
GRANT USAGE ON PROCEDURE core.grant_callback(array) TO APPLICATION ROLE app_public;
此示例创建一个 grant_callback
存储过程,其功能如下:
测试用户是否已向应用程序授予 CREATE COMPUTE POOL 权限。如果使用者授予了此权限,
grant_callback
程序就会创建计算池。测试用户是否已向应用程序授予 BIND SERVICE ENDPOINT 权限。如果使用者授予了此权限,
grant_callback
程序就会创建服务。
此示例展示了在使用容器的应用程序中创建服务和计算池的模式。在此示例中,应用程序首先测试使用者是否授予了所需权限,然后创建服务或计算池。
根据参考定义创建服务¶
应用程序可通过 manifest.yml
文件中的:code:register_callback
属性,使用引用定义创建服务。该属性指定一个存储过程,其用于将使用者账户中的对象与引用定义绑定。
有关在应用程序中使用引用的更多信息,请参阅 向使用者请求引用和对象级权限
在绑定所有必要的引用后,应用程序可以使用引用的 register_callback
来创建服务。如果在允许外部访问集成或密钥的所有引用之前创建服务,则服务创建会失败。
使用存储过程创建服务¶
应用程序可以直接在存储过程中创建服务。与其他存储过程一样,提供商可以在应用程序安装脚本中定义这些存储过程。该存储过程将使用 CREATE SERVICE 命令创建服务,然后将对存储过程的权限授予应用程序角色。
使用者为应用程序授予所需权限和引用后,将调用此存储过程在其账户中创建服务。
确定服务的状态¶
要确定服务的状态,应用程序可以从安装脚本中调用 SYSTEM$GET_SERVICE_STATUS – 已弃用 系统函数。
此系统函数为每个服务实例中的每个容器返回一个 JSON 对象。