Criar uma integração de eventos do S3 para copiar automaticamente arquivos de buckets do Amazon S3 - Amazon Redshift

Criar uma integração de eventos do S3 para copiar automaticamente arquivos de buckets do Amazon S3

nota

A versão de pré-visualização para cópia automática foi encerrada. Consequentemente, os clusters de visualização serão removidos automaticamente trinta dias após o término do período de visualização. Se você planeja continuar usando a cópia automática, recomendamos recriar seus trabalhos de cópia automática existentes em outro cluster do Amazon Redshift. Não é possível fazer a atualização de um cluster de visualização prévia para a versão mais recente do Amazon Redshift.

Você pode usar uma tarefa de cópia automática para carregar dados em suas tabelas do Amazon Redshift usando arquivos armazenados no Amazon S3. O Amazon Redshift detecta quando novos arquivos do Amazon S3 são adicionados ao caminho especificado em seu comando COPY. Depois, um comando COPY é executado automaticamente sem que você precise criar um pipeline externo de ingestão de dados. O Amazon Redshift mantém o controle de quais arquivos foram carregados. O Amazon Redshift determina o número de arquivos agrupados por comando COPY. Você pode ver os comandos COPY resultantes nas visualizações do sistema.

O primeiro passo para criar um COPY JOB automático é criar uma integração de eventos do S3. Quando um novo arquivo aparece no bucket de origem do Amazon S3, o Amazon Redshift gerencia o carregamento dos arquivos no banco de dados usando o comando COPY.

Pré-requisitos para criar uma integração de eventos do S3

