sns precio nodejs envio costo cost aws amazon-web-services amazon-sns

amazon-web-services - nodejs - aws sns precio



¿Cómo puedo confirmar la solicitud de suscripción HTTP de amazon SNS? (5)

Antes de configurar la suscripción de punto final HTTP / HTTPS a través de la consola de administración de AWS, debe asegurarse de que el punto final HTTP o HTTPS de su sitio web PHP tenga la capacidad de manejar las solicitudes HTTP POST que genera Amazon SNS. Hay varios tipos de mensajes SNS: confirmación de suscripción , notificación y confirmación de cancelación de suscripción . Su código PHP necesita obtener el encabezado x-amz-sns-message-type de la solicitud y procesarlo según el tipo de mensaje. Para el mensaje de confirmación de suscripción, su aplicación PHP necesita procesar el cuerpo del mensaje POST, que es un documento JSON. Para suscribirse al tema, su código PHP debe visitar el "SubscriberURL" especificado en el cuerpo de JSON. Opcionalmente, debe verificar la firma para asegurarse de la autenticidad del mensaje antes de suscribirse al tema.

Puede encontrar más detalles en la documentación de AWS: http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.html

He estado buscando en toda la web y nada da una respuesta clara para confirmar la solicitud de suscripción de amazon SNS. Ya envié la suscripción desde la consola de Amazon a mi sitio web, pero ¿qué sigue? Estoy usando amazon EC2 como mi servidor con PHP.


Aquí hay una aplicación Express (Node.js) que confirma la suscripción SNS:

const express = require(''express'') const request = require(''request'') // parse urlencoded request bodies into req.body const bodyParser = require(''body-parser'') const app = express() const port = 8080 app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) app.post(''/'', (req, res) => { let body = '''' req.on(''data'', (chunk) => { body += chunk.toString() }) req.on(''end'', () => { let payload = JSON.parse(body) if (payload.Type === ''SubscriptionConfirmation'') { const promise = new Promise((resolve, reject) => { const url = payload.SubscribeURL request(url, (error, response) => { if (!error && response.statusCode == 200) { console.log(''Yess! We have accepted the confirmation from AWS'') return resolve() } else { return reject() } }) }) promise.then(() => { res.end("ok") }) } }) }) app.listen(port, () => console.log(''Example app listening on port '' + port + ''!''))

Para usarlo es necesario instalar los paquetes requeridos:

yarn add express request body-parser

Una vez que confirme la suscripción, AWS enviará una solicitud POST al servidor con el siguiente contenido:

{ "Type": "SubscriptionConfirmation", "MessageId": "XXXXXXXX-1ee3-4de3-9c69-XXXXXXXXXXXX", "Token": "SECRET_TOKEN", "TopicArn": "arn:aws:sns:us-west-2:XXXXXXXXXXXX:ses-test", "Message": "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:XXXXXXXXXXXX:ses-test. To 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:XXXXXXXXXXXX:ses-test&Token=SECRET_TOKEN", "Timestamp": "2018-11-21T19:48:08.170Z", "SignatureVersion": "1", "Signature": "SECRET", "SigningCertURL": "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem" }

La carga útil contiene SubscribeURL que es solicitada por el servidor.


El punto final que ha especificado obtendrá datos del servicio de verificación de puntos finales AWS SNS. El mismo punto final se usará para verificar el punto final y para recibir notificaciones de aws.

Simplemente descargue la entrada enviada por AWS SNS en un archivo de texto como,

$json_write_to_text = json_decode(file_get_contents("php://input"));

Encontrará todos los datos enviados por AWS SNS, pero solo encontrará SubscriptionUrl (que será específico para el punto final que tiene un token válido). Abra este en el navegador para que tenga el estado de confirmación de suscripción. Eso es

Disfrutar.


Resolví esto usando el backend de NodeJS. Digamos que tienes una API como esta en HapiJS (bueno, no importa, puedes tener otra tecnología)

{ method: ''POST'', path: ''/hello'', handler: ( request, reply ) => { reply( Hello.print(request.payload) ); }, config: { tags: [''api''] } }

Simplemente pase la carga útil que recibe, a su lógica empresarial.

En la lógica empresarial lo procesamos así.

''use strict''; const request = require(''request''); exports.print = (payload) => { payload = JSON.parse(payload); if(payload.Type === ''SubscriptionConfirmation''){ return new Promise((resolve, reject) => { const url = payload.SubscribeURL; request(url, (error, response) => { if (!error && response.statusCode == 200) { console.log(''Yess! We have accepted the confirmation from AWS''); return resolve(); } else return reject(); }); }); }

Estoy utilizando el módulo de solicitud de NPM para aceptar automáticamente dichas solicitudes.

Otra forma sería imprimir el contenido de la payload y luego hacer clic en la URL que figura en la payload.SubscribeURL .

Una vez que AWS lo acepta, verifica la confirmación en la página de Suscripciones, donde la Subscription ARN se cambiaría de Pending Confirmation a un nombre-cum-SHA complejo con el nombre de su Tema.


Spring cloud SNS suscripción con anotación

Spring Cloud AWS tiene soporte para la confirmación automática del suscriptor, solo necesita poner esta anotación "@NotificationSubscriptionMapping"

@Controller @RequestMapping("/topicName") public class NotificationTestController { @NotificationSubscriptionMapping public void handleSubscriptionMessage(NotificationStatus status) throws IOException { //We subscribe to start receive the message status.confirmSubscription(); } @NotificationMessageMapping public void handleNotificationMessage(@NotificationSubject String subject, @NotificationMessage String message) { // ... } @NotificationUnsubscribeConfirmationMapping public void handleUnsubscribeMessage(NotificationStatus status) { //e.g. the client has been unsubscribed and we want to "re-subscribe" status.confirmSubscription(); } }

http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sns_support