Atualização automática de tabelas externas para Amazon S3

Este tópico fornece instruções para criar tabelas externas e atualizar os metadados de tabelas externas automaticamente usando notificações Amazon SQS (Simple Queue Service) para um bucket S3. Esta operação sincroniza os metadados com o mais recente conjunto de arquivos associados no estágio externo e caminho, ou seja:

  • Novos arquivos no caminho são adicionados aos metadados da tabela.

  • As mudanças nos arquivos do caminho são atualizadas nos metadados da tabela.

  • Os arquivos que não estão mais no caminho são removidos dos metadados da tabela.

Nota

  • Este recurso é limitado às contas Snowflake na AWS.

  • Para executar as tarefas descritas neste tópico, você deve usar uma função que tenha o privilégio CREATE STAGE e CREATE EXTERNAL TABLEpara um esquema.

    Além disso, você deve ter acesso administrativo à AWS. Se você não for um administrador AWS, peça a seu administrador AWS que complete os passos necessários para configurar as notificações de eventos AWS.

  • A Snowflake recomenda que você envie apenas eventos suportados para tabelas externas para reduzir custos, ruído de eventos e latência.

Neste tópico:

Limitações da atualização automática de tabelas externas com Amazon SQS

  • Clientes Virtual Private Snowflake (VPS) e AWS PrivateLink: o Amazon SQS não tem suporte pela AWS como um ponto de extremidade VPC. Embora serviços AWS dentro de um VPC (incluindo VPS) possam se comunicar com SQS, este tráfego não está dentro do VPC e, portanto, não é protegido pelo VPC.

  • Notificações SQS avisam o Snowflake quando novos arquivos chegam em buckets S3 monitorados e estão prontos para serem carregados. As notificações SQS contêm o evento S3 e uma lista dos nomes dos arquivos. Elas não incluem os dados reais nos arquivos.

Suporte para a plataforma de nuvem

O disparo de atualizações automatizadas de metadados externos usando mensagens de eventos do S3 tem suporte apenas por contas Snowflake hospedadas na Amazon Web Services (AWS).

Configuração de acesso seguro ao armazenamento em nuvem

Nota

Se você já tiver configurado o acesso seguro ao bucket S3 que armazena seus arquivos de dados, pode pular esta seção.

Esta seção descreve como usar as integrações de armazenamento para permitir que o Snowflake leia e grave dados em um bucket Amazon S3 referenciado em um estágio externo (ou seja, S3). 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 (IAM) da AWS. Um administrador em sua organização concede ao usuário IAM da integração permissões na conta AWS.

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

Nota

  • Completar as instruções nesta seção requer permissões na AWS para criar e gerenciar políticas e funções de IAM. Se você não for um administrador AWS, peça a seu administrador AWS que complete estas tarefas.

  • Observe que, atualmente, o acesso ao armazenamento S3 em regiões governamentais usando uma integração de armazenamento está limitado a contas Snowflake hospedadas na AWS na mesma região governamental. Há suporte para o acesso ao seu armazenamento S3 a partir de uma conta hospedada fora da região governamental usando credenciais diretas.

O diagrama a seguir mostra o fluxo de integração para um estágio S3:

Amazon S3 Stage Integration Flow
  1. Um estágio externo (ou seja, S3) faz referência a um objeto de integração de armazenamento em sua definição.

  2. O Snowflake associa automaticamente a integração do armazenamento com um usuário IAM do S3 criado para sua conta. O Snowflake cria um único usuário IAM que é referenciado por todas as integrações de armazenamento S3 em sua conta Snowflake.

  3. Um administrador AWS em sua organização concede permissões ao usuário IAM para acessar o bucket referenciado na definição do estágio. Observe que muitos objetos de preparação externo podem fazer referência a diferentes buckets e caminhos e usar a mesma integração de armazenamento para autenticação.

Quando um usuário carrega ou descarrega dados de ou para um estágio, o Snowflake verifica as permissões concedidas ao usuário IAM no bucket antes de permitir ou negar o acesso.

Nota

Recomendamos esta opção, o que evita a necessidade de fornecer credenciais IAM ao acessar o armazenamento em nuvem. Consulte Configuração de acesso seguro ao Amazon S3 para opções adicionais de acesso ao armazenamento.

Nesta seção:

Etapa 1: Configurar permissões de acesso para o bucket S3

Requisitos de controle de acesso da AWS

