aws lambda 创建和使用java平台的lambda函数
参考资料
- https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/lambda-java.html
- https://aws.amazon.com/cn/blogs/compute/building-serverless-java-applications-with-the-aws-sam-cli/
- https://www.baeldung.com/java-aws-lambda
lambda环境中目前支持java8和java11
平台环境中默认提供的依赖库包括
- com.amazonaws:aws-lambda-java-core(必需)
- com.amazonaws:aws-lambda-java-events
- com.amazonaws:aws-lambda-java-log4j2
- aws-sdk-java-v2
由于编译型语言无法在lambda控制台环境中直接查看和修改
传递给lambda函数的参数包括
- 事件
- 上下文:调用、函数和执行环境的其他信息
创建函数的两种方式
- 在控制台创建基本的示例,然后修改
- 直接用cli指定jar文件创建函数
注意handler参数的写法
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html
aws lambda create-function \
--function-name test-java11 \
--runtime java11 \
--zip-file fileb://target/test-lambda-java11-v1.jar \
--handler com.example.Handler::handleRequest \
--role arn:aws-cn:iam::xxxxx:role/myLambdaRole
添加依赖
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>3.11.0</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-log4j2</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
编写简单的函数
package com.example;
import java.util.Map;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class Handler implements RequestHandler<Map<String, String>, String> {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
@Override
public String handleRequest(Map<String, String> event, Context context) {
LambdaLogger logger = context.getLogger();
String response = new String("200 OK");
logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv()));
logger.log("CONTEXT: " + gson.toJson(context));
logger.log("EVENT: " + gson.toJson(event));
logger.log("EVENT TYPE: " + event.getClass().toString());
System.out.println(response);
return response;
}
}
需要使用shade插件,目的是将依赖包也添加到输出jar中。maven-shade-plugin 只存在一个goal shade:shade,需要将其绑定到 package 阶段
一个java程序要想运行必须有main函数,一般一个java程序会有其它依赖包,通过将程序打包成jar形式来运行的话,那么就需要将其所有依赖也打包进来才能够正常运行,否则运行就会因为缺少依赖而失败。shade插件就是用来将程序和所有依赖打包成一个超级(Uber) JAR
使用shade插件进行编译,看到类似于Including ... 的提示表明已经将依赖打包到jar中
mvn clean package shade:shade
...
[INFO] --- maven-shade-plugin:2.4.3:shade (default-cli) @ test-lambda-java11 ---
[INFO] Including com.amazonaws:aws-lambda-java-core:jar:1.2.1 in the shaded jar.
[INFO] Including com.amazonaws:aws-lambda-java-events:jar:3.11.0 in the shaded jar.
[INFO] Including joda-time:joda-time:jar:2.6 in the shaded jar.
[INFO] Including com.amazonaws:aws-lambda-java-log4j2:jar:1.5.1 in the shaded jar.
[INFO] Including org.apache.logging.log4j:log4j-core:jar:2.17.1 in the shaded jar.
[INFO] Including org.apache.logging.log4j:log4j-api:jar:2.17.1 in the shaded jar.
[INFO] Including com.google.code.gson:gson:jar:2.9.0 in the shaded jar.
...
更新lambda函数
aws lambda update-function-code --function-name test-java11 --zip-file fileb://target/test-lambda-java11-v1.jar
访问函数
$ aws lambda invoke \
--cli-binary-format raw-in-base64-out \
--function-name test-java11 \
--payload '{ "name": "Bob" }' \
response.json
output:
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
当然,用sam创建和部署函数要更方便,这里不展开了,用到再说
总结一下,
-
控制台创建java平台的lambda函数无法直接上传代码
-
由于是编译型语言,控制台无法查看和修改java代码
-
java代码最少需要依赖核心库
aws-lambda-java-core -
编译时需要通过shade插件打包uber jar,否则会出现找不到依赖的问题

浙公网安备 33010602011771号