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