O Snowflake requer as seguintes permissões em um bucket S3 e pasta para poder acessar os arquivos na pasta (e subpastas):

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

Como prática recomendada, a Snowflake recomenda a criação de uma política IAM para o acesso do Snowflake ao bucket S3. Você pode então anexar a política à função e usar as credenciais de segurança geradas pela AWS para a função para acessar os arquivos no bucket.

Criação de uma política IAM

As seguintes instruções passo a passo descrevem como configurar as permissões de acesso para o Snowflake em seu Console de gerenciamento AWS para que você possa acessar seu bucket S3.

  1. Faça login no Console de gerenciamento AWS.

  2. No painel inicial, escolha Identity & Access Management (IAM):

    Identity & Access Management in AWS Management Console
  3. Escolha Account settings no painel de navegação à esquerda.

  4. Expanda a lista Security Token Service Regions, encontre a região AWS correspondente à região onde sua conta está localizada e escolha Activate se o status for Inactive.

  5. Escolha Policies no painel de navegação à esquerda.

  6. Clique em Create Policy:

    Create Policy button on Policies page
  7. Clique na guia JSON.

  8. Adicione um documento de política que permitirá ao Snowflake acessar o bucket S3 e a pasta.

    A seguinte política (em formato JSON) fornece ao Snowflake as permissões necessárias para carregar ou descarregar dados usando um único bucket e caminho de pasta.

    Copie e cole o texto no editor de políticas:

    Nota

    • Certifique-se de substituir bucket e prefix pelo nome real do bucket e prefixo do caminho da pasta.

    • Os Nomes de recurso da Amazon (ARN) para buckets em regiões governamentais têm um prefixo arn:aws-us-gov:s3:::.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                  "s3:GetObject",
                  "s3:GetObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation"
                ],
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    
    Copy

    Nota

    Definir a condição "s3:prefix": como ["*"] ou ["<caminho>/*"] concede acesso a todos os prefixos no bucket ou caminho no bucket especificado, respectivamente.

    Observe que as políticas AWS oferecem suporte a uma variedade de diferentes casos de uso de segurança.

  9. Clique em Review policy.

  10. Digite o nome da política (por exemplo, snowflake_access) e uma descrição opcional. Clique em Create policy.

    Create Policy button in Review Policy page

Etapa 2: Crie a função IAM na AWS

No Console de gerenciamento AWS, crie uma função AWS IAM para conceder privilégios para o bucket S3 que contém seus arquivos de dados.

  1. Faça login no Console de gerenciamento AWS.

  2. No painel inicial, escolha Identity & Access Management (IAM):

    Identity & Access Management in AWS Management Console
  3. Escolha Roles no painel de navegação à esquerda.

  4. Clique no botão Create role.

    Select Trusted Entity Page in AWS Management Console
  5. Selecione Another AWS account como o tipo de entidade confiável.

  6. No campo Account ID, digite temporariamente sua própria ID de conta AWS. Mais tarde, você modificará a relação de confiança e concederá acesso ao Snowflake.

  7. Selecione a opção Require external ID. Insira uma ID fictícia, como 0000. Mais tarde, você modificará a relação de confiança e especificará a ID externa para seu estágio do Snowflake. É necessário uma ID externa para conceder acesso a seus recursos AWS (ou seja, S3) a um terceiro (ou seja, Snowflake).

  8. Clique no botão Next.

  9. Localize a política que você criou na etapa 1: Configurar permissões de acesso para o bucket S3 (neste tópico) e selecione esta política.

  10. Clique no botão Next.

    Review Page in AWS Management Console
  11. Digite um nome e descrição para a função e clique no botão Create role.

    Agora você criou uma política IAM para um bucket, criou uma função IAM e anexou a política à função.

  12. Registre o valor Role ARN localizado na página de resumo de funções. Na próxima etapa, você criará uma integração do Snowflake que faz referência a essa função.

    IAM Role

Nota

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 conseguir listar arquivos e acessar dados a partir do local de armazenamento em nuvem até que o cache expire.

