Lambda で Java を動かすメモ。以下に従って行う。
アプリケーションの jar の作成
Eclipse で Maven プロジェクトを作成する。シンプルなプロジェクトにチェックする。
グループ 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.xml で Java のバージョンを指定してプロジェクトを更新すると消える。
サンプルの 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