Demonstração: configurar um bucket para notificações (tópico do SNS ou fila do SQS) - Amazon Simple Storage Service

Demonstração: configurar um bucket para notificações (tópico do SNS ou fila do SQS)

Você pode receber notificações do Amazon S3 usando o Amazon Simple Notification Service (Amazon SNS) ou o Amazon Simple Queue Service (Amazon SQS). Nesta demonstração, você adiciona uma configuração de notificação ao seu bucket usando um tópico do Amazon SNS e uma fila do Amazon SQS.

nota

As filas FIFO (primeiro entrar, primeiro a sair) do Amazon Simple Queue Service não são compatíveis como destino de notificação de evento do Amazon S3. Para enviar uma notificação de um evento do Amazon S3 para uma fila FIFO do Amazon SQS, você pode usar o Amazon EventBridge. Para ter mais informações, consulte Habilitar o Amazon EventBridge.

Resumo da demonstração

Esta demonstração ajuda você a fazer o seguinte:

  • Publicar eventos do tipo s3:ObjectCreated:* em uma fila do Amazon SQS.

  • Publicar eventos do tipo s3:ReducedRedundancyLostObject em um tópico do Amazon SNS.

Para obter informações sobre configuração de notificação, consulte Usar o Amazon SQS, o Amazon SNS e o Lambda.

Você pode executar todas essas etapas usando o console, sem escrever nenhum código. Além disso, exemplos de código, que usam os AWS SDKs para Java e .NET, também são fornecidos para ajudar a adicionar configurações de notificação de maneira programática.

Este procedimento inclui as seguintes etapas:

  1. Crie uma fila do Amazon SQS.

    Usando o console do Amazon SQS, crie uma fila do SQS. É possível acessar todas as mensagens que o Amazon S3 envia à fila de forma programática. Porém, para esta demonstração, verifique as mensagens de notificação no console.

    Anexe uma política de acesso à fila para conceder ao Amazon S3 permissão para postar mensagens.

  2. Crie um tópico do Amazon SNS.

    Usando o console do Amazon SNS, crie um tópico do SNS e assine o tópico. Assim, todos os eventos postados nele são entregues a você. Especifique o e-mail como o protocolo de comunicações. Depois de criar um tópico, o Amazon SNS envia um e-mail. Use o link no e-mail para confirmar a assinatura do tópico.

    Anexe uma política de acesso ao tópico para conceder ao Amazon S3 permissão para postar mensagens.

  3. Adicione a configuração de notificação a um bucket.

Etapa 1: Criar uma fila do Amazon SQS

Siga as etapas para criar e assinar uma fila do Amazon Simple Queue Service (Amazon SQS).

  1. Usando o console do Amazon SQS, crie uma fila. Para obter instruções, consulte Conceitos básicos do Amazon SQS no Guia do desenvolvedor do Amazon Simple Queue Service.

  2. Substitua a política de acesso que está anexada à fila pela política a seguir.

    1. No console do Amazon SQS, na lista Queues (Filas), escolha o nome da fila.

    2. Na guia Access policy (Política de acesso), escolha Edit (Editar).

    3. Substitua a política de acesso que está anexada à fila. Nele, forneça o ARN do Amazon SQS, o nome do bucket de origem e o ID da conta do proprietário do bucket.

      { "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "SQS:SendMessage" ], "Resource": "SQS-queue-ARN", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:awsexamplebucket1" }, "StringEquals": { "aws:SourceAccount": "bucket-owner-account-id" } } } ] }
    4. Escolha Salvar.

  3. (Opcional) Se a fila do Amazon SQS ou o tópico do Amazon SNS for habilitado para criptografia no lado do servidor com o AWS Key Management Service (AWS KMS), adicione a política a seguir à chave de criptografia simétrica correspondente gerenciada pelo cliente.

    Adicione a política a uma chave gerenciada pelo cliente porque você não pode modificar a chave gerenciada pela AWS para o Amazon SQS ou o Amazon SNS.

    { "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" } ] }

    Para obter mais informações sobre como usar o SSE para o Amazon SQS e o Amazon SNS com o AWS KMS, consulte:

  4. Anotar o ARN da fila.

    A fila do SQS que você criou é outro recurso em sua Conta da AWS. Ele tem um nome do recurso da Amazon (ARN) exclusivo. Esse ARN será necessário na próxima etapa. O ARN tem este formato:

    arn:aws:sqs:aws-region:account-id:queue-name

Etapa 2: Criar um tópico do Amazon SNS

