Opção 1: configuração de uma integração de armazenamento do Snowflake para acessar o Amazon S3¶
Este tópico 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 estágio 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.
Neste tópico:
Configuração de acesso seguro ao armazenamento em nuvem¶
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.
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
Nota
As seguintes permissões adicionais são necessárias para realizar ações SQL adicionais:
Permissão |
Ação SQL |
---|---|
|
Descarregue os arquivos no bucket. |
|
Ou purgue automaticamente os arquivos do estágio após um carregamento bem-sucedido ou execute instruções REMOVE para remover os arquivos manualmente. |
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 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 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. Você também pode purgar arquivos de dados usando a opção de cópia PURGE.
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:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "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.
A política a seguir fornece ao Snowflake as permissões necessárias para carregar dados de um único bucket somente leitura e caminho de pasta. A política inclui as permissões
s3:GetBucketLocation
,s3:GetObject
,s3:GetObjectVersion
, es3:ListBucket
:Política alternativa: Carregamento a partir de um bucket S3 somente leitura
{ "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>/*" ] } } } ] }
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.
Etapa 6: criar um estágio externo¶
Crie um estágio externo (ou seja, S3) que faça referência à integração de armazenamento que você criou na Etapa 3: Criar uma integração de armazenamento em nuvem no Snowflake (neste tópico).
Nota
Criar um estágio que utilize uma integração de armazenamento requer uma função que tenha o privilégio CREATE STAGE para o esquema, bem como o privilégio USAGE sobre a integração de armazenamento. Por exemplo:
GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;
GRANT USAGE ON INTEGRATION s3_int TO ROLE myrole;
Crie o estágio usando o comando CREATE STAGE.
Por exemplo, defina mydb.public
como o esquema e banco de dados atual para a sessão do usuário e depois crie um estágio chamado my_s3_stage
. Neste exemplo, o estágio faz referência ao bucket S3 e ao caminho mybucket1/path1
, que são compatíveis com a integração. O estágio também faz referência a um objeto de formato de arquivo nomeado chamado my_csv_format
:
USE SCHEMA mydb.public; CREATE STAGE my_s3_stage STORAGE_INTEGRATION = s3_int URL = 's3://bucket1/path1/' FILE_FORMAT = my_csv_format;
Nota
O proprietário do estágio (ou seja, a função com o privilégio OWNERSHIP no estágio) deve ter o privilégio USAGE sobre a integração de armazenamento.
Coloque uma barra (
/
) no valor do URL para filtrar o caminho de pasta especificado. Se a barra for omitida, todos os arquivos e pastas começando com o prefixo para o caminho especificado serão incluídos.Note que a barra é obrigatória para acessar e recuperar arquivos de dados não estruturados no estágio.
Para carregar ou descarregar dados de ou para um estágio que utiliza uma integração, uma função deve ter o privilégio USAGE sobre o estágio. Não é necessário ter também o privilégio USAGE sobre a integração de armazenamento.
O parâmetro STORAGE_INTEGRATION é tratado separadamente de outros parâmetros de estágio, tais como FILE_FORMAT. O suporte para esses outros parâmetros é o mesmo, independentemente da integração utilizada para acessar seu bucket S3.