Lambda Java 超入門

Lambda で Java を動かすメモ。以下に従って行う。

アプリケーションの jar の作成

EclipseMaven プロジェクトを作成する。シンプルなプロジェクトにチェックする。

グループ Id、アーティファクト Id、名前を指定する。

プロジェクトの依存関係に aws-lambda-java-core を追加する。

サンプルアプリの java-basic を使用する。

Handler クラスを作成する。

サンプルのコードをコピペする。

package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.LambdaLogger;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.Map;

// Handler value: example.Handler
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 = "200 OK";
    // log execution details
    logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv()));
    logger.log("CONTEXT: " + gson.toJson(context));
    // process event
    logger.log("EVENT: " + gson.toJson(event));
    logger.log("EVENT TYPE: " + event.getClass());
    return response;
  }
}

@Override がエラーになるが、pom.xmlJava のバージョンを指定してプロジェクトを更新すると消える。

サンプルの pom.xml を参考に依存性に追加する。

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.6</version>
    </dependency>

@Override がエラーになるが、Java のバージョンを指定してプロジェクトを更新すると消える。

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>11</java.version>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <maven.compiler.source>${java.version}</maven.compiler.source>
  </properties>

Lambda にデプロイ可能な jar を作成するため、maven-shade-plugin を追加する。

pom.xml はこうなる。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>doc-examples</groupId>
  <artifactId>lambda-java-example</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>lambda-java-example</name>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>11</java.version>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <maven.compiler.source>${java.version}</maven.compiler.source>
  </properties>
  <dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.6</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.2</version>
    </dependency>
  </dependencies>
</project>

Maven ビルドを実行し、ゴールは package shade:shade を指定する。

これで target ディレクトリの下に jar ができる。

Lambda 関数のデプロイ

マネコンからポチポチでデプロイする。関数を作成する。

jar をアップロードする。

ハンドラーをアプリケーションに合わせる。

テストを実行する。

ログ出力は以下。

START RequestId: 83d378c1-c677-49b2-9f3b-f29348fa8053 Version: $LATEST
ENVIRONMENT VARIABLES: {
  "PATH": "/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin",
  "_AWS_XRAY_DAEMON_ADDRESS": "169.254.79.129",
  "LAMBDA_TASK_ROOT": "/var/task",
  "AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "512",
  "TZ": ":UTC",
  "AWS_SECRET_ACCESS_KEY": "snip",
  "AWS_DEFAULT_REGION": "ap-northeast-1",
  "AWS_EXECUTION_ENV": "AWS_Lambda_java11",
  "AWS_LAMBDA_LOG_GROUP_NAME": "/aws/lambda/my-java-function",
  "_HANDLER": "example.Handler::handleRequest",
  "LANG": "en_US.UTF-8",
  "LAMBDA_RUNTIME_DIR": "/var/runtime",
  "AWS_SESSION_TOKEN": "snip",
  "AWS_ACCESS_KEY_ID": "snip",
  "LD_LIBRARY_PATH": "/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib",
  "_X_AMZN_TRACE_ID": "Root\u003d1-627e1d03-16955647037afe36764fa4b1;Parent\u003d5207879a49fc4f77;Sampled\u003d0",
  "AWS_SECRET_KEY": "fx3N6aWuSTjYX+pVL+KHBzf/sBTXICsuO51WssYc",
  "AWS_LAMBDA_RUNTIME_API": "127.0.0.1:9001",
  "AWS_REGION": "ap-northeast-1",
  "AWS_LAMBDA_LOG_STREAM_NAME": "2022/05/13/[$LATEST]c51fbd9adce8491a8b2ffefb7123dee2",
  "AWS_LAMBDA_INITIALIZATION_TYPE": "on-demand",
  "AWS_XRAY_DAEMON_ADDRESS": "169.254.79.129:2000",
  "_AWS_XRAY_DAEMON_PORT": "2000",
  "AWS_XRAY_CONTEXT_MISSING": "LOG_ERROR",
  "AWS_LAMBDA_FUNCTION_VERSION": "$LATEST",
  "AWS_ACCESS_KEY": "snip",
  "AWS_LAMBDA_FUNCTION_NAME": "my-java-function"
}CONTEXT: {
  "memoryLimit": 512,
  "awsRequestId": "83d378c1-c677-49b2-9f3b-f29348fa8053",
  "logGroupName": "/aws/lambda/my-java-function",
  "logStreamName": "2022/05/13/[$LATEST]c51fbd9adce8491a8b2ffefb7123dee2",
  "functionName": "my-java-function",
  "functionVersion": "$LATEST",
  "invokedFunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:my-java-function",
  "deadlineTimeInMs": 1652432146913,
  "logger": {}
}EVENT: {
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}EVENT TYPE: class java.util.LinkedHashMapEND RequestId: 83d378c1-c677-49b2-9f3b-f29348fa8053
REPORT RequestId: 83d378c1-c677-49b2-9f3b-f29348fa8053  Duration: 100.80 ms Billed Duration: 101 ms Memory Size: 512 MB Max Memory Used: 83 MB  Init Duration: 607.55 ms