Usar especificações de aplicativo para solicitar pontos de extremidade externos dos consumidores

Este tópico descreve como um provedor pode configurar um Snowflake Native App para usar especificações de aplicativo. As especificações de aplicativo permitem que os consumidores aprovem ou rejeitem o acesso de um aplicativo a serviços fora do Snowflake.

Acessar serviços externos de um Snowflake Native App

Alguns Snowflake Native Apps precisam se conectar a recursos que existem fora do Snowflake. O Snowflake fornece diferentes objetos dependendo do tipo de conexão externa necessária.

Ao usar a concessão automatizada de privilégios, um aplicativo tem os privilégios necessários para criar esses objetos ao executar o script de configuração. No entanto, como esses objetos permitem conexões fora do Snowflake, os consumidores devem aprovar essas conexões ao configurar o aplicativo.

As especificações de aplicativo permitem que um provedor especifique quais informações de conexão o aplicativo solicita. Quando o consumidor instala o aplicativo, ele analisa a especificação de aplicativo e aprova ou recusa conforme necessário.

Definição da especificação de aplicativo

Uma definição de especificação de aplicativo é a lista dos detalhes de configuração necessários para uma integração de acesso externo ou integração de segurança. A definição da especificação de aplicativo contém um subconjunto dos metadados e das propriedades de uma especificação de aplicativo.

Acesso a pontos de extremidade externos

Para acessar serviços que estão fora do Snowflake, o Snowflake fornece os seguintes objetos:

Regras de rede:

especificam uma lista de identificadores de rede externa, por exemplo, nomes de host.

Integrações de acesso externo:

permitem acesso seguro a pontos de extremidade de rede externa dentro de uma função definida pelo usuário ou procedimento armazenado. Integrações de acesso externo usam regras de rede para restringir o acesso a locais de rede externos específicos.

Para acessar um ponto de extremidade externo, um aplicativo deve criar uma regra de rede e integração de acesso externo. Uma única especificação de aplicativo se aplica a todas as integrações de acesso externo criadas pelo aplicativo. Os provedores podem criar várias especificações de aplicativo para um aplicativo, mas isso não é necessário.

Definição de especificação de aplicativo para integrações de acesso externo

Para uma integração de acesso externo, a definição de especificação de aplicativo contém as seguintes entradas:

  • HOST_PORTS: uma lista de portas host definidas na regra de rede que o aplicativo requer.

  • PRIVATE_HOST_PORTS: uma lista de portas de host privadas que permite conectividade privada a recursos fora do Snowflake.

Nota

Esses valores devem corresponder aos valores que o aplicativo usa para criar a regra de rede.

Acesso a provedores de autenticação de terceiros

Para implementar um serviço de autenticação de terceiros, o Snowflake fornece integrações de segurança. Uma integração de segurança permite que um aplicativo se conecte a um serviço de autenticação de terceiros, como o OAuth. As integrações de segurança permitem que um aplicativo use autenticação e controle de acesso seguros.

Nota

Os Snowflake Native Apps só oferecem suporte a integrações de segurança do tipo API_AUTHENTICATION. Para obter mais informações, consulte CREATE SECURITY INTEGRATION (Autenticação de API externa).

Definição da especificação de aplicativo para integrações de segurança

Para uma integração de segurança, a definição da especificação de aplicativo inclui as informações necessárias para se conectar a um provedor de terceiros. Para o OAuth, a definição da especificação de aplicativo inclui:

Tipo de integração de segurança

Valores definidos na especificação de aplicativo

CLIENT_CREDENTIALS

  • OAUTH_TOKEN_ENDPOINT (obrigatório)

  • OAUTH_ALLOWED_SCOPES (obrigatório)

Os números sequenciais de uma especificação de aplicativo

O número sequencial é semelhante a um número de versão para a especificação de aplicativo. Os números sequenciais são incrementados automaticamente quando um provedor altera a definição da especificação de aplicativo. A definição de uma especificação de aplicativo inclui detalhes de configuração e outras informações necessárias. Os campos que não fazem parte da definição, como description, não acionam uma atualização para o número sequencial.

Os números sequenciais permitem que provedores e consumidores saibam o status atual da especificação de aplicativo e quais pontos de extremidade externos foram ativados.

