AWS Lambda:一个Lambda函数可以同时拥有Kinesis和DynamoDB Streams的事件源吗?

6

一个AWS Lambda函数能否拥有两个事件源,分别为一个Kinesis流和一个DynamoDB流?

我搜索了一下,但没有找到任何文档说明可以或不可以为同一个AWS Lambda函数使用不同类型的事件源。


我想不出为什么这个方法不起作用,假设该函数本身能够理解来自不同来源的传入消息中的任何差异。你有收到错误吗? - Michael - sqlbot
1个回答

5

是的,Lambda函数可以具有不同类型的事件源,但您必须使用com.amazonaws.services.lambda.runtime.RequestStreamHandler来正确反序列化输入数据。这是因为调用com.amazonaws.services.lambda.runtime.RequestHandler的内部Lambda代码不会根据类型动态反序列化数据,然后使用正确的类型调用重载方法,而似乎是通过反射选择一个方法并调用它。

示例输入:

Kinesis事件输入:

{
    "Records": [
        {
            "kinesis": {
                "kinesisSchemaVersion": "1.0",
                "partitionKey": "1",
                "sequenceNumber": "11111111111111111111111111111111111111111111111111111111",
                "data": "e30=",
                "approximateArrivalTimestamp": 1518397399.55
            },
            "eventSource": "aws:kinesis",
            "eventVersion": "1.0",
            "eventID": "shardId-000000000000:11111111111111111111111111111111111111111111111111111111",
            "eventName": "aws:kinesis:record",
            "invokeIdentityArn": "arn:aws:iam::111111111111:role/lambda_test-lambda-multipe-sources",
            "awsRegion": "us-east-1",
            "eventSourceARN": "arn:aws:kinesis:us-east-1:111111111111:stream/test-lambda-multipe-sources"
        }
    ]
}

DynamoDb流记录:

{
    "Records": [
        {
            "eventID": "11111111111111111111111111111111",
            "eventName": "INSERT",
            "eventVersion": "1.1",
            "eventSource": "aws:dynamodb",
            "awsRegion": "us-east-1",
            "dynamodb": {
                "ApproximateCreationDateTime": 1518397440,
                "Keys": {
                    "key": {
                        "S": "asdf"
                    }
                },
                "NewImage": {
                    "key": {
                        "S": "asdf"
                    }
                },
                "SequenceNumber": "111111111111111111111111",
                "SizeBytes": 14,
                "StreamViewType": "NEW_AND_OLD_IMAGES"
            },
            "eventSourceARN": "arn:aws:dynamodb:us-east-1:111111111111:table/test-lambda-multipe-sources/stream/2018-02-11T18:57:44.017"
        }
    ]
}

示例代码:

public final class MultipleEventSourcesRequestHandler
        implements RequestHandler<KinesisEvent, Void>
//        implements RequestStreamHandler
{
    private static final Logger LOG = LoggerFactory.getLogger(MultipleEventSourcesRequestHandler.class);

    public Void handleRequest(final DynamodbEvent input, final Context context)
    {
        LOG.info("In DynamodbEvent handler with event of source: " + input.getRecords().get(0).getEventSource());
        return null;
    }

//    public final void handleRequest(final InputStream input, final OutputStream output, final Context context)
//            throws IOException
//    {
//        final byte[] serializedSpeechletRequest = IOUtils.toByteArray(input);
//        LOG.info("In Stream handler. Request bytes: " + new String(serializedSpeechletRequest, StandardCharsets.UTF_8));
//        output.close();
//    }

    public Void handleRequest(final KinesisEvent input, final Context context)
    {
        LOG.info("In KinesisEvent handler with event of source: " + input.getRecords().get(0).getEventSource());
        return null;
    }
}

样本日志:

2018-02-12 01:32:57 INFO (main) com.example.lambda.eventsourcetest.MultipleEventSourcesRequestHandler - In KinesisEvent handler with event of source: aws:dynamodb

嗨,Alex,你能否更详细地解释一下RequestStreamHandler的用法?在你的示例代码中,相关部分都被注释掉了,那么它的目的是什么?谢谢! - fayndee
它不起作用。 - user2088250

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接