Explicación: configuración de un bucket para notificaciones (tema de SNS o cola de SQS) - Amazon Simple Storage Service

Explicación: configuración de un bucket para notificaciones (tema de SNS o cola de SQS)

Puede recibir notificaciones de Amazon S3 mediante Amazon Simple Notification Service (Amazon SNS) o Amazon Simple Queue Service (Amazon SQS). En este tutorial, agregue una configuración de notificación al bucket mediante un tema de Amazon SNS y una cola de Amazon SQS.

nota

No se admiten colas FIFO (First-In-First-Out) de Amazon Simple Queue Service como destino de la notificación de eventos de Amazon S3. Para enviar una notificación de un evento de Amazon S3 a una cola FIFO de Amazon SQS, puede utilizar Amazon EventBridge. Para obtener más información, consulte Activación de Amazon EventBridge.

Resumen del tutorial

Esta explicación lo ayuda a hacer lo siguiente:

  • Publique eventos de tipo s3:ObjectCreated:* en una cola de Amazon SQS.

  • que publique eventos de tipo s3:ReducedRedundancyLostObject en un tema de Amazon SNS.

Para obtener información acerca de la configuración de notificación, consulte Uso de Amazon SQS, Amazon SNS y Lambda.

Puede realizar todos estos pasos con la consola sin escribir ningún código. Además, se brindan ejemplos de código con los AWS SDK para Java y .NET, con el fin de ayudarlo a agregar configuraciones de notificación mediante programación.

El procedimiento incluye los pasos siguientes:

  1. Cree una cola de Amazon SQS.

    Con la consola de Amazon SQS, cree una cola de SQS. Puede acceder a cualquier mensaje que Amazon S3 envía a la cola mediante programación. Sin embargo, para esta explicación, va a verificar los mensajes de notificación en la consola.

    Debe asociar una política de acceso a la cola para otorgarle permiso a Amazon S3 para publicar mensajes.

  2. Cree un tema de Amazon SNS.

    Con la consola de Amazon SNS, cree un tema SNS y suscríbase al tema. De esta forma, cualquier evento que se publique en él se le entregará a usted. Debe especificar el correo electrónico como protocolo de comunicación. Después de crear un tema, Amazon SNS envía un correo electrónico. Utilice el enlace del correo electrónico para confirmar la suscripción al tema.

    Debe asociar una política de acceso al tema para otorgarle a Amazon S3 permiso para publicar mensajes.

  3. Añada una configuración de notificación a un bucket.

Paso 1: Crear una cola de Amazon SQS

Siga los pasos para crear y suscribirse a una cola de Amazon Simple Queue Service (Amazon SQS)

  1. Con la consola de Amazon SQS, cree una cola. Para obtener instrucciones, consulte Getting Started with Amazon SQS en la Amazon Simple Queue Service Developer Guide.

  2. Sustituya la política de acceso asociada a la cola por la siguiente política.

    1. En la consola de Amazon SQS, en la lista de colas, elija el nombre de la cola.

    2. En la pestaña Access policy (Política de acceso), elija Edit (Editar).

    3. Sustituya la política de acceso asociada a la cola. En ella, proporcione el ARN de Amazon SQS, el nombre del bucket de origen y el ID de cuenta del propietario del 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. Elija Guardar.

  3. (Opcional) Si la cola de Amazon SQS o el tema de Amazon SNS tienen habilitado el cifrado del lado del servidor con AWS Key Management Service (AWS KMS), agregue la siguiente política a la clave administrada por el cliente de cifrado simétrica.

    Debe agregar la política a una clave administrada por el cliente porque no puede modificar la clave administrada por AWS para Amazon SQS 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 obtener más información acerca del uso de SSE para Amazon SQS y Amazon SNS con AWS KMS, consulte lo siguiente:

  4. Anote el ARN de la cola.

    La cola SQS que creó es otro recurso de la Cuenta de AWS. Tiene un nombre de recurso de Amazon (ARN) único. Necesitará este ARN en el siguiente paso. El ARN tiene el siguiente formato:

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

Paso 2: Crear un tema sobre Amazon SNS

Siga los pasos para crear y suscribirse a un tema de Amazon SNS.

  1. Con la consola de Amazon SNS, cree un tema. Para obtener instrucciones, consulte el tema Creación de un Amazon SNS en la Guía para desarrolladores de Amazon Simple Notification Service.

  2. Suscríbase al tema. Para este ejercicio, utilice el correo electrónico como el protocolo de comunicación. Para obtener instrucciones, consulte el tema Suscribirse a un Amazon SNS en la Guía para desarrolladores de Amazon Simple Notification Service.

    Recibirá un correo electrónico donde deberá confirmar su suscripción al tema. Confirme la suscripción.

  3. Sustituya la política de acceso asociada al tema por la siguiente política. En ella, proporcione el ARN del tema de SNS, el nombre del bucket y el ID de cuenta del propietario del 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:*:*:bucket-name" }, "StringEquals": { "aws:SourceAccount": "bucket-owner-account-id" } } } ] }
  4. Apunte el ARN del tema.

    El tema de SNS que creó es otro recurso de su Cuenta de AWS y tiene un ARN único. Necesitará este ARN en el siguiente paso. El ARN tendrá el siguiente formato:

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

Paso 3: Agregar una configuración de notificación al bucket

Puede habilitar las notificaciones del bucket con la consola de Amazon S3 o mediante programación con los AWS SDK. Seleccione cualquiera de las opciones para configurar las notificaciones en su bucket. En esta sección se brindan ejemplos de códigos en los que se utilizan los AWS SDK para Java y .NET.

Opción A: habilitar notificaciones en un bucket mediante la consola

Mediante la consola de Amazon S3, agregue una configuración de notificación al solicitar a Amazon S3 que realice lo siguiente:

  • Publicar eventos del tipo Todos los objeto crean eventos en su cola de Amazon SQS.

  • Publicar eventos del tipo Objeto perdido en RRS para su tema de Amazon SNS.

Después de guardar la configuración de notificación, Amazon S3 publica un mensaje de prueba que usted recibe por correo electrónico.

Para obtener instrucciones, consulte Habilitación y configuración de notificaciones de eventos mediante la consola de Amazon S3.

Opción B: habilitar notificaciones en un bucket mediante los AWS SDK

.NET

El siguiente ejemplo de código C# brinda un listado completo de códigos que añade una configuración de notificación a un bucket. Debe actualizar el código y proporcionar el nombre del bucket y el ARN del tema de SNS. Para obtener instrucciones acerca de cómo crear y probar una muestra funcional, consulte Ejecución de ejemplos de código .NET de Amazon S3.

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

El siguiente ejemplo muestra cómo añadir una configuración de notificación a un bucket. Para obtener instrucciones acerca de cómo crear y probar una muestra funcional, consulte Prueba de los ejemplos de código de Java de Amazon S3.

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(); } } }

Paso 4: Probar la configuración

Ahora puede cargar un objeto en el bucket y verificar la notificación de eventos en la consola de Amazon SQS para probar la configuración. Para obtener instrucciones, consulte Receiving a Message en la sección "Getting Started" de Amazon Simple Queue Service Developer Guide.