Etapa 3: 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 um usuário gerado de gerenciamento de identidade e acesso (IAM) para seu armazenamento em nuvem S3, junto com um conjunto opcional de locais de armazenamento permitidos ou bloqueados (ou seja, buckets). Os administradores do provedor de nuvem em sua organização concedem permissões para os locais de armazenamento ao usuário gerado. 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, S3). A URL na definição do estágio deve estar alinhada com os buckets S3 (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 = 'S3'
  ENABLED = TRUE
  STORAGE_AWS_ROLE_ARN = '<iam_role>'
  STORAGE_ALLOWED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/') ]
Copy

Onde:

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

  • iam_role é o nome do recurso Amazon (ARN) da função que você criou em Etapa 2: Criar a função IAM na AWS (neste tópico).

  • bucket é o nome de um bucket S3 que armazena seus arquivos de dados (por exemplo, mybucket). O parâmetro STORAGE_ALLOWED_LOCATIONS obrigatório e o parâmetro STORAGE_BLOCKED_LOCATIONS opcional restringem ou bloqueiam o acesso a estes buckets, respectivamente, quando os estágios que fazem referência a esta integração são criados ou modificados.

  • path é um caminho opcional que pode ser usado para proporcionar um controle granular sobre objetos no bucket.

O exemplo a seguir cria uma integração que limita explicitamente os estágios externos que utilizam a integração para referenciar um de dois buckets ou caminhos. Em uma etapa posterior, criaremos um estágio externo que referencia um desses buckets e caminhos.

Os estágios externos adicionais que também utilizam esta integração podem fazer referência aos buckets e caminhos permitidos:

CREATE STORAGE INTEGRATION s3_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'S3'
  ENABLED = TRUE
  STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::001234567890:role/myrole'
  STORAGE_ALLOWED_LOCATIONS = ('s3://mybucket1/mypath1/', 's3://mybucket2/mypath2/')
  STORAGE_BLOCKED_LOCATIONS = ('s3://mybucket1/mypath1/sensitivedata/', 's3://mybucket2/mypath2/sensitivedata/');
Copy

Etapa 4: Recuperar o usuário AWS IAM para sua conta Snowflake

  1. Execute o comando DESCRIBE INTEGRATION para recuperar o ARN para o usuário AWS IAM que foi criado automaticamente para sua conta Snowflake:

    DESC INTEGRATION <integration_name>;
    
    Copy

    Onde:

    Por exemplo:

    DESC INTEGRATION s3_int;
    
    +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
    | property                  | property_type | property_value                                                                 | property_default |
    +---------------------------+---------------+--------------------------------------------------------------------------------+------------------|
    | ENABLED                   | Boolean       | true                                                                           | false            |
    | STORAGE_ALLOWED_LOCATIONS | List          | s3://mybucket1/mypath1/,s3://mybucket2/mypath2/                                | []               |
    | STORAGE_BLOCKED_LOCATIONS | List          | s3://mybucket1/mypath1/sensitivedata/,s3://mybucket2/mypath2/sensitivedata/    | []               |
    | STORAGE_AWS_IAM_USER_ARN  | String        | arn:aws:iam::123456789001:user/abc1-b-self1234                                 |                  |
    | STORAGE_AWS_ROLE_ARN      | String        | arn:aws:iam::001234567890:role/myrole                                          |                  |
    | STORAGE_AWS_EXTERNAL_ID   | String        | MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq=                               |                  |
    +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
    
    Copy
  2. Registre os seguintes valores:

    Valor

    Descrição

    STORAGE_AWS_IAM_USER_ARN

    O usuário AWS IAM criado para sua conta Snowflake, arn:aws:iam::123456789001:user/abc1-b-self1234 neste exemplo. Nós fornecemos um único usuário IAM para toda a sua conta Snowflake. Todas as integrações de armazenamento S3 utilizam esse usuário IAM.

    STORAGE_AWS_EXTERNAL_ID

    A ID externa que é necessária para estabelecer uma relação de confiança.

    Você fornecerá estes valores na próxima seção.

Etapa 5: Conceder ao usuário IAM permissões do usuário para acessar objetos de bucket

As seguintes instruções passo a passo descrevem como configurar as permissões de acesso IAM ao Snowflake em seu Console de gerenciamento AWS para que você possa usar um bucket S3 para carregar e descarregar dados:

  1. Faça login no Console de gerenciamento AWS.

  2. No painel inicial, escolha Identity & Access Management (IAM):

    Identity & Access Management in AWS Management Console
  3. Escolha Roles no painel de navegação à esquerda.

  4. Clique na função que criou na Etapa 2: Criar a função IAM na AWS (neste tópico).

  5. Clique na guia Trust relationships.

  6. Clique no botão Edit trust relationship.

  7. Modifique o documento da política com os valores de saída DESC STORAGE INTEGRATION registrados na Etapa 4: Recuperar o usuário AWS IAM para sua conta Snowflake (neste tópico):

    Documento de política da função IAM

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "<snowflake_user_arn>"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<snowflake_external_id>"
            }
          }
        }
      ]
    }
    
    Copy

    Onde:

    • snowflake_user_arn é o valor STORAGE_AWS_IAM_USER_ARN que você registrou.

    • snowflake_external_id é o valor STORAGE_AWS_EXTERNAL_ID que você registrou.

      Neste exemplo, o valor snowflake_external_id é MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq=.

      Nota

      Por razões de segurança, se você criar uma nova integração de armazenamento (ou recriar uma integração de armazenamento existente usando a sintaxe CREATE OR REPLACE STORAGE INTEGRATION), a integração resultante terá uma ID externa diferente e, portanto, não poderá resolver a relação de confiança a menos que a política de confiança seja modificada.

  8. Clique no botão Update Trust Policy. As alterações são salvas.