Siga as etapas para criar e assinar um tópico do Amazon SNS.

  1. Usando o console do Amazon SNS, crie um tópico. Para obter instruções, consulte Criação de um tópico do Amazon SNS no Guia do desenvolvedor do Amazon Simple Notification Service.

  2. Inscreva-se no tópico. Neste exercício, use o e-mail como o protocolo de comunicação. Para obter instruções, consulte Assinatura de um tópico do Amazon SNS no Guia do desenvolvedor do Amazon Simple Notification Service.

    Você receberá um e-mail solicitando a confirmação da assinatura do tópico. Confirme a assinatura.

  3. Substitua a política de acesso anexada ao tópico pela seguinte política. Nele, forneça o ARN do tópico SNS, o nome do bucket de origem e o ID da conta do proprietário do bucket.

    { "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "Example SNS topic policy", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "SNS:Publish" ], "Resource": "SNS-topic-ARN", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:amzn-s3-demo-bucket" }, "StringEquals": { "aws:SourceAccount": "bucket-owner-account-id" } } } ] }
  4. Anote o ARN do tópico.

    O tópico do SNS que você criou é outro recurso em sua Conta da AWS e tem um ARN exclusivo. Você precisará desse ARN na próxima etapa. O ARN terá o seguinte formato:

    arn:aws:sns:aws-region:account-id:topic-name

Etapa 3: Adicionar a configuração de notificação para o bucket

Você pode habilitar notificações de bucket usando o console do Amazon S3 ou de forma programática usando os AWS SDKs. Escolha qualquer uma das opções para configurar notificações no bucket. Esta seção fornece exemplos de código que usam os AWS SDKs para Java e .NET.

Opção A: habilitar notificações em um bucket usando o console

Usando o console do Amazon S3, adicione uma configuração de notificação solicitando que o Amazon S3 faça o seguinte:

  • Publique eventos do tipo Todos os eventos criados por objetos na fila do Amazon SQS.

  • Publique eventos do tipo Objeto em RRS perdido no tópico do Amazon SNS.

Depois de salvar a configuração de notificação, o Amazon S3 posta uma mensagem de teste, que você recebe via e-mail.

Para obter instruções, consulte Habilitar e configurar notificações de eventos usando o console do Amazon S3.

Opção B: habilitar notificações em um bucket usando os AWS SDKs

.NET

O exemplo de código C# a seguir fornece uma lista completa de códigos que adicionam uma configuração de notificação a um bucket. Você deve atualizar o código e fornecer o nome do bucket e o ARN do tópico do SNS. Para obter informações sobre como configurar e executar exemplos de código, consulte Conceitos básicos do AWS SDK for .NET no Guia do desenvolvedor do AWS SDK for .NET.

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class EnableNotificationsTest { private const string bucketName = "*** bucket name ***"; private const string snsTopic = "*** SNS topic ARN ***"; private const string sqsQueue = "*** SQS topic ARN ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); EnableNotificationAsync().Wait(); } static async Task EnableNotificationAsync() { try { PutBucketNotificationRequest request = new PutBucketNotificationRequest { BucketName = bucketName }; TopicConfiguration c = new TopicConfiguration { Events = new List<EventType> { EventType.ObjectCreatedCopy }, Topic = snsTopic }; request.TopicConfigurations = new List<TopicConfiguration>(); request.TopicConfigurations.Add(c); request.QueueConfigurations = new List<QueueConfiguration>(); request.QueueConfigurations.Add(new QueueConfiguration() { Events = new List<EventType> { EventType.ObjectCreatedPut }, Queue = sqsQueue }); PutBucketNotificationResponse response = await client.PutBucketNotificationAsync(request); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' ", e.Message); } catch (Exception e) { Console.WriteLine("Unknown error encountered on server. Message:'{0}' ", e.Message); } } } }
Java

O seguinte exemplo mostra como adicionar uma configuração de notificação a um bucket. Consulte instruções sobre como criar e testar uma amostra funcional em Getting Started no Guia do desenvolvedor do AWS SDK for Java.

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.*; import java.io.IOException; import java.util.EnumSet; public class EnableNotificationOnABucket { public static void main(String[] args) throws IOException { String bucketName = "*** Bucket name ***"; Regions clientRegion = Regions.DEFAULT_REGION; String snsTopicARN = "*** SNS Topic ARN ***"; String sqsQueueARN = "*** SQS Queue ARN ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); BucketNotificationConfiguration notificationConfiguration = new BucketNotificationConfiguration(); // Add an SNS topic notification. notificationConfiguration.addConfiguration("snsTopicConfig", new TopicConfiguration(snsTopicARN, EnumSet.of(S3Event.ObjectCreated))); // Add an SQS queue notification. notificationConfiguration.addConfiguration("sqsQueueConfig", new QueueConfiguration(sqsQueueARN, EnumSet.of(S3Event.ObjectCreated))); // Create the notification configuration request and set the bucket notification // configuration. SetBucketNotificationConfigurationRequest request = new SetBucketNotificationConfigurationRequest( bucketName, notificationConfiguration); s3Client.setBucketNotificationConfiguration(request); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }

Etapa 4: Testar a configuração

Agora você pode testar a configuração carregando um objeto no bucket e verificando a notificação de evento no console do Amazon SQS. Para obter instruções, consulte Receber uma mensagem na seção “Conceitos básicos” do Guia do desenvolvedor do Amazon Simple Queue Service.