Configuração de um contêiner Azure para carregamento de dados

Este tópico descreve como configurar o acesso seguro aos arquivos de dados armazenados em um contêiner Microsoft Azure.

As seguintes opções são suportadas:

Opção 1

Configure um objeto de integração de armazenamento para delegar a responsabilidade de autenticação do armazenamento externo em nuvem a uma entidade de segurança do serviço Azure. Uma entidade de segurança de serviço é uma identidade criada para uso com serviços como o Snowflake para acessar os recursos do Azure.

Nota

  • Recomendamos fortemente esta opção, que evita a necessidade de fornecer um token SAS ao criar estágios ou carregar dados.

  • O acesso ao armazenamento Azure blob em regiões governamentais usando uma integração de armazenamento está limitado a contas Snowflake hospedadas no Azure na mesma região governamental. Há suporte para o acesso ao seu armazenamento blob a partir de uma conta hospedada fora da região governamental utilizando credenciais diretas.

Opção 2

Gere um token de assinatura de acesso compartilhado (SAS) para conceder ao Snowflake acesso limitado a objetos em sua conta de armazenamento. Você pode então acessar um estágio externo (Azure) que faz referência ao contêiner usando o token SAS.

Nota

Para completar as instruções neste tópico é necessário o acesso administrativo ao Azure. Se você não é um administrador Azure, peça a seu administrador Azure para realizar essas tarefas.

Neste tópico:

Opção 1: Configuração de uma integração de armazenamento do Snowflake

Esta seção descreve como usar integrações de armazenamento para permitir que o Snowflake leia e grave dados em um contêiner Azure referenciado em um estágio externo (Azure). As integrações são objetos Snowflake nomeados e de primeira classe que evitam a necessidade de passar credenciais explícitas de provedores de nuvens, tais como chaves secretas ou tokens de acesso. Os objetos de integração armazenam uma ID de usuário de gerenciamento de identidade e acesso do Azure (IAM) chamada registro de aplicativo. Um administrador em sua organização concede a esse aplicativo as permissões necessárias na conta Azure.

Uma integração também deve especificar contêineres (e caminhos opcionais) que limitam os locais que os usuários podem especificar ao criar estágios externos que utilizam a integração.

Nota

Para completar as instruções desta seção, é necessário obter permissões no Azure para gerenciar as contas de armazenamento. Se você não é um administrador Azure, peça a seu administrador Azure para realizar essas tarefas.

Nesta seção:

Etapa 1: Criar uma integração de armazenamento em nuvem no Snowflake

Crie uma integração de armazenamento usando o comando CREATE STORAGE INTEGRATION. Uma integração de armazenamento é um objeto Snowflake que armazena uma entidade de segurança de serviço gerada para seu armazenamento em nuvem Azure, juntamente com um conjunto opcional de locais de armazenamento permitidos ou bloqueados (ou seja, contêineres). Os administradores do provedor de nuvem em sua organização concedem permissões para os locais de armazenamento à entidade de segurança de serviço gerada. Esta opção permite que os usuários evitem fornecer credenciais ao criar estágios ou carregar dados.

Uma única integração de armazenamento pode oferecer suporte a múltiplos estágios externos (ou seja, Azure). O URL na definição do estágio deve estar alinhado aos contêineres Azure (e caminhos opcionais) especificados para o parâmetro STORAGE_ALLOWED_LOCATIONS.

Nota

Somente administradores de conta (usuários com a função ACCOUNTADMIN) ou uma função com o privilégio global CREATE INTEGRATION podem executar este comando SQL.

CREATE STORAGE INTEGRATION <integration_name>
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'AZURE'
  ENABLED = TRUE
  AZURE_TENANT_ID = '<tenant_id>'
  STORAGE_ALLOWED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/') ]
Copy