Nota

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.

Determinação da opção correta

Antes de prosseguir, determine se existe uma notificação de evento S3 para o caminho de destino (ou “prefixo”, na terminologia AWS) em seu bucket S3 onde seus arquivos de dados estão localizados. As regras da AWS proíbem a criação de notificações conflitantes para o mesmo caminho.

As seguintes opções para automatizar a atualização de metadados de tabelas externas usando Amazon SQS têm suporte:

  • Opção 1. Notificação de novo evento S3: Crie uma notificação de evento para o caminho de destino em seu bucket S3. A notificação do evento informa o Snowflake através de uma fila SQS quando arquivos novos, removidos ou modificados no caminho requerem uma atualização dos metadados da tabela externa.

    Esta é a opção mais comum.

    Importante

    Se existir uma notificação de evento conflitante para seu bucket S3, use a opção 2 em seu lugar.

  • Opção 2. Notificação de evento existente: Configure o Amazon Simple Notification Service (SNS) como um transmissor para compartilhar notificações para um determinado caminho com vários pontos de extremidade (ou “assinantes”, por exemplo, filas SQS filas ou cargas de trabalho Lambda AWS), incluindo a fila SQS do Snowflake para automação da atualização de tabelas externas. Uma notificação de evento S3 publicada por SNS informa ao Snowflake sobre alterações de arquivo no caminho através de uma fila SQS.

Opção 1: Criação de uma notificação de novo evento S3

Este tópico descreve a opção mais comum para atualizar automaticamente os metadados de tabelas externas usando notificações do Amazon SQS (Simple Queue Service) para um bucket S3. As etapas explicam como criar uma notificação de evento para o caminho de destino (ou “prefixo”, em terminologia AWS) em seu bucket S3 onde seus arquivos de dados são armazenados.

Importante

Se existir uma notificação de evento conflitante para seu bucket S3, use Opção 2: Configuração do Amazon SNS (neste tópico). As regras da AWS proíbem a criação de notificações conflitantes para o mesmo caminho de destino.

Etapa 1: Criar um estágio (se necessário)

Crie um estágio externo que faça referência ao seu bucket S3 usando o comando CREATE STAGE. O Snowflake lê seus arquivos de dados preparados nos metadados da tabela externa. Você também pode usar um estágio externo já existente.

Nota

  • Para configurar o acesso seguro ao local de armazenamento na nuvem, consulte Configuração de acesso seguro ao armazenamento em nuvem (neste tópico).

  • 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.

O exemplo a seguir cria um estágio chamado mystage no esquema ativo para a sessão do usuário. O URL de armazenamento em nuvem inclui o caminho files. O estágio faz referência a uma integração de armazenamento chamada my_storage_int.

USE SCHEMA mydb.public;

CREATE STAGE mystage
  URL = 's3://mybucket/files'
  STORAGE_INTEGRATION = my_storage_int;
Copy

Etapa 2: Criar uma tabela externa

Crie uma tabela externa usando o comando CREATE EXTERNAL TABLE. Por exemplo, crie uma tabela externa no esquema mydb.public que leia dados JSON de arquivos preparados.

A referência do estágio inclui um caminho de pasta chamado path1. A tabela externa anexa este caminho à definição do estágio, ou seja, a tabela externa faz referência aos arquivos de dados em @mystage/files/path1.

Observe que o parâmetro AUTO_REFRESH é TRUE por padrão:

