Exemplo: acessar ponto de extremidade externo usando especificações de aplicativo

Este tópico descreve como configurar um Snowflake Native App para conectar-se a um ponto de extremidade externo ao Snowflake. O exemplo mostra como configurar o arquivo de manifesto e o script de configuração de um aplicativo para fazer o seguinte:

Especificar a versão do arquivo de manifesto

Para habilitar a concessão automatizada de privilégios para um aplicativo, defina a versão no início do arquivo de manifesto, conforme mostrado no exemplo a seguir:

manifest_version: 2
Copy

Solicitar o privilégio CREATE EXTERNAL ACCESS INTEGRATION no arquivo de manifesto

O privilégio CREATE EXTERNAL ACCESS INTEGRATION permite que o aplicativo crie uma integração de acesso externo durante a instalação ou atualização. Para solicitar esse privilégio do consumidor, adicione a seguinte entrada ao arquivo de manifesto:

privileges:
  - CREATE EXTERNAL ACCESS INTEGRATION:
      description: "Required to create eai integrations so we can simplify your life"
Copy

O privilégio CREATE EXTERNAL ACCESS INTEGRATION é concedido automaticamente ao aplicativo antes da instalação ou atualização e tem os seguintes benefícios:

  • Os consumidores não precisam criar manualmente a integração de acesso externo exigida pelo aplicativo e aprovar o acesso usando referências.

  • Os provedores não precisam escrever um código que verifica a existência do privilégio CREATE EXTERNAL ACCESS INTEGRATION antes de prosseguir com a criação do objeto durante a instalação ou atualização.

Criar uma regra de rede para integração de acesso externo

Uma integração de acesso externo requer uma regra de rede que defina os pontos de extremidade externos. Por exemplo, para criar uma regra de rede, adicione o comando CREATE NETWORK RULE ao script de configuração do aplicativo:

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

Esse comando cria uma regra de rede que define uma solicitação de saída (saída) para a porta do host example.com.

Criação de uma integração de acesso externo

Depois de criar uma regra de rede no script de configuração, use o comando CREATE EXTERNAL ACCESS INTEGRATION para criar uma integração de acesso externo, conforme 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

Nota

Esse comando cria uma integração de acesso externo na conta do consumidor. No entanto, a integração de acesso externo não pode ser usada até que o consumidor aprove as especificações do aplicativo que permitem o acesso externo para as portas de host solicitadas. Para obter mais informações, consulte Aprovar conexões com recursos externos usando especificações de aplicativo.

Criar uma função definida pelo usuário para acessar o ponto de extremidade externo

Após criar a integração de acesso externo, o script de configuração pode criar funções definidas pelo usuário e procedimentos armazenados que o utilizam para conectar-se aos pontos de extremidade definidos na regra de rede.

O exemplo a seguir mostra uma função definida pelo usuário que usa a integração de acesso externo my_app_prefix_eai_rule.

CREATE OR REPLACE FUNCTION setup.EXTERNAL_ACCESS_UDF(hostname STRING)
  RETURNS STRING
  LANGUAGE JAVA
  HANDLER='TestHostNameLookup.compute'
  EXTERNAL_ACCESS_INTEGRATIONS = (my_app_prefix_eai_rule)
  AS
  '
      import java.net.InetAddress;
      import java.net.UnknownHostException;
      class TestHostNameLookup {{
          public static String compute(String hostname) throws Exception {{
              InetAddress addr = null;
              try {
                  addr = InetAddress.getByName(hostname);
              } catch(UnknownHostException ex) {
                  return "Hostname lookup failed";
              }
              return "Hostname lookup successful";
          }
      }
';
GRANT USAGE ON FUNCTION setup.EXTERNAL_ACCESS_UDF(STRING)
  TO APPLICATION ROLE app_public;
Copy

Essa função define o valor de EXTERNAL_ACCESS_INTEGRATIONS para a integração de acesso externo criada anteriormente.

Essa função utiliza o pacote Java InetAddress para pesquisar o nome de host passado para o procedimento. O nome de host fornecido deve corresponder a um dos valores fornecidos na propriedade VALUE_LIST das regras de rede usadas pela integração de acesso externo.

Criar a especificação de aplicativo

Um aplicativo pode criar uma especificação de aplicativo durante a instalação ou atualização ou em tempo de execução a partir de um procedimento armazenado. O exemplo a seguir mostra como usar o comando ALTER APPLICATION SET SPECIFICATIONS para criar uma especificação de aplicativo:

ALTER APPLICATION SET SPECIFICATION my_app_specification
        TYPE = EXTERNAL_ACCESS
        LABEL = 'An external api'
        DESCRIPTION = 'Used to connect to an external API'
        HOST_PORTS  = 'example.com';
Copy