Onde:

  • integration_name é o nome da nova integração.

  • tenant_id é a ID de seu locatário do Office 365 ao qual pertencem as contas de armazenamento permitidas e bloqueadas. Uma integração de armazenamento pode autenticar a somente um locatário e, portanto, os locais de armazenamento permitidos e bloqueados devem se referir às contas de armazenamento que pertencem a este locatário.

    Para encontrar sua ID de locatário, entre no portal Azure e clique em Azure Active Directory » Properties. A ID do locatário é exibida no campo Tenant ID.

  • container é o nome de um contêiner Azure que armazena seus arquivos de dados (por exemplo, mycontainer). Os parâmetros STORAGE_ALLOWED_LOCATIONS e STORAGE_BLOCKED_LOCATIONS permitem ou bloqueiam o acesso a esses contêineres, respectivamente, quando estágios que fazem referência a essa integração são criados ou modificados.

  • path é um caminho opcional que pode ser usado para fornecer controle granular sobre diretórios lógicos no contêiner.

O exemplo a seguir cria uma integração que limita explicitamente os estágios externos que utilizam a integração para fazer referência a um de dois contêineres ou caminhos. Em uma etapa posterior, criaremos um estágio externo que referencia um desses contêineres e caminhos. Os múltiplos estágios externos que utilizam essa integração podem fazer referência aos contêineres e caminhos permitidos:

CREATE STORAGE INTEGRATION azure_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'AZURE'
  ENABLED = TRUE
  AZURE_TENANT_ID = 'a123b4c5-1234-123a-a12b-1a23b45678c9'
  STORAGE_ALLOWED_LOCATIONS = ('azure://myaccount.blob.core.windows.net/mycontainer1/mypath1/', 'azure://myaccount.blob.core.windows.net/mycontainer2/mypath2/')
  STORAGE_BLOCKED_LOCATIONS = ('azure://myaccount.blob.core.windows.net/mycontainer1/mypath1/sensitivedata/', 'azure://myaccount.blob.core.windows.net/mycontainer2/mypath2/sensitivedata/');
Copy

Etapa 2: Conceder ao Snowflake acesso aos locais de armazenamento

  1. Execute o comando DESCRIBE INTEGRATION para recuperar o URL de consentimento:

    DESC STORAGE INTEGRATION <integration_name>;
    
    Copy

    Onde:

Observe os valores nas colunas seguintes:

AZURE_CONSENT_URL

URL para a página de solicitação de permissões da Microsoft.

AZURE_MULTI_TENANT_APP_NAME

Nome do aplicativo cliente do Snowflake criado para sua conta. Em uma etapa posterior desta seção, você precisará conceder a este aplicativo as permissões necessárias para obter um token de acesso para seus locais de armazenamento permitidos.

  1. Em um navegador da Web, navegue até o URL na coluna AZURE_CONSENT_URL. A página exibe uma página de solicitação de permissões da Microsoft.

  2. Clique no botão Accept. Esta ação permite que a entidade de segurança do serviço Azure criada para sua conta Snowflake tenha um token de acesso em recursos específicos dentro de seu locatário. A obtenção de um token de acesso só tem sucesso se você conceder à entidade de segurança de serviço as permissões apropriadas sobre o contêiner (consulte a próxima etapa).

    A página de solicitações de permissão da Microsoft é redirecionada para o site corporativo da Snowflake (snowflake.com).

  3. Faça login no portal do Microsoft Azure.

  4. Navegue até Azure Services » Storage Accounts. Clique no nome da conta de armazenamento à qual você está concedendo acesso à entidade de segurança do serviço Snowflake.

  5. Clique em Access Control (IAM) » Add role assignment.

  6. Selecione a função desejada para conceder à entidade de segurança do serviço Snowflake:

    • Storage Blob Data Reader concede acesso somente leitura. Isso permite o carregamento de dados de arquivos preparados na conta de armazenamento.

    • Storage Blob Data Contributor concede acesso para leitura e gravação. Isso permite carregar ou descarregar dados de ou para arquivos preparados na conta de armazenamento. A função também permite executar o comando REMOVE para remover arquivos preparados na conta de armazenamento.

  7. Pesquise a entidade de segurança do serviço Snowflake. Esta é a identidade na propriedade AZURE_MULTI_TENANT_APP_NAME na saída DESC STORAGE INTEGRATION (na Etapa 1). Pesquise a cadeia de cadeia de caracteres antes do sublinhado na propriedade AZURE_MULTI_TENANT_APP_NAME.

    Importante

    • Pode levar uma hora ou mais para que o Azure crie a entidade de segurança do serviço Snowflake solicitada por meio da página de solicitação da Microsoft nesta seção. Se a entidade de segurança de serviço não estiver disponível imediatamente, recomendamos esperar uma ou duas horas e depois procurar novamente.

    • Se você excluir a entidade de segurança do serviço, a integração de armazenamento deixa de funcionar.

    Add role assignment in Azure Storage Console
  8. Clique no botão Review + assign.

    Nota

    • De acordo com a documentação do Microsoft Azure, as atribuições de funções podem levar até cinco minutos para se propagar.

    • O Snowflake armazena em cache as credenciais temporárias por um período que não pode exceder o tempo de expiração de 60 minutos. Se você revogar o acesso do Snowflake, os usuários podem ser capazes de listar arquivos e carregar dados a partir do local de armazenamento em nuvem até que o cache expire.

