在JAVA中使用Lambda的AWS DynamoDB触发器

时间:2015-08-03 13:47:57

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

我试图在dynamodb流事件上触发用Java编写的AWS lambda函数。亚马逊有一个相同的指南,在这里使用NodeJS http://docs.aws.amazon.com/lambda/latest/dg/wt-ddb-create-test-function.html

NodeJS的测试输入(来自上面的链接)看起来像一个SNS事件,所以我尝试在Java中使用相应的SNSEvent类作为我的处理程序方法的输入。

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.events.SNSEvent;
import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord;
import java.util.List;

public class RecomFunction {

    public void handler(SNSEvent event, Context context) {

        LambdaLogger logger = context.getLogger();

        List<SNSRecord> records = event.getRecords();

        if (records != null) {
            for (SNSRecord record : records) {
                if (record != null) {
                    logger.log("SNS record: " + record.getSNS().getMessage());
                }
            }
        }
    }

}

不幸的是,record.getSNS()返回NULL导致NullPointer异常

有一个相关问题,但未给出具体答案: Setup DynamoDB Trigger using Lambda

5 个答案:

答案 0 :(得分:7)

这段代码对我有用。您可以使用它在Lambda函数中接收和处理DynamoDB事件 -

public class Handler implements RequestHandler<DynamodbEvent, Void> {

    @Override
    public Void handleRequest(DynamodbEvent dynamodbEvent, Context context) {

        for (DynamodbStreamRecord record : dynamodbEvent.getRecords()) {

            if (record == null) {
                continue;
            }

            // Your code here
        }

        return null;
    }
}

同样,您可以使用SNSEventSNSRecord来处理Amazon SNS事件。

答案 1 :(得分:3)

这对我来说很有用 - 例如DynamoDB流事件:

import com.amazonaws.services.lambda.runtime.RequestHandler;
...

public class DynamoStreamHandler implements RequestHandler<Object, Void> {
    @Override
    public Void handleRequest(Object o, Context context) {

        LinkedHashMap lhm = (LinkedHashMap) o;
        ...etc.
    }
}

它们似乎使用了一个使用MapList对象的自定义JSON映射器。通过测试和打印日志来验证其他事件类型是非常简单的(但很乏味)。 (叹息)

编辑:如果~5 MB开销正常,您可以使用DynamodbEvent.DynamodbStreamRecord库v1.1.0提供的aws-lambda-java-events,如AWS Lambda中的AWS Lambda Walkthrough 3: Process Amazon DynamoDB Events (Java)所述文档。

答案 2 :(得分:2)

创建一个处理InputStream的处理程序,读入InputStream的内容(只是JSON),然后反序列化它以获取所需的数据。

{{1}}

这有点麻烦,但据我所知,AWS目前不提供更高级别的Java lambda接口来使用DynamoDB Streams。我有一个完整的示例here,其中详细说明了如何对JSON流进行反序列化以获取数据的Java对象。

答案 3 :(得分:0)

您的代码在CloudWatch日志中导致以下异常

类没有实现适当的处理程序接口 ....

一旦我将代码更改为以下内容,我就可以轻松获得SNS消息。

public class RecomFunction implements RequestHandler<SNSEvent, Void> {

    public Void handleRequest(SNSEvent event, Context context) {

        ...
        return null;
    }

}

答案 4 :(得分:0)

从事件处理程序获取反序列化的对象: 1)在处理程序中使用以下内容从输入流中获取json:

private String getJsonFrom(InputStream stream) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int letter;
    while ((letter = stream.read()) != -1)
        baos.write(letter);

    return new String(baos.toByteArray());
}

2)然后创建一个特定的反序列化器从json派生对象。 &#39; NewImage&#39;在DynamoDB事件的情况下。 One example here.