Tutorial: Crie um Snowflake Native App com o Snowpark Container Services¶
Introdução¶
Este tutorial descreve como criar um Snowflake Native App with Snowpark Container Services. Um Snowflake Native App with Snowpark Container Services é um Snowflake Native App que executa cargas de trabalho de contêiner no Snowflake. Snowflake Native Apps with Snowpark Container Services pode executar qualquer serviço em contêiner, aproveitando todos os recursos do Snowflake Native App Framework, incluindo segurança, registro, conteúdo de dados compartilhados e lógica de aplicativo.
Este tutorial usa ambos Snowflake CLI e Snowsight para executar as tarefas necessárias.
O que você aprenderá¶
Neste tutorial, você aprenderá como:
Usar Snowflake CLI para inicializar um projeto Snowflake Native App with Snowpark Container Services.
Criar uma imagem Docker para um aplicativo.
Criar o pacote de aplicativo e os arquivos de aplicativo necessários para um Snowflake Native App with Snowpark Container Services.
Testar um Snowflake Native App with Snowpark Container Services chamando a função de serviço dentro do contêiner.
Pré-requisitos¶
Para executar este tutorial, você deve atender aos seguintes pré-requisitos:
Ter acesso a uma conta Snowflake com suporte ao Snowpark Container Services.
Você deve ser capaz de usar a função ACCOUNTADMIN para criar a função usada neste tutorial e conceder os privilégios necessários a essa função.
Você deve ter Snowflake CLI versão
3.0.0
ou superior instalado em sua máquina local.Você deve ter o Docker Desktop instalado na sua máquina local.
Configuração de uma função para este tutorial¶
Este tutorial orienta você no processo de criação de um Snowflake Native App with Snowpark Container Services usando a função tutorial_role
. Antes de trabalhar neste tutorial, um usuário do Snowflake com a função ACCOUNTADMIN deve executar as seguintes etapas para configurar esta função.
Para criar e configurar a função tutorial_role
, faça o seguinte:
Para criar a função
tutorial_role
, execute o seguinte comando:CREATE ROLE tutorial_role;
Para conceder o
tutorial_role
ao usuário do Snowflake que executará o tutorial, execute o seguinte comando:GRANT ROLE tutorial_role TO USER <user_name>;
Onde:
user_name
Especifica o nome do usuário que executará o tutorial.
Para conceder os privilégios necessários para criar e usar os objetos Snowflake exigidos por um aplicativo de contêiner, execute os seguintes comandos:
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;
Após executar as tarefas desta seção, o usuário que possui a função tutorial_role
concedida à sua conta tem as permissões para criar todos os objetos Snowflake necessários para criar um Snowflake Native App with Snowpark Container Services. Usaremos essa função no restante deste tutorial.
Em uma situação do mundo real, um provedor pode precisar de privilégios semelhantes ou acesso a objetos existentes para desenvolver um aplicativo com contêineres, incluindo um pool de computação, um warehouse e um banco de dados.
Criação dos objetos necessários em sua conta¶
Nesta seção, você criará alguns objetos Snowflake necessários para um Snowflake Native App with Snowpark Container Services.
Configuração da sua conexão de Snowflake CLI¶
Os comandos que você executará neste tutorial pressupõem que você tenha configurado Snowflake CLI para conectar-se por padrão à conta onde você está desenvolvendo o aplicativo. Se esta conta não estiver definida por padrão, você pode usar o argumento -c
de linha de comando para especificar uma conexão com nome diferente, por exemplo:
snow sql -q "SELECT 1" -c connection_name
Criação de um warehouse e um repositório de imagens¶
Para criar os objetos necessários, execute o seguinte por meio de Snowsight ou Snowflake CLI.
Para definir o contexto atual em Snowsight para usar a função
tutorial_role
, execute o seguinte comando:USE ROLE tutorial_role;
Se você estiver usando Snowflake CLI, você pode usar
--role tutorial_role
em vez disso.Para criar um warehouse para o Snowflake Native App with Snowpark Container Services, execute o seguinte comando:
CREATE OR REPLACE WAREHOUSE tutorial_warehouse WITH WAREHOUSE_SIZE = 'X-SMALL' AUTO_SUSPEND = 180 AUTO_RESUME = true INITIALLY_SUSPENDED = false;
Um warehouse é exigido pelo Snowflake Native App para executar os comandos SQL e procedimentos armazenados.
Para criar o repositório de imagens usado para armazenar o contêiner, execute o seguinte comando:
CREATE DATABASE tutorial_image_database; CREATE SCHEMA tutorial_image_schema; CREATE IMAGE REPOSITORY tutorial_image_repo;
Nesta seção, você criou um warehouse que será usado para executar consultas para o aplicativo que você criará, bem como um repositório de imagens para hospedar imagens de contêiner.
Na próxima seção, você criará uma imagem para o contêiner e a enviará para o repositório de imagens criado acima.
Criação de uma imagem para um serviço do Snowpark Container Services¶
Nesta seção, você criará uma imagem do Docker e a enviará para o repositório de imagens criado na seção anterior.
Criação de um diretório de projeto¶
O código-fonte do seu aplicativo existe no sistema de arquivos local e pode ser verificado no controle de versão, se desejado. Começaremos usando Snowflake CLI para inicializar um projeto de Native Apps; então, construiremos a imagem para nosso serviço de contêiner em uma subpasta.
No seu sistema de arquivos local, execute o seguinte comando para criar uma pasta chamada
na-spcs-tutorial
:snow init --template app_basic na-spcs-tutorial
Nota
Você adicionará outros arquivos e subpastas a essa pasta e editará os arquivos criados por esse comando em subseções posteriores.
Nota
Execute o
snow init --help
para ver outros modelos para configurar um ambiente de desenvolvimento do Snowflake Native App.Crie uma pasta chamada
service
dentro da pastana-spcs-tutorial
. Esta pasta contém o código-fonte do serviço baseado em contêiner que estamos prestes a criar e publicar no Snowflake.Para obter os arquivos Docker necessários para o tutorial, baixe o arquivo zip para seu sistema de arquivos local.
Descompacte o conteúdo para a pasta
na-spcs-tutorial/service
. Esta pasta deve conter os seguintes arquivos:echo_service.py
Dockerfile
templates/basic_ui.html
echo_spec.yaml
Abra uma janela de terminal e mude para esse diretório.
Criação de uma imagem Docker e carregamento no contêiner¶
Para criar uma imagem do Docker e enviá-la ao repositório de imagens, faça o seguinte:
Execute o seguinte comando Docker CLI. Observe que você deve especificar o diretório de trabalho atual (.) no comando:
docker build --rm --platform linux/amd64 -t my_echo_service_image:tutorial .
Este comando executa o seguinte:
Cria uma imagem Docker usando o arquivo Docker incluído no arquivo zip que você baixou
Nomeia a imagem
my_echo_service_image
Aplica a tag
tutorial
na imagem.
Para identificar o URL do repositório de imagens que você criou em uma seção anterior, execute o seguinte comando:
REPO_URL=$(snow spcs image-repository url tutorial_image_database.tutorial_image_schema.tutorial_image_repo --role tutorial_role) echo $REPO_URL
O URL do repositório de imagens é capturado na variável
$REPO_URL
e depois impressa no console. Você usará esse valor na próxima etapa.Para criar uma tag para a imagem que inclui o URL da imagem, execute o seguinte comando Docker CLI:
docker tag <image_name> <image_url>/<image_name>
Este comando requer dois parâmetros:
<nome_da_imagem>
Especifica o nome da imagem e a tag.<url_da_imagem>/<nome_da_imagem>
Especifica o URL do repositório de imagens onde a imagem é carregada e o nome e a tag da imagem onde ela deve ser armazenada no repositório remoto.
Para este tutorial, use
$REPO_URL
emy_echo_service_image:tutorial
:docker tag my_echo_service_image:tutorial $REPO_URL/my_echo_service_image:tutorial
Para autenticar com o registro Snowflake, execute o seguinte comando Snowflake CLI:
snow spcs image-registry login [-c connection_name]
Este comando carrega as credenciais necessárias para o Docker CLI para usar os repositórios de imagens na sua conta Snowflake. Você deve especificar o nome da conexão, caso não esteja usando o padrão.
A mensagem
Login Succeeded
exibe se tudo foi bem-sucedido.Para carregar a imagem do Docker no repositório de imagens, execute o seguinte comando
docker push
:docker push $REPO_URL/<image_name>
Usando o mesmo valor que
<nome_da_imagem>
dos passos anteriores, este comando é:docker push $REPO_URL/my_echo_service_image:tutorial
Confirme se a imagem foi carregada com sucesso executando o seguinte comando:
snow spcs image-repository list-images tutorial_image_database.tutorial_image_schema.tutorial_image_repo --role tutorial_role
Nesta seção, você criou uma imagem Docker contendo o serviço echo e a enviou para o repositório de imagens tutorial_repository
que você criou anteriormente no tutorial.
Na próxima seção, você criará um pacote de aplicativo que usa essa imagem.
Desenvolvimento de seu Snowflake Native App¶
Nesta seção, você criará os seguintes arquivos:
- Arquivo de definição do projeto
Um arquivo YAML que contém informações sobre o(s) objeto(s) Snowflake que você deseja criar. Este arquivo é chamado
snowflake.yml
e é usado por Snowflake CLI para implantar o pacote do aplicativo e o objeto em sua conta.- Arquivo do manifesto
Um arquivo YAML que contém informações básicas de configuração de retorno de chamada sobre o aplicativo. Este arquivo é chamado
manifest.yml
.- Script de configuração
Um script SQL que é executado automaticamente quando um consumidor instala um aplicativo em sua conta. Este arquivo pode ser chamado como você quiser, desde que seja referenciado pelo seu manifesto.
O primeiro arquivo é usado por Snowflake CLI, enquanto os dois últimos são exigidos pelo Snowflake Native App Framework.
Você aprenderá mais sobre esses arquivos e seus conteúdos ao longo deste tutorial. Você também criará um arquivo leia-me que é útil ao visualizar e publicar seu aplicativo nas seções posteriores deste tutorial.
Criação do arquivo de manifesto para o pacote de aplicativo¶
Para criar o arquivo de manifesto necessário para o pacote do aplicativo, faça o seguinte:
Modifique
na-spcs-tutorial/app/manifest.yml
para ficar parecido com o seguinte: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"
Este exemplo inclui o seguinte:
A propriedade
artifacts
especifica os locais dos recursos necessários para um aplicativo com contêineres, incluindo o local da imagem do Docker que você criou em uma etapa anterior, bem como o projeto README que ficará visível em Snowsight.A propriedade
privileges
permite que um serviço responda a solicitações públicas e também crie seu próprio pool de computação. Essas propriedades são necessárias para instanciar nosso serviço na próxima etapa do tutorial.
Criação do script de configuração para o pacote do aplicativo¶
Para criar o script de configuração necessário para o pacote do aplicativo, faça o seguinte:
Modifique o arquivo
na-spcs-tutorial/app/setup_script.sql
para incluir o seguinte: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;
Criação de um leia-me para o pacote do aplicativo¶
Modifique
na-spcs-tutorial/app/README.md
para ficar parecido com o seguinte:Welcome to your first app with containers!
Este arquivo leia-me fica visível para os consumidores que instalaram seu aplicativo.
Criação do arquivo de definição do projeto¶
Nesta seção, você criará o arquivo de definição do projeto exigido pelo Snowflake CLI.
Modifique
na-spcs-tutorial/snowflake.yml
para ficar parecido com o seguinte: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
Nesta seção, você definiu uma estrutura de arquivo local que pode ser implantada em uma conta Snowflake como um Snowflake Native App with Snowpark Container Services. Na próxima seção, você executará essa implantação usando Snowflake CLI.
Criação e teste do aplicativo¶
Após definir o arquivo manifesto, o script de configuração e a especificação de serviço para seu Snowflake Native App with Snowpark Container Services, você pode testar o aplicativo implantando-o em sua conta usando Snowflake CLI.
Implantação do aplicativo¶
Para implantar o aplicativo no modo de desenvolvimento em estágios, faça o seguinte:
Crie o pacote do aplicativo e o objeto em sua conta executando o seguinte comando dentro da pasta
na-spcs-tutorial
:snow app run [-c connection_name]
Este comando exibe uma confirmação de que um pacote de aplicativo chamado
na_spcs_tutorial_pkg
e um objeto de aplicativo chamadona_spcs_tutorial_app
foram criados em sua conta. Esses nomes correspondem aos nomes na definição de projetosnowflake.yml
que você criou em uma seção anterior.
Você pode usar a saída do URL para o console para visualizar o aplicativo. No entanto, primeiro você deve garantir que ele tenha todos os privilégios necessários para criar seu serviço baseado em contêiner.
Você fará isso na próxima seção.
Concessão dos privilégios e teste do aplicativo¶
Nesta seção, você concederá os privilégios necessários ao aplicativo e testará o aplicativo chamando os serviços no contêiner.
Você pode executar os comandos SQL usando o Snowsight ou o Snowflake CLI.
Para conceder os privilégios e testar o aplicativo, execute as seguintes etapas.
Nota
Para executar em Snowflake CLI, tente a seguinte sintaxe:
snow sql -q "<sql>" --role tutorial_role --warehouse tutorial_warehouseComo nas etapas anteriores, você pode adicionar
-c connection_name
para escolher uma conexão não padrão.
Conceda o privilégio
CREATE COMPUTE POOL
ao aplicativo executando o seguinte:grant create compute pool on account to application na_spcs_tutorial_app; grant bind service endpoint on account to application na_spcs_tutorial_app;
Execute o procedimento
app_public.start_app
que definimos no arquivosetup_script.sql
.CALL na_spcs_tutorial_app.app_public.start_app();
Este procedimento cria o pool de computação, instancia o serviço e cria a função de serviço.
Confirme se a função foi criada executando o seguinte:
SHOW FUNCTIONS LIKE '%my_echo_udf%' IN APPLICATION na_spcs_tutorial_app;
Nota
Os consumidores não conseguem ver o serviço em execução porque ele é executado como parte do Snowflake Native App. Por exemplo, a execução de
SHOW SERVICES IN APPLICATION na_spcs_tutorial_app;
não retorna nada.Para verificar se o serviço foi criado e está íntegro, execute o seguinte comando:
CALL na_spcs_tutorial_app.app_public.service_status();
Este comando chama o procedimento
app_public.service_status
que você definiu no script de configuração:Quando este procedimento retorna
READY
, você prossegue para a próxima etapa.Para chamar a função de serviço para enviar uma solicitação ao serviço e verificar a resposta, execute o seguinte comando:
SELECT na_spcs_tutorial_app.core.my_echo_udf('hello');
Você verá uma mensagem do serviço que carregamos em uma seção anterior:
Bob said hello
.
Como derrubar o aplicativo e os objetos criados no tutorial¶
Como o aplicativo usa um pool de computação, ele acumula créditos na sua conta e custa dinheiro para ser executado. Para impedir que o aplicativo consuma recursos, você deve derrubar o objeto do aplicativo junto com qualquer um dos objetos de nível de conta que ele criou (como nosso COMPUTE POOL
).
Para confirmar se o pool de computação está em execução, execute o seguinte comando:
snow object list compute-pool -l "na_spcs_tutorial_app_%"
Você deverá ver uma linha com um pool de computação
ACTIVE
que foi criado pelo objeto de aplicativo.Execute o seguinte comando Snowflake CLI para derrubar o aplicativo:
snow app teardown --cascade [-c connection_name]
Nota
A opção
CASCADE
remove todos os objetos associados ao nível da conta pertencentes ao aplicativo antes que ele seja descartado. Esta opção requer a versão Snowflake CLI 2.4.0 ou superior.Execute o comando
snow object list
novamente para confirmar que o pool de computação foi descartado.
Nota
O comando snow app teardown
descarta o pacote do aplicativo e o objeto do aplicativo; portanto, todos os dados com estado são perdidos.
Saiba mais¶
Parabéns! Você não apenas concluiu este tutorial, mas também trabalhou no ciclo de vida de desenvolvimento e publicação de um aplicativo usando o Snowflake Native App with Snowpark Container Services.
Ao longo do caminho, você:
Usou o Snowsight e Snowflake CLI para construir um aplicativo usando o Snowflake Native App Framework.
Consulte Configuração de Snowflake CLI e conexão ao Snowflake para obter mais informações sobre como configurar as conexões usadas por Snowflake CLI.
Para obter mais informações sobre Snowsight, consulte Introdução a planilhas e Trabalhar com planilhas no Snowsight.
Para obter mais informações sobre Native Apps em Snowflake CLI, consulte Uso do Snowflake Native App em Snowflake CLI.
Criou o manifesto e o script de configuração necessários para todos os aplicativos.
Consulte Criação do arquivo de manifesto para um pacote de aplicativo e Criação de um script de configuração para obter detalhes.
Criou um pacote de aplicativo que funciona como um contêiner para a lógica do aplicativo e o conteúdo de dados do seu aplicativo.
Consulte Criação de um pacote de aplicativo para obter detalhes.
Usou Docker CLI e Snowflake CLI para criar e carregar um contêiner no Snowflake.
Usou o Snowpark Container Services para criar um
COMPUTE POOL
e instanciar o contêiner dentro de um Snowflake Native App.