Fluxo de trabalho de especificação de aplicativos

O fluxo de trabalho geral para configurar e usar uma especificação de aplicativo é o seguinte:

  1. Os provedores configuram a concessão automatizada de privilégios para o aplicativo. Isso permite que os consumidores deem permissão a um aplicativo para criar a integração de acesso externo.

    Nota

    As especificações de aplicativo exigem que manifest_version = 2 seja definido no arquivo de manifesto.

  2. Os provedores adicionam o privilégio CREATE EXTERNAL ACCESS INTEGRATION ao arquivo de manifesto.

  3. Os provedores adicionam instruções SQL ao script de configuração para criar os seguintes objetos, conforme necessário:

    O script de configuração cria a especificação de aplicativo e outros objetos quando o aplicativo é instalado ou atualizado, ou está no tempo de execução.

  4. Ao configurar o aplicativo, os consumidores aprovam as portas do host e outros serviços externos. Para obter mais informações, consulte Aprovar conexões com recursos externos usando especificações de aplicativo.

Adicionar o privilégio CREATE EXTERNAL ACCESS INTEGRATION ao arquivo de manifesto

Para configurar um aplicativo para solicitar o privilégio CREATE EXTERNAL ACCESS INTEGRATION, adicione o seguinte código à seção privileges do arquivo de manifesto:

manifest_version: 2
...
privileges:
  - CREATE EXTERNAL ACCESS INTEGRATION:
      description: "Allows the app to create an external access integration to connect to an external service."
...
Copy

Esta entrada na seção privileges do arquivo de manifesto especifica que o aplicativo usa uma integração de acesso externo. Para que o aplicativo use a concessão automatizada de privilégios, o arquivo de manifesto também requer a definição de manifest_version: 2.

Adicionar uma regra de rede e integração de acesso externo ao script de configuração

Integrações de acesso externo são os objetos Snowflake que permitem o acesso a locais de rede externos específicos. As integrações de acesso externo contêm uma lista de regras de rede que especificam os locais externos que um aplicativo pode acessar.

Para criar uma regra de rede para um aplicativo, adicione o comando CREATE NETWORK RULE ao script de configuração, como mostrado no exemplo a seguir:

CREATE OR REPLACE NETWORK RULE setup.my_network_rule
 TYPE = HOST_PORT
 VALUE_LIST = ( 'example.com' )
 MODE = EGRESS;
Copy

As propriedades HOST_PORT e VALUE_LIST indicam que a regra de rede deve apontar para um domínio, porta ou intervalo de portas válido. Quando um aplicativo é instalado ou atualizado, um consumidor concederá permissão para o aplicativo usar esses domínios ou portas.

Para criar uma integração de acesso externo para um aplicativo, adicione o comando CREATE EXTERNAL ACCESS INTEGRATION ao script de configuração, como mostrado no exemplo a seguir:

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION my_app_prefix_eai_rule
  ALLOWED_NETWORK_RULES = (setup.my_network_rule)
  ENABLED = TRUE;
Copy

Esse comando cria uma integração de acesso externo chamada my_app_prefix_eai_rule que permite que o aplicativo acesse recursos externos ou pontos de extremidade. Ele usa a regra de rede setup.my_network_rule.

Adicionar uma integração de segurança ao script de configuração

As integrações de segurança permitem que um aplicativo se conecte a um serviço de autenticação de terceiros, como o OAuth. Use o comando CREATE SECURITY INTEGRATION (Autenticação de API externa) para criar uma integração de segurança para um aplicativo, como mostrado no exemplo a seguir:

CREATE SECURITY INTEGRATION external_oauth_provider
  TYPE = API_AUTHENTICATION
  AUTH_TYPE = OAUTH2
  OAUTH_CLIENT_AUTH_METHOD = CLIENT_SECRET_POST
  OAUTH_CLIENT_ID = 'YOUR_CLIENT_ID'
  OAUTH_CLIENT_SECRET = 'YOUR_CLIENT_SECRET'
  OAUTH_GRANT = 'CLIENT_CREDENTIALS'
  OAUTH_TOKEN_ENDPOINT = 'https://login.microsoftonline.com/YOUR_TENANT_ID/oauth2/v2.0/token'
  OAUTH_ALLOWED_SCOPES = ('https://graph.microsoft.com/.default')
  ENABLED = TRUE;
