Tengo algunas lambdas trabajando juntas a través de SNS. Una lambda recibe una solicitud y envía datos a SNS. Otro lambda está suscrito a SNS. Fue fácil de hacer en JavaScript ya que el mensaje entrante es solo un objeto JS. Ahora estoy reescribiendo la lambda a Java. Estoy buscando el tipo para usar en el controlador.
Así es como se ve la lambda. SNSMessage es el marcador de posición para el tipo.
public class ArchiveRequestHandler implements RequestHandler<SNSMessage?, Void> { @Override public Void handleRequest(SNSMessage? input, Context context) { // do something with the message return null; } }Así es como se ve un mensaje de ejemplo:
{ "Records": [ { "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:EXAMPLE", "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "1970-01-01T00:00:00.000Z", "Signature": "EXAMPLE", "SigningCertUrl": "EXAMPLE", "MessageId": "1234567-ee98-5cb9-9903-4c221d41eb5e", "Message": "Hello from SNS!", "MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" } }, "Type": "Notification", "UnsubscribeUrl": "EXAMPLE", "TopicArn": "arn:aws:sns:EXAMPLE", "Subject": "TestInvoke" } } ] }Ahora estoy seguro de que puedo crear mi propio tipo para analizar esto, pero esperaba que hubiera una forma más estándar de hacerlo. Sin embargo, no he encontrado nada en las dependencias lambda ni SNS SDK que se parezca a este objeto.
Gracias a los comentarios de @dnault y @notionquest encontré que este objeto es parte de la biblioteca aws-lambda-java-events . Agregué la dependencia:
compile 'com.amazonaws:aws-lambda-java-events:1.3.0'Y ahora puedo hacer:
public class ArchiveRequestHandler implements RequestHandler<SNSEvent, Void> { @Override public Void handleRequest(SNSEvent input, Context context) { // do something with the message return null; } }El siguiente código Lambda procesa los mensajes de entrada de SNS:
import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.SNSEvent; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; public class LogEvent implements RequestHandler<SNSEvent, Object> { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss"); public Object handleRequest(SNSEvent request, Context context){ String timeStamp = sdf.format(new Date()); LambdaLogger logger = context.getLogger(); logger.log("-------------------------Invocation started: --------------" + timeStamp); List<SNSEvent.SNSRecord> snsRecordList = request.getRecords(); if ( snsRecordList != null ){ SNSEvent.SNS recordSNS = null; for ( SNSEvent.SNSRecord snsRecord : snsRecordList ) { recordSNS = snsRecord.getSNS(); logger.log( "Subject:[" + recordSNS.getSubject() + "]" + "Arn:[" + recordSNS.getTopicArn() + "]" + "attribs:[" + recordSNS.getMessageAttributes() + "]" + "message:[" + recordSNS.getMessage() + "]" ); }//for } timeStamp = sdf.format(new Date()); logger.log("-------------------------Invocation completed: -------------" + timeStamp); return null; } }