Spiegazione passo per passo: configurare un bucket per le notifiche (argomento SNS o coda SQS) - Amazon Simple Storage Service

Spiegazione passo per passo: configurare un bucket per le notifiche (argomento SNS o coda SQS)

Puoi ricevere notifiche Amazon S3 utilizzando Amazon Simple Notification Service (Amazon SNS) o Amazon Simple Queue Service (Amazon SQS). In questa guida, si aggiunge una configurazione di notifica al bucket utilizzando un topic Amazon SNS e una coda Amazon SQS.

Nota

Le code FIFO (First-In-First-Out) di Amazon Simple Queue Service non sono supportate come destinazione delle notifiche degli eventi di Amazon S3. Per inviare una notifica per un evento Amazon S3 a una coda FIFO di Amazon SQS, puoi utilizzare Amazon EventBridge. Per ulteriori informazioni, consulta Abilitazione di Amazon EventBridge.

Riassunto del percorso

Questa spiegazione passo per passo aiuta a completare le seguenti operazioni:

  • Pubblica eventi del tipo s3:ObjectCreated:* su una coda Amazon SQS.

  • Pubblica eventi del tipo s3:ReducedRedundancyLostObject su un argomento Amazon SNS.

Per informazioni sulla configurazione delle notifiche, consulta Utilizzo di Amazon SQS, Amazon SNS e Lambda.

È possibile eseguire tutte queste fasi utilizzando la console, senza scrivere alcun codice. Inoltre, vengono forniti esempi di codice che utilizzano gli SDK AWS per Java e .NET per aiutare l'utente ad aggiungere configurazioni di notifica in modo programmatico.

La procedura include le seguenti fasi:

  1. Creare una coda Amazon SQS.

    Attraverso la console di Amazon SQS, crea una coda SQS. È possibile accedere a tutti i messaggi che Amazon S3 invia alla coda in modo programmatico. Tuttavia, per questa procedura guidata, i messaggi di notifica si verificano nella console.

    Si allega un criterio di accesso alla coda per concedere ad Amazon S3 il permesso di pubblicare i messaggi.

  2. Creare un argomento Amazon SNS.

    Utilizzando la console di Amazon SNS, crea un argomento SNS e iscriviti all'argomento. In questo modo, riceverai tutti gli eventi pubblicati. Si specifica la posta elettronica come protocollo di comunicazione. Dopo aver creato un argomento, Amazon SNS invia un'e-mail. È necessario utilizzare il collegamento nell'e-mail per confermare la sottoscrizione all'argomento.

    Si allega un criterio di accesso all'argomento per concedere ad Amazon S3 l'autorizzazione a pubblicare i messaggi.

  3. Aggiungere una configurazione delle notifiche a un bucket.

Fase 1: creare una coda Amazon SQS

Segui le fasi per creare una coda Amazon Simple Queue Service (Amazon SQS) ed effettuarvi la sottoscrizione.

  1. Utilizzando la console di Amazon SQS, creare una coda. Per istruzioni, consulta la sezione Nozioni di base su Amazon SQS nella Guida per gli sviluppatori di Amazon Simple Queue Service.

  2. Sostituire la policy di accesso allegata alla coda con la policy riportata di seguito.

    1. Nella console Amazon SQS, nell'elenco Code , scegli il nome della coda.

    2. Nella scheda Criteri di accesso , scegli Modifica.

    3. Sostituire la policy di accesso allegata alla coda. Fornisci l'ARN di Amazon SQS, il nome del bucket di origine e l'ID dell'account del proprietario 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. Scegli Salva.

  3. (Facoltativo) Se la coda Amazon SQS o l'argomento Amazon SNS sono abilitati per la crittografia lato server (SSE) con AWS Key Management Service (AWS KMS), aggiungi la policy seguente alla chiave di crittografia simmetrica gestita dal cliente associata.

    È necessario aggiungere il criterio a una chiave gestita dal cliente, perché non è possibile modificare la chiave gestita AWS per 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": "*" } ] }

    Per ulteriori informazioni sull'uso di SSE per Amazon SQS e Amazon SNS con AWS KMS, consulta quanto segue:

  4. Si noti l'ARN della coda.

    La coda SQS creata è un'altra risorsa nel tuo Account AWS. Dispone di un Amazon Resource Name (ARN) univoco. Il presente ARN è necessario nella fase successiva. Il nome ARN presenta il formato seguente:

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

