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.amazonawsgroupId>
      <artifactId>aws-lambda-java-coreartifactId>
      <version>1.2.1version>
    dependency>
    <dependency>
      <groupId>com.amazonawsgroupId>
      <artifactId>aws-lambda-java-eventsartifactId>
      <version>3.11.0version>
    dependency>
    <dependency>
      <groupId>com.amazonawsgroupId>
      <artifactId>aws-lambda-java-log4j2artifactId>
      <version>1.5.1version>
    dependency>
    <dependency>
      <groupId>com.google.code.gsongroupId>
      <artifactId>gsonartifactId>
      <version>2.9.0version>
  dependency>
  dependencies>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.pluginsgroupId>
          <artifactId>maven-shade-pluginartifactId>
          <version>2.4.3version>
          <configuration>
            <createDependencyReducedPom>falsecreateDependencyReducedPom>
          configuration>
          <executions>
            <execution>
              <phase>packagephase>
              <goals>
                <goal>shadegoal>
              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,否则会出现找不到依赖的问题

你可能感兴趣的:(AWS,java,aws,log4j)