Etapa 3: Criar um estágio externo

Crie um estágio externo (Azure) que faça referência à integração de armazenamento que você criou na Etapa 1: Criar uma integração de armazenamento em nuvem no Snowflake (neste tópico).

Nota

  • Criar um estágio que utilize uma integração de armazenamento requer uma função que tenha o privilégio CREATE STAGE para o esquema, bem como o privilégio USAGE sobre a integração de armazenamento. Por exemplo:

    GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;
    
    GRANT USAGE ON INTEGRATION azure_int TO ROLE myrole;
    
    Copy
  • Para fazer referência a uma integração de armazenamento na instrução CREATE STAGE, a função deve ter o privilégio USAGE para o objeto de integração de armazenamento.

  • Coloque uma barra (/) no valor do URL para filtrar o caminho de pasta especificado. Se a barra for omitida, todos os arquivos e pastas começando com o prefixo para o caminho especificado serão incluídos.

    Note que a barra é obrigatória para acessar e recuperar arquivos de dados não estruturados no estágio.

Crie o estágio usando o comando CREATE STAGE.

Por exemplo, defina mydb.public como o esquema e banco de dados atual para a sessão do usuário e depois crie um estágio chamado my_azure_stage. Neste exemplo, o estágio faz referência ao contêiner Azure e ao caminho mycontainer1/path1, que são compatíveis com a integração. O estágio também faz referência a um objeto de formato de arquivo nomeado chamado my_csv_format:

USE SCHEMA mydb.public;

CREATE STAGE my_azure_stage
  STORAGE_INTEGRATION = azure_int
  URL = 'azure://myaccount.blob.core.windows.net/container1/path1'
  FILE_FORMAT = my_csv_format;
Copy

Nota

  • O proprietário do estágio (ou seja, a função com o privilégio OWNERSHIP no estágio) deve ter o privilégio USAGE sobre a integração de armazenamento.

  • Para carregar ou descarregar dados de ou para um estágio que utiliza uma integração, uma função deve ter o privilégio USAGE sobre o estágio. Não é necessário ter também o privilégio USAGE sobre a integração de armazenamento.

  • Use o ponto de extremidade blob.core.windows.net para todos os tipos com suporte de contas de armazenamento de blobs Azure, incluindo Data Lake Storage Gen2.

  • O parâmetro STORAGE_INTEGRATION é tratado separadamente de outros parâmetros de estágio, tais como FILE_FORMAT. O suporte para esses outros parâmetros é o mesmo, independentemente da integração utilizada para acessar seu contêiner Azure.

Opção 2: Geração de um token SAS

Etapa 1: Gerar o token SAS