Fase 2: Creare un argomento Amazon SNS

Completa la procedura per creare e sottoscrivere un argomento Amazon SNS.

  1. Utilizzando la console di Amazon SNS, crea un argomento. Per istruzioni, consulta Creazione di un argomento Amazon SNS nella Guida per gli sviluppatori di Amazon Simple Notification Service.

  2. Effettuare la sottoscrizione all'argomento. Per questo esercizio, utilizzare l'e-mail come protocollo di comunicazione. Per le istruzioni, consulta la sezione Sottoscrizione a un argomento di Amazon SNS nella Guida per gli sviluppatori di Amazon Simple Notification Service.

    Si riceverà un'e-mail in cui è richiesto di confermare la sottoscrizione all'argomento. Confermare l'abbonamento.

  3. Sostituire il criterio di accesso allegato all'argomento con il seguente criterio. Fornisci l'ARN dell'argomento SNS, il nome del bucket e l'ID dell'account del proprietario 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:*:*:amzn-s3-demo-bucket" }, "StringEquals": { "aws:SourceAccount": "bucket-owner-account-id" } } } ] }
  4. Si noti l'argomento ARN.

    L'argomento SNS creato è un'altra risorsa nell'Account AWS e possiede un ARN univoco. L'ARN è necessario nella fase successiva. L'ARN ha il formato seguente:

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

Fase 3: aggiungere una configurazione delle notifiche al bucket

È possibile abilitare le notifiche dei bucket utilizzando la console Amazon S3 o in modo programmatico utilizzando gli SDK AWS . Scegliere una delle opzioni per configurare le notifiche nel bucket. Questa sezione fornisce esempi di codice che utilizzano gli SDK AWS per Java e .NET.

Opzione A: abilitare le notifiche in un bucket utilizzando la console

Utilizzando la console di Amazon S3, aggiungi una configurazione di notifica che richiede ad Amazon S3 di:

  • Pubblicare gli eventi di tipo Tutti gli eventi di creazione dell'oggetto nella coda Amazon SQS.

  • Pubblica gli eventi di tipo Oggetto perso in RRS sul tuo argomento Amazon SNS.

Una volta salvata la configurazione delle notifiche, Amazon S3 pubblica un messaggio di testo che viene inviato tramite e-mail.

Per le istruzioni, consulta Attivazione e configurazione delle notifiche di eventi tramite la console di Amazon S3.

Opzione B: Abilitare le notifiche su un bucket usando gli SDK di AWS

.NET

Il seguente esempio di codice C# fornisce un elenco completo del codice che aggiunge una configurazione di notifica a un bucket. È necessario aggiornare il codice e fornire il nome del bucket e l'ARN dell'argomento SNS. Per informazioni sull'impostazione e l'esecuzione degli esempi di codice, consulta Guida all'avvio con AWS SDK per .NET nella Guida allo sviluppo di AWS SDK per .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

L'esempio seguente mostra come aggiungere una configurazione di notifica a un bucket. Per istruzioni su come creare e testare un campione funzionante, consulta Nozioni di base nella Guida per gli sviluppatori di 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(); } } }

Fase 4: Prova della configurazione

Ora è possibile testare la configurazione caricando un oggetto nel bucket e verificando la notifica di eventi nella console di Amazon SQS. Per istruzioni, consulta la sezione Ricezione di un messaggio nella sezione "Nozioni di base" della Guida per gli sviluppatori di Amazon Simple Queue Service.