在本教程中,我们将看到如何在Java中创建AWS Lambda函数,我告诉你,这样做非常容易……
基本上,我们可以通过三种方式创建AWS Lambda函数:
–通过实现RequestHandler接口
–通过实现RequestStreamHandler接口 –自定义实施,不需要我们实施任何AWS特定接口
为了使用这种创建AWS lambda函数的方法,我们需要在项目中具有以下依赖关系:
<dependency><groupId>com.amazonaws</groupId><artifactId>aws-lambda-java-core</artifactId><version>1.1.0</version></dependency>
下面是您的班级样子:
package com.blogspot.javasolutionsguide;import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;public class HelloWorldWithRequestHandler implements RequestHandler
一旦在项目中创建了具有上述依赖关系和类的maven项目,maven便会构建该项目,这将在项目的目标文件夹中为您创建jar。
现在打开AWS控制台,转到服务并搜索AWS Lambda。
在以下屏幕上,单击“创建功能”。
在以下屏幕上,输入函数名称“ HelloWorld”,然后选择Runtime作为Java 11。
在“权限”部分中,选择“使用基本Lambda权限创建新角色”,AWS Lambda将创建名称为HelloWorld-role-jc6cmpnj的执行角色。 该角色是必需的,以允许AWS Lambda将日志上传到AWS Cloudwatch日志。
单击创建功能。
您将在下面的屏幕上看到“成功创建函数HelloWorld。您现在可以更改其代码和配置。要通过测试事件调用函数,请选择Test”。
现在,在“功能代码”部分中,单击“上载”按钮,然后在计算机上浏览您之前创建的jar。
–同样,在“处理程序”文本框中,替换
带有您的“ HelloWorldWithRequestHandler”类所在的包名称的示例 ,在我们的示例中为“
com.blogspot.javasolutionsguide “
–并将Hello替换为“ HelloWorldWithRequestHandler”。
–替换handleRequest将保持原样,因为我们在类中也具有相同的方法名称。
单击屏幕最右侧的保存按钮。
现在要测试lambda函数,我们需要配置测试事件,为此,我们将单击“选择测试事件”下拉列表,然后单击“配置测试事件”。
您将看到以下屏幕。输入事件名称为“ HelloWorldEvents”并替换以下内容
{
“ key1”:“ value1”, “ key2”:“ value2”, “ key3”:“ value3” }
只需输入您的姓名,如下所示:
“ Gaurav Bhardwaj”
然后点击创建按钮。
现在单击“测试”按钮,您应该会看到lambda函数已成功执行,并显示消息“ HelloWorld的Hello Hello Gaurav Bhardwaj”,这是我们的lambda函数返回的输出。
如果您单击上面屏幕中的日志链接,它将带您到AWS Cloudwatch屏幕,您可以在其中看到为lambda函数创建了一个LogGroup,并在其中具有LogStream,可以在其中查看lambda函数的日志这就是我们为lambda函数分配角色的原因,因为AWS lambda使用该角色将日志推送到Cloudwatch。
在这种情况下,您需要遵循与上述情况完全相同的步骤,只是在代码中需要实现RequestStreamHandler接口而不是如下所示的RequestHandler接口。
package com.blogspot.javasolutionsguide;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;public class HelloWorldWithRequestStreamHandler implements RequestStreamHandler {@Overridepublic void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {int letter;while((letter = inputStream.read()) != -1){outputStream.write(Character.toUpperCase(letter));}}
}
通过自定义实现的AWS Lambda函数,不需要我们实现任何AWS特定接口
您还可以使用自定义lambda函数,该函数不遵循某些AWS特定接口的签名。如果您不想要,甚至可以省略Context对象。
在下面的代码中,我尝试放置两个处理程序方法,一个带有Context对象,一个没有Context对象。要测试这两个方法,您只需要在AWS控制台中更改方法的名称,它将开始命中该方法。 。
另外,我们可以从Context对象中看到很多有用的信息,例如AWS fucnton的名称,其版本,ARN,为该功能分配了多少内存(默认为512 mb)。
package com.blogspot.javasolutionsguide;import com.amazonaws.services.lambda.runtime.Context;public class HelloWorld {//Handler method without Contextpublic String sayHelloWorldWithoutContext(String name) {return String.format("Hello %s.", name);}//We need to add aws-lambda-java-core dependency if we add Context as parameter.public String sayHelloWorldWithContext(String name, Context context) {context.getLogger().log("Lambda Function Name:" + context.getFunctionName() +"Version:" + context.getFunctionVersion() + "Arn:" + context.getInvokedFunctionArn() +"Allocated Memory:" + context.getMemoryLimitInMB() +"Remaining Time:"+ context.getRemainingTimeInMillis());return String.format("Hello %s.", name);}}
同样在以下示例中,我们可以看到,如果我们的类中有两个同名处理程序方法,则将调用以Context对象为最后一个参数的处理程序方法。
package com.blogspot.javasolutionsguide;import com.amazonaws.services.lambda.runtime.Context;public class HelloWorldWithMultipleHandlersWithSameName {public String handler(String name) {return String.format("Hello %s.", name);}public String handler(String name, Context context) {return String.format("Hello %s%s.", name, " Memory Allocated:" + context.getMemoryLimitInMB());}}
您可以在
–因此,我们看到了如何在Java中以各种方式创建AWS lambda函数。
–处理程序方法的名称无关紧要。您可以选择任何名称。
–如果您的类中有两个具有相同名称的处理程序方法,则将调用以Context对象为最后一个参数的处理程序方法。
–处理程序方法的第一个参数是处理程序的输入,可以是
–由事件源(如S3)以预定义的AWS事件类型(如S3Event)的形式发布的事件数据。
–自定义输入(原始或对象类型)。
–为了使AWS lambda成功调用处理程序方法,必须使用可序列化为输入参数的数据类型的输入数据来调用该函数。
–如果您同步调用lambda函数(调用类型RequestResponse),则可以从处理程序中返回任何允许的原语或对象类型,但是如果您异步调用lambda函数(调用事件类型),则返回处理程序的类型必须是空的。
翻译自: https://www.javacodegeeks.com/2020/03/how-to-create-aws-lambda-function-with-java.html