

# Demonstração: configurar um bucket para notificações (tópico do SNS ou fila do SQS)
<a name="ways-to-add-notification-config-to-bucket"></a>

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 obter mais informações, consulte [Habilitar o Amazon EventBridge](enable-event-notifications-eventbridge.md).

**Topics**
+ [Resumo da demonstração](#notification-walkthrough-summary)
+ [Etapa 1: Criar uma fila do Amazon SQS](#step1-create-sqs-queue-for-notification)
+ [Etapa 2: Criar um tópico do Amazon SNS](#step1-create-sns-topic-for-notification)
+ [Etapa 3: Adicionar a configuração de notificação para o bucket](#step2-enable-notification)
+ [Etapa 4: Testar a configuração](#notification-walkthrough-1-test)

## Resumo da demonstração
<a name="notification-walkthrough-summary"></a>

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](how-to-enable-disable-notification-intro.md).

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

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

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

## Etapa 1: Criar uma fila do Amazon SQS
<a name="step1-create-sqs-queue-for-notification"></a>

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](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-getting-started.html) no *Guia do desenvolvedor do Amazon Simple Queue Service*. 

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

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

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

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Id": "example-ID",
          "Statement": [
              {
                  "Sid": "example-statement-ID",
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "s3.amazonaws.com"
                  },
                  "Action": [
                      "SQS:SendMessage"
                  ],
                  "Resource": "{{arn:aws:sqs:us-west-2:111122223333:s3-notification-queue}}",
                  "Condition": {
                      "ArnLike": {
                          "aws:SourceArn": "arn:aws:s3:*:*:{{awsexamplebucket1}}"
                      },
                      "StringEquals": {
                          "aws:SourceAccount": "{{bucket-owner-123456789012}}"
                      }
                  }
              }
          ]
      }
      ```

------

   1. Escolha **Salvar**.

1. (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. 

------
#### [ JSON ]

****  

   ```
   {
       "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:
   + [Gerenciamento de chaves](https://docs.aws.amazon.com/sns/latest/dg/sns-key-management.html) no *Guia do desenvolvedor do Amazon Simple Notification Service*.
   + [Gerenciamento de chaves](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-key-management.html) no *Guia do desenvolvedor do Amazon Simple Queue Service*.

1. 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
<a name="step1-create-sns-topic-for-notification"></a>

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](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) no *Guia do desenvolvedor do Amazon Simple Notification Service*. 

1. 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](https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html) 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. 

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

1. 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
<a name="step2-enable-notification"></a>

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 for Java e .NET.

### Opção A: habilitar notificações em um bucket usando o console
<a name="step2-enable-notification-using-console"></a>

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](enable-event-notifications.md). 

### Opção B: habilitar notificações em um bucket usando os AWS SDKs
<a name="step2-enable-notification-using-awssdk-dotnet"></a>

------
#### [ .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](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) 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 ]

Para ver exemplos de como configurar notificações de bucket com o AWS SDK para Java, consulte [Process S3 event notifications](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_Scenario_ProcessS3EventNotification_section.html) na *Referência de API do Amazon S3*.

------

## Etapa 4: Testar a configuração
<a name="notification-walkthrough-1-test"></a>

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](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-getting-started.htmlReceiveMessage.html) na *seção “Conceitos básicos” do Guia do desenvolvedor do Amazon Simple Queue Service*. 