如何使用 AWS SDK for Java 2.0 创建 Lambda 函数

sim*_*mon 6 amazon-web-services aws-sdk aws-lambda

如何使用 AWS SDK for Java 2.0 创建 Lambda 函数?Usinx SDK 1.x,我可以使用以下方法:

public String handleRequest(S3Event s3event, Context context) {
System.out.println("do stuff");
return "success";
}
Run Code Online (Sandbox Code Playgroud)

使用 java SDK 2.x,我似乎找不到 S3Event 和 Context 对象的等效依赖项?如果有人能指出我的例子,我将不胜感激。或者,如果 2.x 还不够成熟来处理 lambda,我应该坚持使用 SDK 1.x 吗?

std*_*bar 7

S3Event是AWS Lambda Java Events库的一部分,是AWS Lambda Java CoreContext的一部分。当您包含事件库时,您确实会引入 1.x Java SDK。但是,如果您使用Lambda 处理程序的Java Stream版本,则可以删除对事件库的依赖关系,从而消除对 1.x SDK 的需求。你的代码看起来像这样:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.jayway.jsonpath.JsonPath;


public class S3EventLambdaHandler implements RequestStreamHandler {
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {

        try {
            List<String> keys = JsonPath.read(inputStream, "$.Records[*].s3.object.key");

            for( String nextKey: keys )
                System.out.println(nextKey);
        }
        catch( IOException ioe ) {
            context.getLogger().log("caught IOException reading input stream");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以自己读取 S3Event 中的 JSON。实际上,您正在代码中执行 S3Event 的序列化,而不是让 Amazon 库执行此操作。

显然,最大的缺点是您必须自己序列化该事件。可以在此处找到 JSON 格式的 S3 事件示例。

上面的示例使用JsonPath从事件中提取键(在本例中)。删除 Lambda 事件库后,您会惊讶地发现 Lambda 代码小了很多。

编辑 - 2022 年 9 月

我知道有时并不清楚,但适用于 Java 的 AWS Lambda 核心库 没有版本 2 - 即使在这篇文章发布 4 年后。Lambda Core 库定义了ContextRequestStreamHandler等内容,如上面的代码所示。截至撰写本文时,仍然有3 个库可用于用 Java 编写Lambda 的服务器端,并且它们都仍然在com.amazonaws中。这些库不是用于作为客户端访问 AWS 的其余部分(其中有 V2(包中)库software.amazon)的库。OP 问题的答案仍然相同 - 用于用 Java 编写 Lambda 服务器端的 V2 库不存在。作为客户端与 AWS 环境的其余部分进行交互 - 当然,V2 已经存在很长一段时间了。但不是 Lambda 的“服务器”端。

AWS Lambda Java Events库现在处于 V3 版本,但它仍然使用该com.amazonaws包。作为参考,我会在不使用 a 的情况下编写上面的代码,RequestStreamHandler因为事件库比 4 年前轻得多,但这不会更改包名称。

  • 这不使用 2.0 代码。也许是早期版本?2.0 软件包以“software.amazon.awssdk...”开头 (4认同)