Para configurar a integração de eventos do S3, confirme se os pré-requisitos a seguir foram atendidos.

  • O bucket do Amazon S3 deve ter uma política de bucket que conceda diversas permissões do Amazon S3. Por exemplo, a política de exemplo a seguir concede permissões para o bucket de recursos amzn-s3-demo-bucket que está hospedado em us-east-1. Tanto o bucket do Amazon S3 quanto a integração estão na mesma Região da AWS.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Auto-Copy-Policy-01", "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": [ "s3:GetBucketNotification", "s3:PutBucketNotification", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition": { "StringLike": { "aws:SourceArn": "arn:aws:redshift:us-east-1:123456789012:integration:*", "aws:SourceAccount": "123456789012" } } } ] }
  • O cluster provisionado do Amazon Redshift de destino ou o namespace do Redshift sem servidor deve ter permissão para o bucket. Confirme se o perfil do IAM associado ao cluster ou namespace sem servidor tem uma política do IAM que concede as permissões adequadas. A política deve permitir s3:GetObject para um recurso de bucket, como amzn-s3-demo-bucket, e s3:ListBucket para um recurso de bucket e o respectivo conteúdo, como amzn-s3-demo-bucket/*.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AutoCopyReadId", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*" ] } ] }

    Adicione a política a um perfil do IAM que tenha uma relação de confiança para o perfil da seguinte maneira:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "redshift.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }

    Se o data warehouse de destino for um cluster provisionado, você poderá associar um perfil do IAM ao cluster provisionado usando o console do Amazon Redshift na guia Permissões do cluster nos detalhes do cluster. Para obter informações sobre como associar um perfil ao cluster provisionado, consulte Associar funções do IAM a clusters no Guia de gerenciamento do Amazon Redshift.

    Se o data warehouse de destino for o Redshift sem servidor, você poderá associar o perfil do IAM ao namespace sem servidor usando o console do Redshift sem servidor, na guia Segurança e criptografia nos detalhes do namespace. Para obter informações sobre como associar um perfil ao namespace sem servidor, consulte Conceder as permissões necessárias para o Amazon Redshift Serverless no Guia de gerenciamento do Amazon Redshift.

  • O data warehouse do Amazon Redshift também deve ter uma política de recursos que permita o bucket do Amazon S3. Se você usar o console do Amazon Redshift, ao criar a integração de eventos do S3, o Amazon Redshift fornecerá a opção Corrigir para mim para adicionar essa política ao data warehouse do Amazon Redshift. Para atualizar uma política de recursos, você pode usar o comando put-resource-policy da AWS CLI. Por exemplo, para anexar uma política de recursos ao cluster provisionado do Amazon Redshift e realizar uma integração de eventos do S3 com um bucket do Amazon S3, execute o comando da AWS CLI semelhante ao apresentado abaixo. O exemplo a seguir mostra uma política para um namespace de cluster provisionado na Região da AWS us-east-1 referente à conta de usuário 123456789012. O nome do bucket é amzn-s3-demo-bucket.

    aws redshift put-resource-policy \ --policy file://rs-rp.json \ --resource-arn "arn:aws:redshift: us-east-1:123456789012:namespace/cc4ffe56-ad2c-4fd1-a5a2-f29124a56433"

    Onde rs-rp.json contém:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "redshift:AuthorizeInboundIntegration", "Resource": "arn:aws:redshift:us-east-1:123456789012:namespace/cc4ffe56-ad2c-4fd1-a5a2-f29124a56433", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket" } } }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/myRedshiftRole" }, "Action": "redshift:CreateInboundIntegration", "Resource": "arn:aws:redshift:us-east-1:123456789012:namespace/cc4ffe56-ad2c-4fd1-a5a2-f29124a56433", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket" } } } ] }

    Para anexar uma política de recursos ao namespace do Redshift sem servidor e realizar uma integração de eventos do S3 com um bucket do Amazon S3, execute um comando da AWS CLI semelhante ao apresentado abaixo. O exemplo a seguir mostra uma política para um namespace sem servidor na Região da AWS us-east-1 referente à conta de usuário 123456789012. O nome do bucket é amzn-s3-demo-bucket.

    aws redshift put-resource-policy \ --policy file://rs-rp.json \ --resource-arn "arn:aws:redshift-serverless:us-east-1:123456789012:namespace/namespace-1"

    Onde rs-rp.json contém:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "redshift:AuthorizeInboundIntegration", "Resource": "arn:aws:redshift-serverless:us-east-1:123456789012:namespace/namespace-1", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket" } } }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/myUser" }, "Action": "redshift:CreateInboundIntegration", "Resource": "arn:aws:redshift-serverless:us-east-1:123456789012:namespace/namespace-1", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket" } } } ] }

Criar uma integração de eventos do S3

Para configurar o trabalho de cópia, primeiro defina uma integração de eventos do S3.

Amazon Redshift console
Como criar uma integração de eventos do Amazon S3 no console do Amazon Redshift
  1. Faça login no AWS Management Console e abra o console do Amazon Redshift em https://console.aws.amazon.com/redshiftv2/.

  2. No painel de navegação à esquerda, selecione Integração de eventos do S3.

  3. Escolha Criar integração de eventos do Amazon S3 para abrir o assistente e criar uma integração de eventos do S3 para usar com cópia automática. O bucket de origem do Amazon S3 e o data warehouse de destino do Amazon Redshift devem estar na mesma Região da AWS. Especifique as seguintes informações ao executar as etapas para criar uma integração:

    • Nome da integração: é um identificador exclusivo entre todas as integrações de propriedade da Conta da AWS na Região da AWS atual.

    • Descrição: é um texto que descreve a integração de eventos do Amazon S3 para referência posterior.

    • Bucket do S3 de origem: o bucket do Amazon S3 está na Conta da AWS e Região da AWS atual, que é a origem dos dados de ingestão no Amazon Redshift.

    • Data warehouse do Amazon Redshift: é o cluster provisionado do Amazon Redshift de destino ou o grupo de trabalho do Redshift sem servidor que recebe os dados da integração.

      Se o Amazon Redshift de destino estiver na mesma conta, você poderá selecionar o destino. Se o destino estiver em uma conta diferente, especifique o ARN do data warehouse do Amazon Redshift. O destino deve ter uma política de recursos com entidades principais autorizadas e origem de integração. Se você não tiver as políticas de recursos corretas no destino e ele estiver na mesma conta, selecione a opção Corrigir isso para mim para aplicar automaticamente as políticas de recursos durante o processo de criação da integração. Se o destino estiver em uma Conta da AWS diferente, você precisará aplicar manualmente a política de recursos no warehouse do Amazon Redshift.

  4. Insira até 50 Chaves de tag e com um valor opcional para fornecer metadados adicionais sobre a integração.

  5. É exibida uma página de revisão na qual você pode selecionar Criar integração de eventos do S3.

AWS CLI

Para criar uma integração de eventos do Amazon S3 usando a AWS CLI, use o comando create-integration com as seguintes opções:

  • integration-name: especifique um nome para a integração.

  • source-arn: especifique o ARN do bucket de origem do Amazon S3.

  • target-arn: especifique o ARN do namespace do cluster provisionado do Amazon Redshift ou do destino do grupo de trabalho do Redshift sem servidor.

O exemplo a seguir cria uma integração fornecendo o nome da integração, o ARN de origem e o ARN de destino. A integração não é criptografada.

aws redshift create-integration \ --integration-name s3-integration \ --source-arn arn:aws:s3:us-east-1::s3-example-bucket \ --target-arn arn:aws:redshift:us-east-1:123456789012:namespace:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222 { "IntegrationArn": "arn:aws:redshift:us-east-1:123456789012:integration:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111", "IntegrationName": "s3-integration", "SourceArn": "arn:aws:s3:::s3-example-bucket", "SourceType": "s3-event-notifications", "TargetArn": "arn:aws:redshift:us-east-1:123456789012:namespace:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222", "Status": "creating", "Errors": [], "CreateTime": "2024-10-09T19:08:52.758000+00:00", "Tags": [] }

Você também pode usar os comandos da AWS CLI a seguir para gerenciar sua integração de eventos do S3.

  • delete-integration: especifique um ARN de integração para excluir uma integração de eventos do S3.

  • modify-integration: especifique um ARN de integração para alterar o nome ou a descrição (ou ambos) de uma integração de eventos do S3.

  • describe-integrations: especifique um ARN de integração para visualizar as propriedades de uma integração de eventos do S3.

Consulte o Guia de CLI do Amazon Redshift para obter mais informações sobre esses comandos.

O Amazon Redshift então cria uma integração de eventos do S3 com a origem e o destino associados, o status e as informações sobre o status de um trabalho de cópia automática correspondente. Você pode visualizar informações sobre uma integração de eventos do S3 no console do Amazon Redshift escolhendo Integrações de eventos do S3 e selecionando a integração para mostrar os detalhes. As integrações são separadas entre aquelas criadas Na minha conta e De outras contas. A lista Na minha conta mostra integrações em que a origem e o destino estão na mesma conta. A lista De outras contas mostra integrações em que a origem pertence a outra conta.

Se você excluir uma integração de eventos do S3, o status correspondente do COPY JOB mudará de 1 (ativo) para 0 (inativo/pendente). Entretanto, o COPY JOB correspondente não é descartado automaticamente. Se mais tarde você tentar criar um COPY JOB com o mesmo nome, poderá haver um conflito.

Criar e monitorar um COPY JOB

Depois que a integração for criada, na página Detalhes da integração de eventos do S3 da integração que você criou, selecione Criar tarefa de cópia automática para acessar o Editor de Consultas V2 do Amazon Redshift, no qual você pode criar a tarefa de cópia automática para a integração. O Amazon Redshift compara o bucket na cláusula FROM na instrução COPY JOB CREATE com o bucket usado na integração de eventos do S3. Para obter mais informações sobre o Editor de Consultas V2 do Amazon Redshift, acesse Consultar um banco de dados usando o Editor de Consultas V2 no Guia de gerenciamento do Amazon Redshift. Por exemplo, execute o comando COPY a seguir no Editor de Consultas V2 para criar um COPY JOB automático que associe o bucket s3://amzn-s3-demo-bucket/staging-folder do Amazon S3 a uma integração de eventos do Amazon S3.

COPY public.target_table FROM 's3://amzn-s3-demo-bucket/staging-folder' IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName' JOB CREATE my_copy_job_name AUTO ON;

Você define um COPY JOB uma vez. Os mesmos parâmetros serão usados em execuções futuras.

Para definir e gerenciar um COPY JOB, você deve ter permissão. Para obter informações sobre como conceder e revogar permissão em um COPY JOB, consulte GRANT e REVOKE. Para obter mais informações sobre como conceder e revogar permissões com escopo definido para um COPY JOB, consulte Concessão de permissões em escopo e Revogação de permissões em escopo.

Você gerencia as operações de carregamento usando as opções CREATE, LIST, SHOW, DROP, ALTER e RUN para trabalhos. Para ter mais informações, consulte COPY JOB.

Você pode consultar as visualizações do sistema para ver o status e o progresso de COPY JOB. As visualizações são fornecidas da seguinte forma:

Para obter informações sobre como solucionar erros de integração de eventos do S3, consulte Solução de problemas de integração de eventos do S3 e erros de COPY JOB.

Para obter a lista de arquivos carregados por um COPY JOB, execute o seguinte SQL, mas primeiro substitua <job_id>:

SELECT job_id, job_name, data_source, copy_query, filename, status, curtime FROM sys_copy_job copyjob JOIN stl_load_commits loadcommit ON copyjob.job_id = loadcommit.copy_job_id WHERE job_id = <job_id>;

Considerações ao criar uma integração de eventos do S3 para cópia automática

Considere o seguinte ao usar a cópia automática:

  • Você pode criar no máximo 200 COPY JOBS para cada cluster ou grupo de trabalho em uma Conta da AWS.

  • Você pode criar no máximo 50 integrações de eventos do S3 para cada destino do Amazon Redshift.

  • Não é possível criar uma integração de eventos do S3 com um bucket de origem do Amazon S3 que tenha um ponto (.) no nome do bucket.

  • Só é possível criar uma integração de eventos do S3 entre a mesma origem e destino. Ou seja, só pode haver uma integração de eventos do S3 entre um bucket do Amazon S3 e um data warehouse do Amazon Redshift por vez.

  • Você não pode ter nenhuma notificação de evento existente para o tipo de evento S3_OBJECT_CREATED que esteja definido no bucket de origem do Amazon S3. No entanto, após a criação de uma integração de eventos do S3, é possível atualizar a notificação de eventos do bucket do Amazon S3 usando um prefixo/sufixo com um escopo mais restrito. Dessa forma, você também pode configurar S3_OBJECT_CREATED para outro prefixo/sufixo de outros destinos e evitar um conflito com a integração de eventos do S3. Se você enfrentar problemas em que a cópia automática não estava sendo executada como esperado, prepare o log do AWS CloudTrail da ação s3:PutBucketNotificationConfiguration no bucket do S3 para o período em questão ao entrar em contato com o AWS Support.