Fase 1: Verifica della capacità dell'endpoint di elaborare messaggi Amazon SNS - Amazon Simple Notification Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Fase 1: Verifica della capacità dell'endpoint di elaborare messaggi Amazon SNS

Prima di effettuare la sottoscrizione dell'endpoint HTTP o HTTPS a un argomento, devi verificare che l'endpoint sia in grado di gestire le richieste HTTP POST che Amazon SNS usa per inviare la conferma della sottoscrizione e i messaggi di notifica. In genere questo significa creare e distribuire un'applicazione Web (ad esempio, un servlet Java se l'host dell'endpoint esegue Linux con Apache e Tomcat) che elabori le richieste HTTP di Amazon SNS. Quando effettui la sottoscrizione di un endpoint HTTP, Amazon SNS invia una richiesta di conferma della sottoscrizione. L'endpoint deve essere preparato a ricevere ed elaborare la richiesta quando crei la sottoscrizione perché Amazon SNS la invia in quel momento. Amazon SNS non invierà notifiche all'endpoint fino alla conferma della sottoscrizione. Una volta confermata la sottoscrizione, Amazon SNS invierà le notifiche all'endpoint quando verrà eseguita un'operazione di pubblicazione sull'argomento sottoscritto.

Per impostare l'endpoint in modo che elabori i messaggi di conferma della sottoscrizione e di notifica
  1. Il tuo codice deve leggere le intestazioni HTTP delle richieste HTTP POST che Amazon SNS invia all'endpoint, Il codice deve cercare il campo di intestazione x-amz-sns-message-type che indica il tipo di messaggio inviato da Amazon SNS. In base all'intestazione puoi determinare il tipo di messaggio senza dover analizzare il corpo della richiesta HTTP. Sono due i tipi che devi gestire: SubscriptionConfirmation e Notification. Il messaggio UnsubscribeConfirmation viene utilizzato solo quando la sottoscrizione viene eliminata dall'argomento.

    Per i dettagli sull'intestazione HTTP, consulta Intestazioni HTTP/HTTPS. La seguente richiesta HTTP POST è un esempio di messaggio di conferma della sottoscrizione.

    POST / HTTP/1.1 x-amz-sns-message-type: SubscriptionConfirmation x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic Content-Length: 1336 Content-Type: text/plain; charset=UTF-8 Host: example.com Connection: Keep-Alive User-Agent: Amazon Simple Notification Service Agent { "Type" : "SubscriptionConfirmation", "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b", "Token" : "2336412f37f...", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.", "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37...", "Timestamp" : "2012-04-26T20:45:04.751Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEpH+...", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem" }
  2. Il codice deve analizzare il documento JSON nel corpo della richiesta HTTP POST e il tipo di contenuti di testo per leggere le coppie nome/valore che costituiscono il messaggio Amazon SNS. Usa un parser JSON in grado di gestire la conversione della rappresentazione con escape dei caratteri di controllo nei corrispondenti valori ASCII (ad esempio, la conversione di \n in un carattere di nuova riga). Puoi utilizzare un parser JSON esistente come il processore Jackson JSON o scriverne uno personalizzato. Per inviare il testo nei campi dell'oggetto e del messaggio come codice JSON valido, Amazon SNS deve convertire alcuni caratteri di controllo in rappresentazioni con escape che possono essere incluse nel documento JSON. Quando ricevi il documento JSON nel corpo della richiesta POST inviata all'endpoint, devi riconvertire i caratteri con escape nei valori originali se vuoi una rappresentazione esatta dell'oggetto e dei messaggi originali pubblicati nell'argomento. Questo è un aspetto critico se desideri verificare la firma di una notifica, perché la firma usa il messaggio e l'oggetto nel formato originale come parte della stringa di firma.

  3. Il codice deve verificare l'autenticità di un messaggio di notifica, di conferma della sottoscrizione o di conferma di annullamento della sottoscrizione inviato da Amazon SNS. Utilizzando le informazioni contenute nel messaggio Amazon SNS, l'endpoint può ricreare la firma per consentirti di verificare i contenuti del messaggio mettendo in corrispondenza la tua firma con la firma che Amazon SNS ha inviato con il messaggio. Per ulteriori informazioni sulla verifica della firma di un messaggio, consulta Verifica delle firme dei messaggi Amazon SNS.

  4. In base al tipo specificato dal campo di intestazione x-amz-sns-message-type, il codice deve leggere il documento JSON contenuto nel corpo della richiesta HTTP ed elaborare il messaggio. Di seguito sono riportate le linee guida per gestire i due tipi di messaggi principali:

    SubscriptionConfirmation

    Leggi il valore di SubscribeURL e visita l'URL. Per confermare la sottoscrizione e iniziare a ricevere notifiche presso l'endpoint, devi visitare l'SubscribeURLURL (ad esempio inviando all'URL una richiesta HTTP GET). Fai riferimento all'esempio di richiesta HTTP nella fase precedente per vedere l'aspetto di SubscribeURL. Per ulteriori informazioni sul formato del messaggio SubscriptionConfirmation, consulta Conferma sottoscrizione HTTP/HTTPS in formato JSON. Quando visiterai l'URL, otterrai una risposta simile al documento XML seguente. Il documento restituisce l'ARN della sottoscrizione dell'endpoint nell'elemento ConfirmSubscriptionResult.

    <ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/"> <ConfirmSubscriptionResult> <SubscriptionArn>arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55</SubscriptionArn> </ConfirmSubscriptionResult> <ResponseMetadata> <RequestId>075ecce8-8dac-11e1-bf80-f781d96e9307</RequestId> </ResponseMetadata> </ConfirmSubscriptionResponse>

    Anziché visitare SubscribeURL, puoi confermare la sottoscrizione utilizzando l'operazione ConfirmSubscription con il valore Token impostato sul corrispondente valore nel messaggio SubscriptionConfirmation. Se desideri che solo il proprietario dell'argomento e il proprietario della sottoscrizione possano annullare la sottoscrizione dell'endpoint, chiama l'operazione ConfirmSubscription con una firma AWS.

    Notifica

    Leggi i valori di Subject e Message per ottenere le informazioni sulla notifica pubblicate nell'argomento.

    Per i dettagli sul formato del messaggio Notification, consulta Intestazioni HTTP/HTTPS. La richiesta HTTP POST seguente è un esempio di messaggio di notifica inviato all'endpoint example.com.

    POST / HTTP/1.1 x-amz-sns-message-type: Notification x-amz-sns-message-id: 22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324 x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96 Content-Length: 773 Content-Type: text/plain; charset=UTF-8 Host: example.com Connection: Keep-Alive User-Agent: Amazon Simple Notification Service Agent { "Type" : "Notification", "MessageId" : "22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Subject" : "My First Message", "Message" : "Hello world!", "Timestamp" : "2012-05-02T00:54:06.655Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEw6JRN...", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem", "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96" }
  5. Assicurati che l'endpoint risponda al messaggio HTTP POST ricevuto da Amazon SNS con il codice di stato appropriato. La connessione scade dopo 15 secondi. Se l'endpoint non risponde prima del timeout della connessione o restituisce un codice di stato non compreso nell'intervallo 200–4xx, Amazon SNS considera la consegna del messaggio come tentativo non riuscito.

  6. Assicurati che il codice possa gestire tentativi ripetuti di consegna del messaggio da parte di Amazon SNS. Se Amazon SNS non riceve una risposta positiva dall'endpoint, tenta di consegnare nuovamente il messaggio. Ciò vale per tutti i messaggi, incluso il messaggio di conferma della sottoscrizione. Per default, se la consegna iniziale del messaggio non riesce, Amazon SNS ritenta fino a tre volte, con un intervallo di 20 secondi tra tentativi non riusciti.

    Nota

    La richiesta del messaggio scade dopo 15 secondi. Questo significa che, se la mancata consegna del messaggio è stata causata da un timeout, Amazon SNS riprova circa 35 secondi dopo il precedente tentativo non riuscito. È possibile impostare una policy di consegna diversa per l'endpoint.

    Amazon SNS utilizza il campo di intestazione x-amz-sns-message-id per identificare in modo univoco ogni messaggio pubblicato su un argomento Amazon SNS. Tramite il confronto degli ID dei messaggi elaborati con i messaggi in entrata, puoi determinare se il messaggio è un tentativo ripetuto.

  7. Se sottoscrivi un endpoint HTTPS, assicurati che l'endpoint disponga di un certificato server di un'autorità di certificazione (CA) attendibile. Amazon SNS invia messaggi solo agli endpoint HTTPS che dispongono di un certificato server firmato da una CA che Amazon SNS ritiene attendibile.

  8. Distribuisci il codice creato per ricevere i messaggi Amazon SNS. Quando effettui la sottoscrizione dell'endpoint, questo deve essere pronto a ricevere almeno il messaggio di conferma della sottoscrizione.