Criação e gerenciamento dos serviços de longa duração em um aplicativo

O tópico descreve como configurar e usar serviços de longa duração em um Snowflake Native App with Snowpark Container Services. Para obter informações sobre como usar um serviço de trabalho em um aplicativo, consulte Criação e gerenciamento de serviços de trabalho em um aplicativo.

Privilégios necessários para criar um serviço na conta do consumidor

Para que um aplicativo crie um serviço na conta do consumidor, o consumidor deve primeiro conceder os seguintes privilégios:

  • CREATE COMPUTE POOL

    Este privilégio é necessário para todos os serviços. Um ou mais pools de computação são necessários para criar um serviço na conta do consumidor.

  • BIND SERVICE ENDPOINT

    Este privilégio é necessário para qualquer serviço que exponha pontos de extremidade. Se um serviço precisa fazer conexões com URLs fora do Snowflake, esse privilégio é necessário para que o aplicativo crie a integração de acesso externo necessária.

Considerações ao criar serviços dentro de um aplicativo

As seguintes considerações se aplicam ao criar um serviço dentro de um Snowflake Native App with Snowpark Container Services:

  • Referências a warehouses. Consulte Práticas recomendadas ao usar serviços em um aplicativo para obter informações sobre como usar em um Snowflake Native App with Snowpark Container Services.

  • Nomes entre aspas para um serviço dentro de um aplicativo não são suportados.

  • Os serviços não podem ser criados em um esquema com versão.

  • Os serviços não podem ser criados fora do aplicativo usando uma imagem de contêiner criada dentro do aplicativo.

Use o comando CREATE SERVICE em um aplicativo

Use CREATE SERVICE para criar um serviço de longa duração. No contexto de um aplicativo, os provedores devem sempre considerar chamar esse comando de dentro de um procedimento armazenado em vez de chamá-lo diretamente no script de configuração.

Para criar um serviço, use o comando CREATE SERVICE dentro de um procedimento armazenado. O exemplo a seguir mostra a sintaxe para usar este comando em um aplicativo.

CREATE SERVICE [ IF NOT EXISTS ] <name>
  IN COMPUTE POOL <compute_pool_name>
  {
    fromSpecification
    | fromSpecificationTemplate
  }

fromSpecification ::=
  SPECIFICATION_FILE = '/containers/service1_spec.yaml'

fromSpecificationTemplate ::=
  FROM SPECIFICATION_TEMPLATE_FILE = '/containers/service1_spec.yaml'
  USING ( <key> => <value> [ , <key> => <value> [ , ... ] ]  )
Copy

A cláusula FROM SPECIFICATION_FILE aponta para o arquivo de especificação de serviço específico para uma versão do aplicativo. Este caminho é relativo ao diretório raiz do aplicativo.

Adicione o comando CREATE SERVICE para um procedimento armazenado

Um Snowflake Native Apps with Snowpark Container Services oferece suporte a diversas maneiras de criar um serviço dentro de um procedimento armazenado.

Um provedor pode usar qualquer combinação desses métodos para criar serviços na conta do consumidor.

Criação de um serviço usando a propriedade grant_callback

grant_callback é uma propriedade no arquivo de manifesto que permite que os provedores especifiquem uma função de retorno de chamada. A função de retorno de chamada é um procedimento armazenado que pode criar pools de computação, serviços e executar outras tarefas de configuração exigidas pelo aplicativo.

Nota

Usando a propriedade grant_callback para especificar a função de retorno de chamada é suportada apenas por Snowflake Native Apps with Snowpark Container Services.

A vantagem de especificar uma função de retorno de chamada com grant_callback é que o procedimento armazenado não é chamado até que o consumidor conceda os privilégios necessários ao aplicativo. Isso garante que o aplicativo tenha os privilégios necessários para criar serviços e outros objetos na conta do consumidor.

Para usar grant_callback adicione-o à seção configuration do arquivo manifest.yml:

configuration:
  log_level: INFO
  trace_level: ALWAYS
  grant_callback: core.grant_callback
Copy