CREATE OR REPLACE EXTERNAL TABLE ext_table
 WITH LOCATION = @mystage/path1/
 FILE_FORMAT = (TYPE = JSON);
Copy

Etapa 3: Configurar notificações de eventos

Configure notificações de eventos para seu bucket S3 para notificar o Snowflake quando dados novos ou atualizados estiverem disponíveis para leitura nos metadados da tabela externa. O recurso de atualização automática depende de filas SQS para entregar notificações de eventos do S3 para o Snowflake.

Para facilidade de uso, estas filas SQS são criadas e gerenciadas pelo Snowflake. A saída do comando SHOW EXTERNAL TABLES exibe o Nome de recurso da Amazon (ARN) de sua fila SQS.

  1. Execute o comando SHOW EXTERNAL TABLES:

    SHOW EXTERNAL TABLES;
    
    Copy

    Observe o ARN da fila SQS para a tabela externa na coluna notification_channel. Copie o ARN para um local conveniente.

    Nota

    Seguindo as diretrizes AWS, o Snowflake designa não mais que uma fila SQS por bucket S3. Esta fila SQS pode ser compartilhada entre vários buckets na mesma conta AWS. A fila SQS coordena notificações para todas as tabelas externas que leem arquivos de dados do mesmo bucket S3. Quando um arquivo de dados novo ou modificado é carregado no bucket, todas as definições da tabela externa que correspondem ao caminho do diretório de estágios leem os detalhes do arquivo em seus metadados.

  2. Faça login no Console de gerenciamento AWS.

  3. Configure uma notificação de evento para seu bucket S3 usando as instruções fornecidas na documentação Amazon S3. Complete os campos da seguinte forma:

    • Name: Nome da notificação de evento (por exemplo, Auto-ingest Snowflake).

    • Events: Selecione as opções ObjectCreate (All) e ObjectRemoved.

    • Send to: Selecione SQS Queue a partir da lista suspensa.

    • SQS: Selecione Add SQS queue ARN a partir da lista suspensa.

    • SQS queue ARN: Cole o nome da fila SQS da saída SHOW EXTERNALTABLES.

Nota

Estas instruções criam uma única notificação de evento que monitora a atividade para todo o bucket S3. Esta é a abordagem mais simples. Esta notificação trata de todas as tabelas externas configuradas em um nível mais granular no diretório do bucket S3.

Alternativamente, nas etapas acima, configure um ou mais caminhos e/ou extensões de arquivo (ou prefixos e sufixos, em terminologia AWS) para filtrar a atividade de eventos. Para instruções, consulte as informações sobre filtragem de nomes de chave de objeto no tópico da documentação AWS relevante. Repita essas etapas para cada caminho ou extensão de arquivo adicional que deseja que a notificação monitore.

Observe que a AWS limita o número destas configurações de fila de notificação a um máximo de 100 por bucket S3.

Observe também que a AWS não permite configurações de fila sobrepostas (em várias notificações de eventos) para o mesmo bucket S3. Por exemplo, se uma notificação existente for configurada para s3://mybucket/files/path1, então não será possível criar outra notificação em um nível superior, tal como s3://mybucket/files, ou vice-versa.

O estágio externo com atualização automática agora está configurado!

Quando arquivos de dados novos ou atualizados são adicionados ao bucket S3, a notificação de evento informa ao Snowflake para verificá-los nos metadados da tabela externa.

Etapa 4: Atualizar manualmente os metadados da tabela externa

Atualize manualmente os metadados da tabela externa uma vez usando ALTER EXTERNAL TABLE com o parâmetro REFRESH, por exemplo:

ALTER EXTERNAL TABLE ext_table REFRESH;
Copy

Isto assegura que os metadados estejam sincronizados com quaisquer mudanças na lista de arquivos que tenham ocorrido desde a Etapa 2. Depois disso, as notificações de eventos S3 acionam automaticamente a atualização dos metadados.

Etapa 5: Configurar a segurança

Para cada função adicional que será usada para consultar a tabela externa, conceda privilégios suficientes de controle de acesso para os vários objetos (ou seja, bancos de dados, esquemas, estágio e tabela) usando GRANT <privilégios>:

Objeto

Privilégio

Notas

Banco de dados

USAGE

Esquema

USAGE

Estágio nomeado

USAGE , READ

Formato de arquivo nomeado

USAGE

Tabela externa

SELECT

Opção 2: Configuração do Amazon SNS

