Atualização automática de tabelas de diretório para Amazon S3¶
Este tópico fornece instruções para criar tabelas de diretório e atualizar os metadados da tabela de diretório 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 em 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 de diretório para reduzir custos, ruído de eventos e latência.
Neste tópico:
Limitações da atualização automática de tabelas de diretório 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 configurar um objeto de integração de armazenamento Snowflake para delegar a responsabilidade pela autenticação do armazenamento em nuvem a uma entidade de gerenciamento de identidade e acesso (IAM) do Snowflake.
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.
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.
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 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.
Faça login no Console de gerenciamento AWS.
No painel inicial, escolha Identity & Access Management (IAM):
Escolha Account settings no painel de navegação à esquerda.
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.
Escolha Policies no painel de navegação à esquerda.
Clique em Create Policy:
Clique na guia JSON.
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
eprefix
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>/*" ] } } } ] }
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.
Clique em Review policy.
Digite o nome da política (por exemplo,
snowflake_access
) e uma descrição opcional. Clique em Create policy.
Etapa 2: Crie a função IAM na AWS¶
Para configurar permissões de acesso para Snowflake no AWS Management Console, faça o seguinte:
Faça login no AWS Management Console.
No painel inicial, selecione Identity & Access Management (IAM):
Selecione Roles no painel de navegação à esquerda.
Selecione Create role.
Selecione Another AWS account como o tipo de entidade confiável.
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 na etapa 1: configurar permissões de acesso para o 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: 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>/') ]
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 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: Recuperar o usuário 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: 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:
Faça login no AWS Management Console.
Selecione Identity & Access Management (IAM):
Selecione Roles no painel de navegação à esquerda.
Selecione a função que você criou na etapa 2: criar a função IAM na AWS (neste tópico).
Selecione a guia Trust relationships.
Selecione Edit trust relationship.
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>" } } } ] }
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 o 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 de diretório 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 de diretório.
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 de diretório. 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.
Nota
Recomendamos esta opção se você planeja usar Replicação de histórico de carregamento, canal e estágio. Você também pode migrar da opção 1 para a opção 2 depois de criar um grupo de replicação ou failover. Para obter mais informações, consulte Migração para Amazon Simple Notification Service (SNS).
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 de diretório 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 com uma tabela de diretório incluída¶
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 de diretório. 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.
-- External stage
CREATE [ OR REPLACE ] [ TEMPORARY ] STAGE [ IF NOT EXISTS ] <external_stage_name>
<cloud_storage_access_settings>
[ FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ]
[ directoryTable ]
[ COPY_OPTIONS = ( copyOptions ) ]
[ COMMENT = '<string_literal>' ]
Nota
O local de armazenamento no valor de URL deve terminar em uma barra (/
).
Onde:
directoryTable (for Amazon S3) ::= [ DIRECTORY = ( ENABLE = { TRUE | FALSE } [ AUTO_REFRESH = { TRUE | FALSE } ] ) ]
Parâmetros da tabela de diretório (directoryTable
)¶
ENABLE = TRUE | FALSE
Especifica se deve ser adicionada uma tabela de diretório ao estágio. Quando o valor é TRUE, uma tabela de diretório é criada com o estágio.
Padrão:
FALSE
AUTO_REFRESH = TRUE | FALSE
Especifica se o Snowflake deve permitir acionar atualizações automáticas dos metadados da tabela de diretório quando os arquivos de dados novos ou atualizados estiverem disponíveis no estágio externo nomeado especificado na configuração de
[ WITH ] LOCATION =
.TRUE
O Snowflake permite acionar a atualização automática dos metadados da tabela de diretório.
FALSE
O Snowflake não permite acionar atualizações automáticas dos metadados da tabela de diretório. Você deve atualizar manualmente os metadados da tabela de diretório periodicamente usando ALTER STAGE … REFRESH para sincronizar os metadados com a lista atual de arquivos no caminho do estágio.
Padrão:
FALSE
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://load/files/'
STORAGE_INTEGRATION = my_storage_int
DIRECTORY = (
ENABLE = true
AUTO_REFRESH = true
);
Quando arquivos de dados novos ou atualizados são adicionados ao local de armazenamento na nuvem, a notificação de evento informa ao Snowflake para verificá-los nos metadados da tabela de diretório.
Etapa 2: 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 de diretório. 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 DESCRIBE STAGE exibe o Nome de recurso da Amazon (ARN) de sua fila SQS.
Execute o comando DESCRIBE STAGE:
DESC STAGE <stage_name>;
Por exemplo:
DESC STAGE mystage;
Observe o ARN da fila SQS para a tabela de diretório no campo
directory_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 de diretório 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 de diretório que correspondem ao caminho do diretório de estágios leem os detalhes do arquivo em seus metadados.
Faça login no Console de gerenciamento AWS.
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 DESC STAGE.
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 de diretório 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 de diretório.
Etapa 3: atualizar manualmente os metadados da tabela de diretório¶
Atualize os metadados em uma tabela de diretório manualmente usando o comando ALTER STAGE.
ALTER STAGE [ IF EXISTS ] <name> REFRESH [ SUBPATH = '<relative-path>' ]
Onde:
REFRESH
Acessa os arquivos de dados preparados referenciados na definição da tabela de diretório e atualiza os metadados da tabela:
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.
Atualmente, é necessário executar este comando cada vez que arquivos são adicionados ao estágio, atualizados ou descartados. Esta etapa sincroniza os metadados com o último conjunto de arquivos associados na definição do estágio para a tabela de diretório.
SUBPATH = '<relative-path>'
Opcionalmente, especifique um caminho relativo para atualizar os metadados de um subconjunto específico dos arquivos de dados.
Por exemplo, atualize manualmente os metadados da tabela de diretório em um estágio chamado mystage
:
ALTER STAGE mystage REFRESH;
Importante
Se esta etapa não for concluída com sucesso pelo menos uma vez após a criação da tabela de diretório, a consulta da tabela de diretório não retornará nenhum resultado até que um evento de notificação acione os metadados da tabela de diretório para serem atualizados automaticamente pela primeira vez.
Etapa 4: configurar a segurança¶
Para cada função adicional que será usada para consultar a tabela de diretório, 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 |
Opção 2: Configuração do Amazon SNS¶
Esta seção descreve como acionar automaticamente a atualização de metadados da tabela de diretório 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 de diretório.
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:
Siga a Opção 1: Criação de uma notificação de novo evento S3 (neste tópico).
Crie uma notificação de evento para seu bucket S3 e, em seguida, prossiga com as instruções neste tópico. 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-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¶
Faça login no Console de gerenciamento 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 no botão Save changes.
Etapa 2: criar um estágio com uma tabela de diretório incluída¶
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 de diretório. 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.
-- External stage
CREATE [ OR REPLACE ] [ TEMPORARY ] STAGE [ IF NOT EXISTS ] <external_stage_name>
<cloud_storage_access_settings>
[ FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ]
[ directoryTable ]
[ COPY_OPTIONS = ( copyOptions ) ]
[ COMMENT = '<string_literal>' ]
Onde:
directoryTable (for Amazon S3) ::= [ DIRECTORY = ( ENABLE = { TRUE | FALSE } [ AUTO_REFRESH = { TRUE | FALSE } ] [ AWS_SNS_TOPIC = '<sns_topic_arn>' ] ) ]
Parâmetros da tabela de diretório (directoryTable
)¶
ENABLE = TRUE | FALSE
Especifica se deve ser adicionada uma tabela de diretório ao estágio. Quando o valor é TRUE, uma tabela de diretório é criada com o estágio.
Padrão:
FALSE
AUTO_REFRESH = TRUE | FALSE
Especifica se o Snowflake deve permitir acionar atualizações automáticas dos metadados da tabela de diretório quando os arquivos de dados novos ou atualizados estiverem disponíveis no estágio externo nomeado especificado na configuração de
[ WITH ] LOCATION =
.TRUE
O Snowflake permite acionar a atualização automática dos metadados da tabela de diretório.
FALSE
O Snowflake não permite acionar atualizações automáticas dos metadados da tabela de diretório. Você deve atualizar manualmente os metadados da tabela de diretório periodicamente usando ALTER STAGE … REFRESH para sincronizar os metadados com a lista atual de arquivos no caminho do estágio.
Padrão:
FALSE
Amazon S3
AWS_SNS_TOPIC = '<arn_tópico_sns>'
Especifica o ARN para o tópico SNS do seu bucket S3. A instrução CREATE da tabela de diretório inscreve a fila SQS do Snowflake no tópico SNS especificado.
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://load/files/'
STORAGE_INTEGRATION = my_storage_int
DIRECTORY = (
ENABLE = true
AUTO_REFRESH = true
AWS_SNS_TOPIC = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket'
);
Quando arquivos de dados novos ou atualizados são adicionados ao local de armazenamento na nuvem, a notificação de evento informa ao Snowflake para verificá-los nos metadados da tabela de diretório.
Etapa 3: atualizar manualmente os metadados da tabela de diretório¶
Atualize os metadados em uma tabela de diretório manualmente usando o comando ALTER STAGE.
ALTER STAGE [ IF EXISTS ] <name> REFRESH [ SUBPATH = '<relative-path>' ]
Onde:
REFRESH
Acessa os arquivos de dados preparados referenciados na definição da tabela de diretório e atualiza os metadados da tabela:
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.
Atualmente, é necessário executar este comando cada vez que arquivos são adicionados ao estágio, atualizados ou descartados. Esta etapa sincroniza os metadados com o último conjunto de arquivos associados na definição do estágio para a tabela de diretório.
SUBPATH = '<relative-path>'
Opcionalmente, especifique um caminho relativo para atualizar os metadados de um subconjunto específico dos arquivos de dados.
Por exemplo, atualize manualmente os metadados da tabela de diretório em um estágio chamado mystage
:
ALTER STAGE mystage REFRESH;
Importante
Se esta etapa não for concluída com sucesso pelo menos uma vez após a criação da tabela de diretório, a consulta da tabela de diretório não retornará nenhum resultado até que um evento de notificação acione os metadados da tabela de diretório para serem atualizados automaticamente pela primeira vez.
Etapa 4: configurar a segurança¶
Para cada função adicional que será usada para consultar a tabela de diretório, 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 |