Atualizar tabelas externas automaticamente para o Amazon S3¶
Você pode criar tabelas externas e atualizar os metadados de tabela externa automaticamente usando as notificações do Amazon SQS (Simple Queue Service) para um bucket S3. Essa operação sincroniza os metadados com o conjunto mais recente de arquivos associados na área de preparação externa e no caminho:
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.
Pré-requisitos¶
Antes de prosseguir, certifique-se de atender aos seguintes pré-requisitos:
Este recurso está limitado às contas Snowflake na Amazon Web Services (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.
As tabelas externas não são compatíveis com o controle de versão de armazenamento (controle de versão do S3, controle de versão de objeto no Google Cloud Storage ou controle de versão do Azure Storage).
Limitações da atualização automática de tabelas externas usando o Amazon SQS¶
Clientes do Virtual Private Snowflake (VPS) e do AWS PrivateLink: O Amazon SQS atualmente não é aceito pelo AWS como um ponto de extremidade de VPC. Embora os serviços AWS dentro de uma VPC (incluindo VPS) possam se comunicar com SQS, esse tráfego não está dentro da VPC e, portanto, não é protegido pela VPC.
As 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 acionamento de atualizações automatizadas de metadados externos usando mensagens de eventos S3 é aceito apenas por contas Snowflake hospedadas na AWS.
Configurar acesso seguro ao armazenamento em nuvem¶
Importante
Se você já configurou o acesso seguro ao bucket S3 que armazena seus arquivos de dados, pule esta seção e prossiga para Criar uma nova notificação de evento do S3 ou usar uma notificação existente.
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:

Um estágio externo (ou seja, S3) faz referência a um objeto de integração de armazenamento em sua definição.
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.
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.
Importante
A Snowflake recomenda que você configure o acesso seguro para que não precise fornecer credenciais do IAM ao acessar o armazenamento em nuvem. Para obter mais opções de acesso ao armazenamento, consulte Configuração de acesso seguro ao Amazon S3.
Nesta seção:
Etapa 1: configurar permissões de acesso para o bucket S3¶
Requisitos de controle de acesso do 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 que você crie uma política do 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 de IAM¶
Conclua as etapas a seguir para configurar as permissões de acesso para o Snowflake acessar seu bucket S3:
Entre no Console de Gerenciamento da AWS.
No painel inicial, pesquise e selecione IAM.
Selecione Account settings no painel de navegação à esquerda.
Em Security Token Service (STS), na lista Endpoints, encontre a região do Snowflake onde sua conta está localizada.
Se o STS status estiver inativo, mude o seletor para Active.
Selecione Policies no painel de navegação à esquerda.
Selecione Create Policy.
Para Policy editor, selecione JSON.
Para adicionar um documento de política que permita ao Snowflake acessar a pasta e o bucket S3, copie e cole o seguinte bloco de sintaxe no editor de políticas:
{ "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>/*" ] } } } ] }
Nota
Este documento de política (no formato JSON) fornece ao Snowflake as permissões necessárias para carregar ou descarregar dados usando um único caminho de pasta e bucket.
Os Nomes de recurso da Amazon (ARN) para buckets em regiões governamentais têm um prefixo
arn:aws-us-gov:s3:::
.Definir a condição
"s3:prefix":
como["*"]
ou["<caminho>/*"]
concede acesso a todos os prefixos no bucket ou caminho no bucket especificado, respectivamente.As políticas AWS oferecem suporte a uma variedade de diferentes casos de uso de segurança.
Substitua
bucket
eprefix
pelo nome real do bucket e prefixo do caminho da pasta.Selecione Next.
Insira um Policy name (por exemplo,
snowflake_access
) e uma Description opcional.Selecione Create policy.
Etapa 2: crie a função IAM no AWS¶
Para configurar permissões de acesso para Snowflake no AWS Management Console, faça o seguinte:
Na seção de navegação à esquerda do painel de gerenciamento de identidade e acesso (IAM), selecione Roles.
Selecione Create role.
Selecione AWS account como o tipo de entidade confiável.
Selecione Another AWS account
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.
Selecione a opção Require external ID. Um ID externo é usado para conceder acesso aos seus recursos AWS (como buckets S3) a terceiros, como o Snowflake.
Insira um ID de espaço reservado como
0000
. Em uma etapa posterior, você modificará a relação de confiança para sua função IAM e especificará o ID externo de sua integração de armazenamento.Selecione Next.
Selecione a política que você criou em Etapa 1: configure permissões de acesso ao bucket S3 (neste tópico).
Selecione Next.
Digite um nome e descrição para a função e selecione Create role.
Agora você criou uma política IAM para um bucket, criou uma função IAM e anexou a política à função.
Na página de resumo da função, localize e registre o valor Role ARN. Na próxima etapa, você criará uma integração do Snowflake que faz referência a essa função.
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: crie 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 de gerenciamento de identidade e acesso gerado (IAM) para seu armazenamento em nuvem S3, juntamente 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 vários 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 = ('<protocol>://<bucket>/<path>/', '<protocol>://<bucket>/<path>/')
[ STORAGE_BLOCKED_LOCATIONS = ('<protocol>://<bucket>/<path>/', '<protocol>://<bucket>/<path>/') ]
Onde:
integration_name
é o nome da nova integração.iam_role
é o nome do recurso da Amazon (ARN) da função que você criou na Etapa 2: crie a função IAM no AWS (neste tópico).protocol
é um dos seguintes:s3
refere-se ao armazenamento S3 em regiões AWS públicas fora da China.s3china
refere-se ao armazenamento S3 em regiões AWS públicas na China.s3gov
refere-se ao armazenamento S3 em regiões governamentais.
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 permite acesso a todos os buckets da conta, mas bloqueia o acesso às pastas sensitivedata
definidas.
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 = ('*')
STORAGE_BLOCKED_LOCATIONS = ('s3://mybucket1/mypath1/sensitivedata/', 's3://mybucket2/mypath2/sensitivedata/');
Nota
Opcionalmente, use o parâmetro STORAGE_AWS_EXTERNAL_ID para especificar seu próprio ID externo. Você pode escolher esta opção para usar o mesmo ID externo em vários volumes externos e/ou integrações de armazenamento.
Etapa 4: recupere o usuário de AWS IAM para sua conta Snowflake¶
Para recuperar o ARN do usuário IAM que foi criado automaticamente para sua conta Snowflake, use o DESCRIBE INTEGRATION.
DESC INTEGRATION <integration_name>;
Onde:
integration_name
é o nome da integração que você criou em Etapa 3: Criar uma integração de armazenamento em nuvem no Snowflake (neste tópico).
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= | | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
Registre os valores para as seguintes propriedades:
Propriedade
Descrição
STORAGE_AWS_IAM_USER_ARN
O usuário AWS IAM criado para sua conta Snowflake; por exemplo,
arn:aws:iam::123456789001:user/abc1-b-self1234
. O Snowflake fornece um único usuário IAM para toda a sua conta Snowflake. Todas as integrações de armazenamento S3 na sua conta usam esse usuário IAM.STORAGE_AWS_EXTERNAL_ID
O ID externo que o Snowflake usa para estabelecer uma relação de confiança com AWS. Se você não especificou um ID externo (
STORAGE_AWS_EXTERNAL_ID
) ao criar a integração de armazenamento, o Snowflake gerará um ID para você usar.Você fornece esses valores na próxima seção.
Etapa 5: Conceda 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:
Entre no Console de Gerenciamento da AWS.
Selecione IAM.
Selecione Roles no painel de navegação à esquerda.
Selecione a função que você criou na Etapa 2: crie a função IAM no AWS (neste tópico).
Selecione a guia Trust relationships.
Selecione Edit trust policy.
Modifique o documento da política com os valores de saída DESC STORAGE INTEGRATION que você registrou na Etapa 4: recupere 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>" } } } ] }
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) sem especificar um ID externo, a nova integração tem um ID externo diferente e não poderá resolver a relação de confiança a menos que a política de confiança seja atualizada.
Selecione Update policy para salvar suas alterações.
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.
Nota
Você pode usar a função SYSTEM$VALIDATE_STORAGE_INTEGRATION para validar a configuração de sua integração de armazenamento.
Criar uma nova notificação de evento do S3 ou usar uma notificação existente¶
Antes de prosseguir, verifique se existe uma notificação de evento do S3 para o caminho de destino (ou prefixo, na terminologia da AWS) no 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.
Você tem duas opções para automatizar a atualização de metadados de tabela externa usando o Amazon SQS:
- Opção 1: criar uma nova notificação de evento do S3
Esta é a opção mais comum. Crie uma notificação de evento para o caminho de destino no 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.
Importante
Se existir uma notificação de evento conflitante para seu bucket S3, use a opção 2 em seu lugar.
Para obter instruções passo a passo, consulte Opção 1: criar uma nova notificação de evento do S3.
- Opção 2: Configurar o Amazon SNS
Se você já tiver uma notificação de evento, configure o Amazon Simple Notification Service (SNS) como um transmissor para compartilhar notificações de um determinado caminho com vários pontos de extremidade (ou assinantes, por exemplo, filas do SQS ou cargas de trabalho do AWS Lambda), incluindo a fila do Snowflake SQS para automação de atualização de tabela externa. Uma notificação de evento do S3 publicada por SNS informa o Snowflake sobre alterações de arquivo no caminho por meio de uma fila do SQS.
Para obter instruções passo a passo, consulte Opção 2: Configurar o Amazon SNS mais adiante neste tópico.
Opção 1: criar uma nova notificação de evento do S3¶
Esta seção fornece instruções passo a passo para a opção mais comum de atualização automática de metadados de tabela externa usando notificações do Amazon Simple Queue Service (SQS) para um bucket S3. As etapas mostram como criar uma notificação de evento para o caminho de destino (ou prefixo, na terminologia da AWS) no seu bucket S3, onde seus arquivos de dados estão armazenados.
Importante
Se houver uma notificação de evento conflitante para o seu bucket S3, use Opção 2: Configurar o Amazon SNS posteriormente neste tópico. As regras da AWS proíbem a criação de notificações conflitantes para o mesmo caminho de destino.
(Opcional) Etapa 1: criar uma área¶
Crie uma área de preparação externa 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 em nuvem, consulte Configurar 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;
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 esse caminho à definição do estágio, ou seja, a tabela externa faz referência aos arquivos de dados em @mystage/files/path1
.
O parâmetro AUTO_REFRESH
é TRUE
por padrão:
CREATE OR REPLACE EXTERNAL TABLE ext_table WITH LOCATION = @mystage/path1/ FILE_FORMAT = (TYPE = JSON);
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.
Execute o comando SHOW EXTERNAL TABLES:
SHOW EXTERNAL TABLES;
Na coluna
notification_channel
, encontre o ARN da fila do SQS para a tabela externa e copie o ARN para um local de fácil acesso.Nota
Seguindo as diretrizes do AWS, o Snowflake designa no máximo uma fila SQS por região do AWS S3. Essa 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.
Entre no Console de Gerenciamento da AWS.
Configure uma notificação de evento para o seu bucket S3 usando as instruções fornecidas na documentação do Amazon S3. Preencha os campos conforme mostrado na lista a seguir:
Name: nome da notificação do 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.
Como alternativa, nas etapas anteriores, configure um ou mais caminhos e extensões de arquivo (ou prefixos e sufixos, na terminologia da 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 você deseja que a notificação monitore.
A AWS limita o número dessas configurações de fila de notificação a um máximo de 100 por bucket S3.
A AWS não permite configurações de fila sobrepostas (entre notificações de eventos) para o mesmo bucket S3. Por exemplo, se uma notificação existente estiver configurada para s3://mybucket/files/path1
, você não poderá criar outra notificação em um nível superior, como s3://mybucket/files
, ou vice-versa.
Após concluir essa etapa, a área de preparação externa com atualização automática é configurada.
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 de tabela externa uma vez usando ALTER EXTERNAL TABLE com o parâmetro REFRESH; por exemplo:
ALTER EXTERNAL TABLE ext_table REFRESH;
Esta etapa garante que os metadados sejam sincronizados com quaisquer alterações na lista de arquivos ocorridas após 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 você usará para consultar a tabela externa, conceda privilégios de controle de acesso suficientes aos vários objetos (ou seja, bancos de dados, esquemas, áreas e tabelas) usando GRANT <privilégios> … TO ROLE:
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: Configurar o Amazon SNS¶
Esta seção fornece instruções passo a passo sobre como acionar a atualização automática de metadados de tabela externa usando notificações do Amazon SQS (Simple Queue Service) para um bucket S3. As etapas mostram como configurar o Amazon Simple Notification Service (SNS) como um transmissor para publicar notificações de eventos para seu bucket S3 para vários assinantes (por exemplo, filas do SQS ou cargas de trabalho do AWS Lambda), incluindo a fila do Snowflake SQS para automação de atualização de tabelas externas.
Nota
Para que essas instruções funcionem, você precisa ter uma notificação de evento para o caminho de destino no seu bucket S3 onde seus arquivos de dados estão localizados. Se não houver notificação de evento, execute uma das seguintes tarefas:
Siga a Opção 1: Criar uma nova notificação de evento do S3 anteriormente neste tópico.
Crie uma notificação de evento para o seu bucket S3 e prossiga com as instruções desta seção. Para obter mais informações, consulte a documentação do Amazon S3.
Pré-requisito: Criar um tópico e assinatura do Amazon SNS¶
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.
Inscreva seus destinos de destino para as notificações de eventos do S3 (por exemplo, outras filas do SQS ou cargas de trabalho do AWS Lambda) nesse 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¶
Entre no Console de Gerenciamento da AWS.
No painel inicial, escolha Simple Notification Service (SNS).
Escolha Topics no painel de navegação à esquerda.
Localize o tópico para seu bucket S3. Observe o ARN do tópico.
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>');
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"]}]} | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Volte para o Console de gerenciamento AWS. Escolha Topics no painel de navegação à esquerda.
Selecione o tópico para seu bucket S3 e clique no botão Edit. A página Edit é aberta.
Clique em Access policy - Optional para expandir esta área da página.
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":"*" } .. } ] }
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" ] } ] }
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" } } }
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" } } } ] }
Clique em Save changes.
(Opcional) Etapa 2: Criar uma área¶
Crie uma área de preparação externa 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 em nuvem, consulte Configurar o acesso seguro ao armazenamento em nuvem anteriormente 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;
Etapa 3: criar uma tabela externa¶
Crie uma tabela externa usando CREATE EXTERNAL TABLE. Identifique o tópico ARN do SNS em Pré-requisito: Criar um tópico e assinatura do Amazon SNS:
CREATE EXTERNAL TABLE <table_name>
..
AWS_SNS_TOPIC = '<sns_topic_arn>';
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 esse caminho à definição da área, ou seja, a tabela externa faz referência aos arquivos de dados em @mystage/files/path1
. 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';
Para remover este parâmetro de uma tabela externa, você deve 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 de tabela externa uma vez usando ALTER EXTERNAL TABLE com o parâmetro REFRESH; por exemplo:
ALTER EXTERNAL TABLE ext_table REFRESH;
Esta etapa garante que os metadados sejam sincronizados com todas as alterações na lista de arquivos ocorridas após 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 você usará para consultar a tabela externa, conceda privilégios de controle de acesso suficientes aos vários objetos (ou seja, bancos de dados, esquemas, áreas e tabelas) usando GRANT <privilégios> … TO ROLE:
Objeto |
Privilégio |
Notas |
---|---|---|
Banco de dados |
USAGE |
|
Esquema |
USAGE |
|
Estágio nomeado |
USAGE , READ |
|
Formato de arquivo nomeado |
USAGE |
|
Tabela externa |
SELECT |