Copy

Este exemplo mostra como criar uma integração de segurança para se conectar ao Microsoft Sharepoint usando o OAuth com credenciais do cliente. Consulte outros métodos aceitos para conexão com um provedor do OAuth em CREATE SECURITY INTEGRATION (Autenticação de API externa).

Criação de uma especificação de aplicativo no script de configuração

Para criar a especificação de aplicativo, os provedores adicionam o comando ALTER APPLICATION SET SPECIFICATIONS ao script de configuração.

Criar uma especificação de aplicativo para uma integração de acesso externo

O exemplo a seguir mostra como criar uma especificação de aplicativo para uma integração:

ALTER APPLICATION SET SPECIFICATION eai_app_spec
        TYPE = EXTERNAL_ACCESS
        LABEL = 'Connection to an external API'
        DESCRIPTION = 'Access an API that exists outside Snowflake'
Copy

Esse comando cria uma especificação de aplicativo chamada eai_app_spec.

Criar uma especificação de aplicativo para uma integração de segurança

O exemplo a seguir mostra como criar uma especificação de aplicativo para uma integração de segurança usando o tipo CLIENT_CREDENTIALS OAuth:

ALTER APPLICATION SET SPECIFICATION oauth_app_spec
  TYPE = SECURITY_INTEGRATION
  LABEL = 'Connection to an external OAuth provider'
  DESCRIPTION = 'Integrates an external identity provider in the app'
  OAUTH_TYPE = 'CLIENT_CREDENTIALS'
  OAUTH_TOKEN_ENDPOINT = 'https://login.microsoftonline.com/YOUR_TENANT_ID/oauth2/v2.0/token'
  OAUTH_ALLOWED_SCOPES = ('https://graph.microsoft.com/.default');
Copy

Nota

Os valores que você fornece ao criar a especificação de aplicativo devem ser os mesmos que você usa na criação da integração de segurança no script de configuração.

Para obter informações sobre o uso de outros tipos de OAuth, consulte ALTER APPLICATION SET SPECIFICATIONS.

Práticas recomendadas para usar especificações de aplicativo

A concessão automatizada de privilégios garante que o aplicativo tenha os privilégios necessários para criar integrações de acesso externo. No entanto, os consumidores podem optar por recusar a especificação de aplicativo que permite a conexão com os pontos de extremidade externos. Ao desenvolver um aplicativo, os provedores devem levar em conta situações em que as especificações de aplicativo podem não ser aprovadas

Por exemplo, um aplicativo pode solicitar o uso de várias portas de rede para uma integração de acesso externo, mas o consumidor pode permitir apenas uma. O aplicativo deve incluir lógica para lidar com erros que ocorrem se uma porta de rede não estiver disponível. Além disso, é uma prática recomendada capturar quaisquer exceções HTTP que possam ocorrer.

Uso de funções de retorno de chamada com especificações de aplicativo

Em alguns contextos, um aplicativo pode precisar saber quando o consumidor aprovou ou recusou uma especificação de aplicativo. Por exemplo, o aplicativo pode precisar aguardar até que uma especificação de aplicativo seja aprovada antes de criar um objeto.

Para lidar com essa situação, o Snowflake Native App Framework fornece um mecanismo que permite ao provedor definir um procedimento armazenado de retorno de chamada que é executado quando o consumidor aprova ou recusa uma especificação de aplicativo.

Os provedores podem adicionar um procedimento armazenado ao arquivo de manifesto, conforme mostrado no exemplo a seguir:

lifecycle_callbacks:
  specification_action: callbacks.on_spec_update
Copy

Esse exemplo mostra como adicionar um procedimento armazenado chamado callbacks.on_spec_update ao arquivo de manifesto. Os provedores podem adicionar um procedimento armazenado ao script, como mostrado no exemplo a seguir:

CREATE OR REPLACE PROCEDURE callbacks.on_spec_update (
  name STRING,
  status STRING,
  payload STRING)
  ...
Copy

Este exemplo mostra a assinatura de um procedimento armazenado chamado callbacks.on_spec_update. No corpo desse procedimento, os provedores incluem o código necessário para verificar o status da especificação de aplicativo, criar objetos e executar ações conforme necessário.