Esta seção descreve como acionar automaticamente a atualização de metadados da tabela externa usando notificações do Amazon SQS (Simple Queue Service) para um bucket S3. As etapas explicam como configurar o Amazon Simple Notification Service (SNS) como um transmissor para publicar notificações de eventos de seu bucket S3 para múltiplos assinantes (por exemplo, filas SQS ou cargas de trabalho Lambda AWS), incluindo a fila SQS do Snowflake para automação da atualização da tabela externa.

Nota

Estas instruções presumem que existe uma notificação de evento para o caminho de destino em seu bucket S3 onde seus arquivos de dados estão localizados. Se não houver nenhuma notificação de evento:

Pré-requisito: Criar um tópico e assinatura do Amazon SNS

  1. Crie um tópico do SNS em sua conta AWS para tratar todas as mensagens para o local do estágio do Snowflake em seu bucket S3.

  2. Inscreva seus destinos-alvo para as notificações de eventos S3 (por exemplo, outras filas SQS ou cargas de trabalho Lambda AWS) para este tópico. O SNS publica notificações de eventos para seu bucket para todos os assinantes do tópico.

Para instruções, consulte a documentação do SNS.

Etapa 1: Inscreva a fila SQS do Snowflake no tópico do SNS

  1. Faça login no Console de gerenciamento AWS.

  2. No painel inicial, escolha Simple Notification Service (SNS).

  3. Escolha Topics no painel de navegação à esquerda.

  4. Localize o tópico para seu bucket S3. Observe o ARN do tópico.

  5. Usando um cliente Snowflake, consulte a função SYSTEM$GET_AWS_SNS_IAM_POLICY do sistema com seu ARN do tópico SNS:

    select system$get_aws_sns_iam_policy('<sns_topic_arn>');
    
    Copy

    A função retorna uma política IAM que concede a uma fila SQS do Snowflake permissão para se inscrever no tópico SNS.

    Por exemplo:

    select system$get_aws_sns_iam_policy('arn:aws:sns:us-west-2:001234567890:s3_mybucket');
    
    +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | SYSTEM$GET_AWS_SNS_IAM_POLICY('ARN:AWS:SNS:US-WEST-2:001234567890:S3_MYBUCKET')                                                                                                                                                                   |
    +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | {"Version":"2012-10-17","Statement":[{"Sid":"1","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234"},"Action":["sns:Subscribe"],"Resource":["arn:aws:sns:us-west-2:001234567890:s3_mybucket"]}]}                 |
    +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    
    Copy
  6. Volte para o Console de gerenciamento AWS. Escolha Topics no painel de navegação à esquerda.

  7. Selecione o tópico para seu bucket S3 e clique no botão Edit. A página Edit é aberta.

  8. Clique em Access policy - Optional para expandir esta área da página.

  9. Mesclar a adição da política IAM da função SYSTEM$GET_AWS_SNS_IAM_POLICY resulta no documento JSON.

    Por exemplo:

    Política IAM original (abreviada):

    {
      "Version":"2008-10-17",
      "Id":"__default_policy_ID",
      "Statement":[
         {
            "Sid":"__default_statement_ID",
            "Effect":"Allow",
            "Principal":{
               "AWS":"*"
            }
            ..
         }
       ]
     }
    
    Copy

    Política IAM mesclada:

    {
      "Version":"2008-10-17",
      "Id":"__default_policy_ID",
      "Statement":[
         {
            "Sid":"__default_statement_ID",
            "Effect":"Allow",
            "Principal":{
               "AWS":"*"
            }
            ..
         },
         {
            "Sid":"1",
            "Effect":"Allow",
            "Principal":{
              "AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234"
             },
             "Action":[
               "sns:Subscribe"
             ],
             "Resource":[
               "arn:aws:sns:us-west-2:001234567890:s3_mybucket"
             ]
         }
       ]
     }
    
    Copy
  10. Adicione mais uma concessão de política para permitir que o S3 publique notificações de eventos para o bucket no tópico SNS.

    Por exemplo (usando o ARN do tópico SNS e o bucket S3 usado ao longo destas instruções):

    {
        "Sid":"s3-event-notifier",
        "Effect":"Allow",
        "Principal":{
           "Service":"s3.amazonaws.com"
        },
        "Action":"SNS:Publish",
        "Resource":"arn:aws:sns:us-west-2:001234567890:s3_mybucket",
        "Condition":{
           "ArnLike":{
              "aws:SourceArn":"arn:aws:s3:*:*:s3_mybucket"
           }
        }
     }
    
    Copy

    Política IAM mesclada:

    {
      "Version":"2008-10-17",
      "Id":"__default_policy_ID",
      "Statement":[
         {
            "Sid":"__default_statement_ID",
            "Effect":"Allow",
            "Principal":{
               "AWS":"*"
            }
            ..
         },
         {
            "Sid":"1",
            "Effect":"Allow",
            "Principal":{
              "AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234"
             },
             "Action":[
               "sns:Subscribe"
             ],
             "Resource":[
               "arn:aws:sns:us-west-2:001234567890:s3_mybucket"
             ]
         },
         {
            "Sid":"s3-event-notifier",
            "Effect":"Allow",
            "Principal":{
               "Service":"s3.amazonaws.com"
            },
            "Action":"SNS:Publish",
            "Resource":"arn:aws:sns:us-west-2:001234567890:s3_mybucket",
            "Condition":{
               "ArnLike":{
                  "aws:SourceArn":"arn:aws:s3:*:*:s3_mybucket"
               }
            }
          }
       ]
     }
    
    Copy
  11. Clique no botão Save changes.

