Tutorial 2: Crie um aplicativo com contêineres¶
Introdução¶
O Snowflake Native App Framework permite que os provedores criem, vendam e distribuam aplicativos dentro do Snowflake Data Cloud. Os provedores podem criar aplicativos que aproveitam a funcionalidade central do Snowflake para compartilhar dados e lógica de aplicativos com os consumidores. A lógica de um Snowflake Native App pode incluir recursos como procedimentos armazenados e funções definidas pelo usuário (UDFs). Os provedores podem compartilhar seus aplicativos com os consumidores por meio de listagens no Snowflake Marketplace ou por meio de listagens privadas.
O Snowflake Native App pode implementar o Snowpark Container Services para facilitar a implantação, o gerenciamento e o dimensionamento de aplicativos em contêineres no ecossistema do Snowflake. Este tutorial descreve como criar um Snowflake Native App with Snowpark Container Services, que é um Snowflake Native App que executa cargas de trabalho de contêineres no Snowflake. O 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 aplicativos.
Nota
Este tutorial usa ambos Snowflake CLI e Snowsight para executar as tarefas necessárias.
O que você aprenderá neste tutorial¶
Neste tutorial, você aprenderá o seguinte:
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.
Configure seu ambiente Snowflake¶
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
, siga estas etapas:
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 executa o tutorial, execute o seguinte comando:GRANT ROLE tutorial_role TO USER <user_name>;
Onde:
user_name
Especifica o nome do usuário que executa 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.
Você usará essa função durante o 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, crie os objetos do Snowflake necessários para um aplicativo com contêineres.
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 é usado para executar consultas para o aplicativo que criou, bem como um repositório de imagens para hospedar imagens de contêineres.
Na próxima seção, crie uma imagem para o contêiner e carregue-a no repositório de imagens que você criou acima.
Criação de uma conexão Snowflake CLI para o tutorial¶
Para executar os comandos Snowflake CLI neste tutorial, você deve configurar uma conexão Snowflake CLI para o tutorial.
Para criar uma conexão, execute as seguintes tarefas:
No terminal, execute o seguinte comando:
snow connection add
Digite
tut-connection
como o nome da conexão.Insira informações adicionais sobre a conexão Snowflake CLI.
Os valores específicos que você usa dependem da sua conta Snowflake. No entanto, você deve usar os seguintes valores para as propriedades de função, warehouse, banco de dados e esquema:
Parâmetro
Valor exigido
Função para a conexão
tutorial_role
Warehouse para a conexão
tutorial_warehouse
Banco de dados para a conexão
tutorial_image_database
Esquema para a conexão
tutorial_image_schema
Verifique a conexão executando o seguinte comando:
snow connection test -c tut-connection
A saída desse comando deve ser semelhante à seguinte:
+----------------------------------------------------------------------------------+ | key | value | |-----------------+----------------------------------------------------------------| | Connection name | tut-connection | | Status | OK | | Host | USER_ACCOUNT.snowflakecomputing.com | | Account | USER_ACCOUNT | | User | tutorial_user | | Role | TUTORIAL_ROLE | | Database | TUTORIAL_IMAGE_DATABASE | | Warehouse | TUTORIAL_WAREHOUSE | +----------------------------------------------------------------------------------+
Cuidado
Se você não criar a conexão tut-connection
, deverá usar uma conexão que especifique os valores corretos para as propriedades de conexão de função, banco de dados e warehouse.
Configuração de um projeto para o aplicativo¶
Na seção anterior, você configurou uma conexão Snowflake CLI para o tutorial.
Nesta seção, use o Snowflake CLI para criar um projeto para o seu aplicativo. Um projeto contém todos os ativos necessários para um aplicativo. Esses arquivos são armazenados no seu sistema de arquivos local e podem ser gerenciados por um sistema de controle de versão como parte do seu fluxo de trabalho de desenvolvimento.
Criação de um arquivo de projeto usando o Snowflake CLI¶
Para criar um arquivo de projeto, execute o seguinte comando:
snow init --template app_basic na-spcs-tutorial
Digite um valor para o identificador do projeto.
Você adiciona outros arquivos e subpastas a essa pasta e edita os arquivos criados por esse comando em subseções posteriores.
Esse comando cria uma pasta chamada na-spcs-tutorial
usando o modelo de projeto app_basic
.
Na pasta na-spcs-tutorial
, esse comando cria os seguintes arquivos e pastas:
├── README.md
├── app
└── manifest.yml
└── README.md
└── setup_script.sql
├── snowflake.yml
Nas seções posteriores, você modifica esses arquivos e acrescenta recursos adicionais ao seu aplicativo.
Adição dos arquivos de serviço ao projeto do aplicativo¶
Na seção anterior, você criou um projeto que inclui os arquivos de aplicativo padrão exigidos pelo seu aplicativo. Nesta seção, adicione os arquivos necessários para criar o contêiner do seu aplicativo.
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 do Docker necessários para o tutorial, faça o download do arquivo
na_spcs_tutorial.zip
para o sistema de arquivos local.Descompacte o conteúdo do arquivo zip na pasta
na-spcs-tutorial/service
. Esta pasta deve conter os seguintes arquivos:echo_service.py
Dockerfile
templates/basic_ui.html
echo_spec.yaml
Verificação da estrutura de diretórios de seu projeto¶
Depois de criar o projeto para o seu aplicativo e adicionar os arquivos para o serviço e o contêiner do Docker, o projeto deverá ter a seguinte estrutura na pasta 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
Criação de uma imagem para um serviço do Snowpark Container Services¶
Nesta seção, você cria uma imagem do Docker e a carrega no repositório de imagens que criou na seção anterior.
Criação de uma imagem do Docker e carregamento no repositório de imagens¶
Para criar uma imagem do Docker e carregá-la no repositório de imagens, siga estas etapas:
Em uma janela de terminal, vá para a pasta
na-spcs-tutorial/service
.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 -c tut-connection) echo $REPO_URL
O URL do repositório de imagens é capturado na variável
$REPO_URL
e depois impressa no console. Você usa 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 tut-connection
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 -c tut-connection
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ê cria um pacote de aplicativo que usa essa imagem.
Desenvolvimento de seu Snowflake Native App¶
Em uma seção anterior, você usou o Snowflake CLI para criar um arquivo de projeto com base em um modelo de projeto. Esse modelo criou versões padrão dos arquivos exigidos pelo aplicativo.
Nesta seção, você atualiza esses arquivos padrão para o seu aplicativo:
- 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 seu conteúdo ao longo deste tutorial.
Nesta seção, o usuário também cria um arquivo leiame que é útil ao visualizar e publicar o aplicativo.
Modificação do arquivo de manifesto padrão¶
Para modificar o arquivo de manifesto do aplicativo, siga estas etapas:
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 fique 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.
Modificação do script de configuração padrão¶
Para modificar o script de configuração padrão do pacote de aplicativo, siga estas etapas:
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 TABLE () LANGUAGE SQL EXECUTE AS OWNER AS $$ BEGIN LET stmt VARCHAR := 'SHOW SERVICE CONTAINERS IN SERVICE core.echo_service; LET res RESULTSET := (EXECUTE IMMEDIATE :stmt); RETURN TABLE(res); END; $$; GRANT USAGE ON PROCEDURE app_public.service_status() TO APPLICATION ROLE app_user;
Modificação do README padrão¶
Para modificar o arquivo README do aplicativo, siga estas etapas:
Modifique
na-spcs-tutorial/app/README.md
para ficar parecido com o seguinte:Welcome to your first app with containers!
Esse arquivo README fica visível para os consumidores depois que eles instalam seu aplicativo.
Modificação do arquivo de definição de projeto padrão¶
Nesta seção, você modifica o arquivo de definição de projeto usado 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ê realizará essa implementação usando o 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.
Carregamento de arquivos para o estágio e criação do objeto do aplicativo¶
Para criar um aplicativo no modo de desenvolvimento, siga estas etapas:
Em um terminal, vá para a pasta
na-spcs-tutorial
.Crie o pacote do aplicativo e o objeto em sua conta executando o seguinte comando:
snow app run -c tut-connection
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 da definição do projetosnowflake.yml
que você modificou 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.
Concessão dos privilégios e teste do aplicativo¶
Nesta seção, você concede 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 de uma planilha do Snowflake:
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();
Essa instrução chama o procedimento
app_public.service_status
que você definiu no script de configuração. O procedimento retorna informações sobre os contêineres desse serviço.Se o valor na coluna
status
não forREADY
, execute a instrução novamente, até que o status do contêiner de serviço sejaREADY
.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ê vê a seguinte mensagem do serviço que configurou em uma seção anterior:
``Bob said hello``
Como derrubar o aplicativo e os objetos criados no tutorial¶
Cuidado
Se você planeja executar o Tutorial 3: Atualize um aplicativo com contêineres depois de concluir este tutorial, não execute as etapas desta seção. O aplicativo com contêineres que você criou neste tutorial é um pré-requisito para o tutorial de upgrade.
Como o aplicativo usa um pool de computação, ele acumula créditos na sua conta e custa dinheiro para ser executado. Para que o aplicativo deixe de consumir recursos, você deve desativar o objeto do aplicativo e qualquer um dos objetos no nível da conta que ele criou, por exemplo, o pool de computação.
Para confirmar que o pool de computação está em execução no momento, execute o seguinte comando:
snow object list compute-pool -l "na_spcs_tutorial_app_%"
Se o pool de computação estiver em execução, será exibida uma linha com um pool de computação
ACTIVE
que foi criado pelo objeto de aplicativo.Execute o seguinte comando Snowflake CLI para desativar o aplicativo:
snow app teardown --cascade --force -c tut-connection
Esse comando remove todos os objetos Snowflake criados pelo aplicativo. Sem a opção
--force
, esse comando não descarta o pacote do aplicativo porque ele contém versões.Para confirmar que o pool de computação foi descartado, execute o seguinte comando novamente:
snow object list compute-pool -l "na_spcs_tutorial_app_%"
Esse comando retorna
no data
se o pool de computação tiver sido descartado com êxito.
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.