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:

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

Nota

As seguintes permissões adicionais são necessárias para realizar ações SQL adicionais:

Permissão

Ação SQL

s3:PutObject

Descarregue os arquivos no bucket.

s3:DeleteObject

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:

  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. 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 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: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>/*"
                        ]
                    }
                }
            }
        ]
    }
    
    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.

    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, e s3: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>/*"
                        ]
                    }
                }
            }
        ]
    }
    
    Copy
  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.

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;
Copy

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;
Copy

Nota

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

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

Próximo: Criptografia de arquivo de dados da AWS