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

Para permitir o acesso a locais de rede externos específicos, crie uma integração de acesso externo que especifique uma lista de regras de rede que especifique os locais externos e uma lista de segredos que você tem permissão para usar. Ao usar a cláusula EXTERNAL_ACCESS_INTEGRATIONS para se referir a essa integração ao criar a UDF ou o procedimento com CREATE FUNCTION ou CREATE PROCEDURE, você permite que o código do manipulador use o segredo para autenticar no local externo.

Um administrador pode monitorar solicitações feitas a locais de rede externos usando a exibição EXTERNAL_ACCESS_HISTORY.

Para obter uma sequência completa de exemplos de código que você pode usar para configurar e usar o acesso externo, consulte Exemplos de acesso à rede externa.

Use as etapas a seguir para configurar o acesso a um local de rede externo a partir de uma UDF ou procedimento.

  1. Crie uma regra de rede para representar o local da rede externa.

  2. Crie um segredo para manter credenciais.

  3. Crie uma integração de acesso externo, agregando o segredo e a regra de rede para que possam ser utilizados pelo manipulador ao acessar o local externo.

  4. Crie a UDF ou procedimento com o parâmetro EXTERNAL_ACCESS_INTEGRATIONS definido para o nome da integração como valor. Isso dá permissão à função ou ao procedimento para acessar os locais de rede externos e usar as credenciais especificadas pelas regras e segredos da rede na integração.

    Você define separadamente o parâmetro SECRET como o nome de um segredo incluído na integração para ter acesso ao conteúdo do segredo a partir do código do manipulador.

    No código do manipulador de função ou procedimento, acesse o local de rede externo especificado em uma regra de rede incluída na integração. Uma tentativa de acessar um local de rede que não seja especificado por uma regra de rede permitida será negada.

Criação de uma regra de rede para representar o local da rede externa

Você pode usar o comando CREATE NETWORK RULE para criar uma regra de rede que represente a localização da rede externa e as restrições de acesso. Por exemplo, uma regra de rede especifica identificadores de rede, como um nome de host e a direção da comunicação com a rede (entrada ou saída).

Para oferecer suporte ao acesso a uma rede externa, um administrador incluirá a regra ao criar uma integração de acesso externo. Cada regra incluída na integração especifica um local de rede externo que a função ou procedimento tem permissão para acessar.

Ao criar uma regra de rede para uso em uma integração de acesso externo, você especifica o seguinte:

  • EGRESS como o valor do parâmetro MODE.

  • HOST_PORT como o valor do parâmetro TYPE.

  • O ponto de extremidade do local externo no parâmetro VALUE_LIST.

  • (Opcional) Um número de porta com o nome do ponto de extremidade do local externo. Se você omitir um número de porta, o Snowflake usará o número de porta padrão para acesso externo, 443.

    Por exemplo, se o ponto de extremidade exigir a porta 80, o parâmetro VALUE_LIST poderá ser o seguinte:

    VALUE_LIST = ('example.com:80')
    
    Copy

Controle de acesso

Por segurança, o Snowflake exige que, ao criar uma regra de rede, você use uma função que tenha o seguinte:

  • O privilégio CREATE NETWORK RULE no esquema que manterá a regra.

Exemplo

O código no exemplo a seguir cria uma regra de rede chamada google_apis_network_rule para solicitações de saída para a Google Translation API.

CREATE OR REPLACE NETWORK RULE google_apis_network_rule
  MODE = EGRESS
  TYPE = HOST_PORT
  VALUE_LIST = ('translation.googleapis.com');
Copy

Criação de um segredo para representar credenciais

Você pode usar CREATE SECRET para criar um segredo que representa as credenciais necessárias para autenticação no local de rede externo. Por exemplo, o segredo pode conter credenciais como nome de usuário e senha.

Para acessar um local de rede externo compatível com OAuth, uma prática recomendada é fazer com que seu segredo contenha uma referência a uma integração de segurança que contenha valores necessários para o fluxo de OAuth, como um ID do cliente, segredo do cliente, ponto de extremidade do token e assim por diante.

O segredo será usado das seguintes maneiras:

  • Por um administrador ao criar a integração de acesso externo.

    Ao criar a integração, o administrador especificará os segredos que os desenvolvedores podem usar no código do manipulador ao criar uma função ou procedimento que utilize a integração.

  • Por um desenvolvedor ao criar um manipulador de procedimento ou UDF.

    O desenvolvedor especificará o segredo permitido que contém as credenciais que o código do manipulador pode usar para autenticar ao fazer uma solicitação ao local externo. Ao escrever um manipulador, um desenvolvedor pode usar uma API Snowflake para recuperar credenciais contidas no segredo em vez de incluir as credenciais como valores literais no código do manipulador.

Nota

Para um segredo OAuth que requer um token de atualização, você pode obter o token de várias maneiras, inclusive por meio de funções do sistema disponíveis no Snowflake. Para obter um exemplo, consulte Acesso ao Google Translate API.

Controle de acesso

Por segurança, o Snowflake exige que, ao criar um segredo, você use uma função que tenha o seguinte:

  • O privilégio CREATE SECRET no esquema que conterá o segredo.

Exemplo

O código no exemplo a seguir cria um segredo chamado oauth_token que especifica uma integração de segurança (representada por google_translate_oauth) contendo valores necessários para autenticação usando OAuth.

Para obter um exemplo mais completo, incluindo o código para criar a integração de segurança, consulte Exemplos de acesso à rede externa.

CREATE OR REPLACE SECRET oauth_token
  TYPE = OAUTH2
  API_AUTHENTICATION = google_translate_oauth
  OAUTH_REFRESH_TOKEN = 'my-refresh-token';
