【问题标题】:How to process an SNS message in AWS Lambda written in Java?如何在用 Java 编写的 AWS Lambda 中处理 SNS 消息?
【发布时间】:2019-04-30 19:54:41
【问题描述】:

我有几个通过 SNS 一起工作的 lambda。一个 lambda 接收请求并将数据发送到 SNS。另一个 lambda 订阅了 SNS。在 JavaScript 中很容易做到,因为传入的消息只是一个 JS 对象。现在我将 lambda 重写为 Java。我正在寻找要在处理程序中使用的类型。

这是 lambda 的样子。 SNSMessage 是类型的占位符。

public class ArchiveRequestHandler implements RequestHandler<SNSMessage?, Void> {

    @Override public Void handleRequest(SNSMessage? input, Context context) {
        // do something with the message
        return null;
    }
}

示例消息如下所示:

{
  "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"
      }
    }
  ]
}

现在我确信我可以创建自己的类型来解析它,但我希望有一种更标准的方法来做这件事。但是,我在 lambda 或 SNS SDK 依赖项中没有找到任何看起来像这个对象的东西。

【问题讨论】:

标签: java amazon-web-services aws-lambda


【解决方案1】:

感谢@dnault 和@notionquest 的cmets,我发现这个对象是aws-lambda-java-events 库的一部分。我添加了依赖:

compile 'com.amazonaws:aws-lambda-java-events:1.3.0'

现在我可以做到了:

public class ArchiveRequestHandler implements RequestHandler<SNSEvent, Void> {

    @Override public Void handleRequest(SNSEvent input, Context context) {
        // do something with the message
        return null;
    }
}

【讨论】:

  • 如果这是正确答案,请采纳。
  • @jarmod 是的。但是我要等两天stackoverflow.blog/2009/01/06/accept-your-own-answers
  • 您可能对您的答案有更高级的描述吗?如果它是一个 JSON 对象,你在哪里传递你的消息?以及如何访问它?
【解决方案2】:

以下 Lambda 代码处理 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;
    }
}

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 1970-01-01
    • 2021-12-01
    • 2020-06-14
    • 2017-04-18
    • 2019-07-02
    • 2021-10-18
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多