Etapa 2: criar um estágio (se necessário)

Crie um estágio externo que faça referência ao seu bucket S3 usando o comando CREATE STAGE. O Snowflake lê seus arquivos de dados preparados nos metadados da tabela externa.

Você também pode usar um estágio externo já existente.

Nota

  • Para configurar o acesso seguro ao local de armazenamento na nuvem, consulte Configuração de acesso seguro ao armazenamento em nuvem (neste tópico).

  • 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.

O exemplo a seguir cria um estágio chamado mystage no esquema ativo para a sessão do usuário. O URL de armazenamento em nuvem inclui o caminho files. O estágio faz referência a uma integração de armazenamento chamada my_storage_int:

USE SCHEMA mydb.public;

CREATE STAGE mystage
  URL = 's3://mybucket/files'
  STORAGE_INTEGRATION = my_storage_int;
Copy

Etapa 3: Criar uma tabela externa

Crie uma tabela externa usando CREATE EXTERNAL TABLE. Identifique o ARN do tópico SNS de Pré-requisito: Criar um tópico e assinatura do Amazon SNS.

CREATE EXTERNAL TABLE <table_name>
 ..
 AWS_SNS_TOPIC = '<sns_topic_arn>';
Copy

Onde:

AWS_SNS_TOPIC = '<arn_tópico_sns>'

Especifica o ARN para o tópico SNS do seu bucket S3. A instrução CREATE EXTERNALTABLE inscreve a fila SQS do Snowflake no tópico SNS especificado.

Por exemplo, crie uma tabela externa no esquema mydb.public que leia dados JSON de arquivos preparados. A referência do estágio inclui um caminho de pasta chamado path1. A tabela externa anexa este caminho à definição do estágio, ou seja, a tabela externa faz referência aos arquivos de dados em @mystage/files/path1. Observe que o parâmetro AUTO_REFRESH é TRUE por padrão:

CREATE EXTERNAL TABLE ext_table
 WITH LOCATION = @mystage/path1/
 FILE_FORMAT = (TYPE = JSON)
 AWS_SNS_TOPIC = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket';
Copy

Para remover este parâmetro de uma tabela externa, é necessário recriar a tabela externa usando a sintaxe CREATE OR REPLACE EXTERNAL TABLE.

Etapa 4: Atualizar manualmente os metadados da tabela externa

Atualize manualmente os metadados da tabela externa uma vez usando ALTER EXTERNAL TABLE com o parâmetro REFRESH, por exemplo:

ALTER EXTERNAL TABLE ext_table REFRESH;
Copy

Isto assegura que os metadados estejam sincronizados com quaisquer mudanças na lista de arquivos que tenham ocorrido desde a Etapa 3. Depois disso, as notificações de eventos S3 acionam automaticamente a atualização dos metadados.

Etapa 5: Configurar a segurança

Para cada função adicional que será usada para consultar a tabela externa, conceda privilégios suficientes de controle de acesso para os vários objetos (ou seja, bancos de dados, esquemas, estágio e tabela) usando GRANT <privilégios>:

Objeto

Privilégio

Notas

Banco de dados

USAGE

Esquema

USAGE

Estágio nomeado

USAGE , READ

Formato de arquivo nomeado

USAGE

Tabela externa

SELECT