As seguintes instruções passo a passo descrevem como gerar um token SAS para conceder ao Snowflake acesso limitado a objetos em sua conta de armazenamento:

  1. Faça login no portal Azure.

  2. No painel inicial, escolha Storage Accounts » <storage_account>. Em Security + networking, escolha Shared access signature.

    Storage Account Details in Azure Storage Console
  3. Selecione o seguinte Serviços permitidos:

    • Blob

  4. Selecione o seguinte Tipos de recursos permitidos:

    • Container (necessário para listar objetos na conta de armazenamento)

    • Object (necessário para ler/gravar objetos de/para a conta de armazenamento)

  5. Selecione as seguintes permissões permitidas para carregar arquivos de dados dos recursos Azure:

    • Leitura

    • Lista

    As permissões Write, Add e Create também são necessárias se você planeja descarregar arquivos para um contêiner. Além disso, para usar a opção PURGE = TRUE, é necessária a permissão Permanent Delete.

  6. Especifique as datas/horas de início e expiração do token SAS. Como parte de um plano de segurança geral, você pode gerar um token SAS diferente periodicamente.

  7. Deixe em branco o campo Endereços IP permitidos e especifique HTTPS only ou HTTPS and HTTP sob Allowed protocols.

    Shared Access Signature Details in Azure Storage Console
  8. Clique no botão Generate SAS and connection string. Registre o valor completo no campo SAS token, começando com e incluindo ?. Este é seu token SAS. Você especificará esse token quando criar um estágio externo.

Etapa 2: Criar um estágio externo

Crie um estágio externo (Azure) que faça referência ao token SAS gerado em Etapa 1: Gerar o token SAS (neste tópico).

O exemplo a seguir usa SQL para criar um estágio externo chamado my_azure_stage que inclui as credenciais Azure e uma chave mestra de criptografia. O estágio URL faz referência à conta Azure myaccount. Os arquivos de dados são armazenados no contêiner mycontainer e no caminho /load/files. O estágio faz referência a um objeto de formato de arquivo nomeado chamado my_csv_format. Observe que o exemplo trunca o valor MASTER_KEY:

CREATE OR REPLACE STAGE my_azure_stage
  URL='azure://myaccount.blob.core.windows.net/mycontainer/load/files'
  CREDENTIALS=(AZURE_SAS_TOKEN='?sv=2016-05-31&ss=b&srt=sco&sp=rwdl&se=2018-06-27T10:05:50Z&st=2017-06-27T02:05:50Z&spr=https,http&sig=bgqQwoXwxzuD2GJfagRg7VOS8hzNr3QLT7rhS8OFRLQ%3D')
  ENCRYPTION=(TYPE='AZURE_CSE' MASTER_KEY = 'kPx...')
  FILE_FORMAT = my_csv_format;
Copy

Observe que os valores AZURE_SAS_TOKEN e MASTER_KEY utilizados neste exemplo são apenas para fins ilustrativos.

Nota

Ao especificar um objeto de formato de arquivo nomeado (ou opções individuais de formato de arquivo) para o estágio, não é necessário especificar posteriormente as mesmas opções de formato de arquivo no comando COPY usado para carregar dados do estágio. Para obter mais informações sobre os objetos de formato de arquivo e opções, consulte CREATE FILE FORMAT.

Criptografia de arquivos de dados

Habilite o Azure Storage Service Encryption (SSE) para dados em repouso diretamente em sua conta de armazenamento e o Snowflake tratará os dados corretamente. Para obter mais informações, consulte a documentação do Azure no SSE.

Além disso, o Snowflake oferece suporte à criptografia do lado do cliente para descriptografar arquivos preparados em contêineres Azure.

  • Criptografia do lado do cliente:

    • AZURE_CSE: Exige um valor MASTER_KEY. Para obter mais informações, consulte as informações sobre criptografia do lado do cliente na documentação do Microsoft Azure.

      Nota

      Blobs de bloco e blobs de anexação são compatíveis com criptografia do lado do cliente, mas blobs de página não são compatíveis.

Próximo: Criação de um estágio Azure