Copy

Dica

Nesta versão preliminar, você pode especificar TYPE como GENERIC_STRING quando quiser usar uma chave de API apenas como credenciais.

CREATE OR REPLACE SECRET bp_maps_api
  TYPE = GENERIC_STRING
  SECRET_STRING = 'replace-with-your-api-key';
Copy

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

Você pode usar o comando CREATE EXTERNAL ACCESS INTEGRATION para criar uma integração de acesso externo que agregue regras de rede permitidas (representando locais de rede externos) e segredos permitidos (representando credenciais para autenticação) para uso com UDFs e procedimentos.

Em particular, a integração de acesso externo especifica as regras e segredos de rede que as UDFs e os procedimentos que fazem referência à integração podem usar.

A integração de acesso externo será usada por um administrador para gerenciar o acesso a locais de rede externos de UDFs e procedimentos. A integração especifica apenas os locais e credenciais permitidos para uso por UDFs e os procedimentos que fazem referência à integração. Um administrador também pode ativar ou desativar a integração para gerenciar o acesso a locais externos.

Controle de acesso

Por segurança, o Snowflake exige que, ao criar uma integração de acesso externo, você use uma função que tenha o seguinte:

  • O privilégio CREATEINTEGRATION na conta.

  • O privilégio USAGE em qualquer segredo usado pela integração, bem como o privilégio USAGE no esquema do segredo.

Exemplo

O código no exemplo a seguir cria uma integração de acesso externo chamada google_apis_access_integration. A integração especifica a regra de rede google_apis_network_rule (representando o local da rede) e o segredo oauth_token (representando credenciais).

Para obter mais informações sobre esta regra e segredo, consulte Criação de uma regra de rede para representar o local da rede externa e Criação de um segredo para representar credenciais.

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION google_apis_access_integration
  ALLOWED_NETWORK_RULES = (google_apis_network_rule)
  ALLOWED_AUTHENTICATION_SECRETS = (oauth_token)
  ENABLED = true;
Copy

Uso da integração de acesso externo em uma função ou procedimento

Ao usar o comando CREATE FUNCTION ou CREATE PROCEDURE para criar uma UDF ou procedimento, você pode ativar o acesso a locais de rede externos da seguinte forma:

  • Inclua o parâmetro EXTERNAL_ACCESS_INTEGRATIONS, definindo seu valor para uma ou mais integrações.

    Cada integração especificada permite acesso aos locais de rede externos e aos segredos especificados pela integração.

  • Inclua o parâmetro SECRETS, definindo seu valor como um ou mais segredos e os nomes que você usará para acessá-los no código do manipulador.

    Os segredos especificados como valores também devem ser especificados na integração de acesso externo.

  • No código do manipulador, acesse o segredo para recuperar credenciais para autenticação no local de rede externo.

Nota

Sempre use um segredo do Snowflake para representar credenciais em vez de incluir as credenciais como valores literais no código. Além de proteger as credenciais, o uso de um segredo possibilita auditar e gerenciar o uso das credenciais, porque somente aqueles que receberam o privilégio READ no segredo podem usar uma integração que o contenha em uma UDF ou procedimento.

O Snowflake limita o número total de conexões que podem ser feitas a partir de uma UDF específica. Para evitar problemas de esgotamento de recursos, reutilize as conexões tanto quanto possível. Você pode conseguir isso criando o cliente ou a sessão TCP uma vez durante a inicialização da UDF e, em seguida, usando-o no manipulador da UDF para o restante da consulta.

Controle de acesso

Por segurança, o Snowflake exige que, ao criar uma UDF ou procedimento, você use uma função que tenha o seguinte:

  • O privilégio READ em qualquer segredo referenciado, bem como o privilégio USAGE no esquema do segredo.

  • O privilégio USAGE em qualquer integração referenciada.

A exigência desses privilégios permite que um administrador gerencie o conjunto de usuários que podem ativar o acesso externo. Para obter mais informações, consulte GRANT <privilégios> e Privilégios de controle de acesso.

Exemplo

O código no exemplo a seguir cria uma UDF chamada google_translate_python, especificando uma integração de acesso externo chamada google_apis_access_integration (consulte Criação de uma integração de acesso externo para obter detalhes). A integração especifica uma regra de rede (representando um local de rede externo) e um segredo (representando credenciais) que uma UDF que faz referência à integração pode usar. Para obter mais informações sobre esta regra e segredo, consulte Criação de uma regra de rede para representar o local da rede externa e Criação de um segredo para representar credenciais.

O código do manipulador Python usa a função _snowflake.get_oauth_access_token para recuperar o token OAuth do segredo e, em seguida, usa o token para autenticar no local externo. O código do manipulador pode fazer uma solicitação ao URL especificado porque o host desse URL está listado na regra de rede especificada pela integração.

CREATE OR REPLACE FUNCTION google_translate_python(sentence STRING, language STRING)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.8
HANDLER = 'get_translation'
EXTERNAL_ACCESS_INTEGRATIONS = (google_apis_access_integration)
PACKAGES = ('snowflake-snowpark-python','requests')
SECRETS = ('cred' = oauth_token )
AS
$$
import _snowflake
import requests
import json
session = requests.Session()
def get_translation(sentence, language):
  token = _snowflake.get_oauth_access_token('cred')
  url = "https://translation.googleapis.com/language/translate/v2"
  data = {'q': sentence,'target': language}
  response = session.post(url, json = data, headers = {"Authorization": "Bearer " + token})
  return response.json()['data']['translations'][0]['translatedText']
$$;
Copy