Em seguida, no script de configuração, defina uma função de retorno de chamada, conforme mostrado no exemplo a seguir:

 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;
Copy

Este exemplo cria um procedimento grant_callback que faz o seguinte:

  • Testa se o consumidor concedeu o privilégio CREATE COMPUTE POOL ao aplicativo. Se o consumidor tiver concedido esse privilégio, o procedimento grant_callback criará o pool de computação.

  • Testa se o consumidor concedeu o privilégio BIND SERVICE ENDPOINT ao aplicativo. Se o consumidor tiver concedido esse privilégio, o procedimento grant_callback cria o serviço.

Este exemplo mostra um padrão para criar serviços e um pool de computação em um aplicativo com contêineres. Neste exemplo, o aplicativo primeiro testa se o consumidor concedeu os privilégios necessários e, em seguida, cria o serviço ou pool de computação.

Criação de um serviço com base em uma definição de referência

Um aplicativo pode criar serviços usando uma definição de referência usando a propriedade register_callback no arquivo manifest.yml. Esta propriedade especifica um procedimento armazenado usado para vincular um objeto na conta do consumidor à definição de referência.

Para obter mais informações sobre o uso de referências em um aplicativo, consulte Solicitação de referências e privilégios de nível de objeto de consumidores

Um aplicativo pode usar o register_callback da referência para criar um serviço depois que todas as referências necessárias forem vinculadas. Se um serviço for criado antes que todas as referências a integrações de acesso externo ou segredo sejam permitidas, a criação do serviço falhará.

Criação de um serviço usando um procedimento armazenado

Um aplicativo pode criar um serviço diretamente dentro de um procedimento armazenado. Assim como acontece com outros procedimentos armazenados, os provedores podem defini-los no script de configuração do aplicativo. Este procedimento armazenado usaria o comando CREATE SERVICE para criar o serviço e, em seguida, conceder os privilégios necessários no procedimento armazenado para uma função de aplicativo.

O consumidor chamaria esse procedimento armazenado para criar o serviço em sua conta depois de ter concedido ao aplicativo os privilégios e referências necessários.

Como determinar o status de um serviço

Para determinar o status de um serviço, um aplicativo pode chamar a função do sistema SYSTEM$GET_SERVICE_STATUS — Obsoleto a partir do script de configuração.

Esta função do sistema retorna um objeto JSON para cada contêiner em cada instância de serviço.

Práticas recomendadas ao usar serviços em um aplicativo

A seguir estão as práticas recomendadas e considerações ao usar serviços em um Snowflake Native App with Snowpark Container Services:

  • Crie um aplicativo Streamlit ou procedimentos armazenados que permitam que os consumidores interajam com um serviço.

    Em algumas situações, um consumidor pode precisar criar, iniciar, parar, reiniciar e gerenciar os serviços fornecidos pelo aplicativo.

  • Use um único procedimento armazenado para verificar se o consumidor concedeu todos os privilégios necessários.

    Um serviço pode exigir que o consumidor conceda vários privilégios ao aplicativo. Por exemplo, um serviço pode exigir o CREATE COMPUTE POOL, CREATE WAREHOUSE, BIND SERVICE ENDPOINT e outros privilégios. Um aplicativo também pode exigir referência a objetos existentes na conta do consumidor.

    Nesse contexto, a Snowflake recomenda usar um único procedimento armazenado para verificar se todos os pré-requisitos foram atendidos. Depois que os pré-requisitos forem atendidos, esse procedimento armazenado criará o serviço.

  • Se um serviço exigir um warehouse para executar consultas, o aplicativo deverá criar o warehouse diretamente na conta do consumidor. Isto requer que o consumidor conceda o privilégio CREATE WAREHOUSE global para o aplicativo. Consulte Solicitação de privilégios globais dos consumidores para obter mais informações.

  • Ao criar um serviço usando um modelo de especificação, armazene os argumentos fornecidos pelo consumidor dentro da instância do aplicativo. Isso permite que eles sejam passados como argumentos ao atualizar um serviço.