AWSのLambda関数をローカル環境で動かすlambci/lambdaというDockerイメージを見つけましたので、試してみました。
参考)
https://hub.docker.com/r/lambci/lambda/
https://zenn.dev/nekoniki/articles/10ac0c37957cc9
https://qiita.com/niwasawa/items/69bba64d7cd2d6277473
まずはnode.jsを上記参考に動作確認してみました。
index.js
1 2 3 4 |
exports.handler = async function (event, context) { console.log("EVENT: \n" + JSON.stringify(event, null, 2)); return context.logStreamName; }; |
event.json
1 2 3 4 5 |
event.json { "message": "hello!", "value": 1234 } |
上記ファイルをカレントにおいてdockerコマンドを実行します。
次に”Stay-Open”API mode で動かします。(リッスン状態にしてcurlでリクエスト)
AWSのライブラリがなくても動作します。実際はここからAWSのリソースにアクセスするためのnode moduleなども必要になるでしょう。
次はJavaですが、pom.xmlとHello.javaのシンプル構成です。
src/main/java/com/example/Hello.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import java.util.HashMap; import java.util.Map; public class Hello implements RequestHandler<Map<String, Object>, Map<String, Object>> { @Override public Map<String, Object> handleRequest(Map<String, Object> input, Context context) { Map<String, Object> output = new HashMap<>(); output.put("foo", "Hello!"); output.put("bar", "Goodby!"); output.put("input", input); output.put("context", context); return output; } } |
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?xml version="1.0" encoding="UTF-8"?> <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>lambda-hello</artifactId> <packaging>jar</packaging> <version>1.0</version> <name>lambda-hello</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> |
ビルドします。
mvn package
node.jsのときと同様に”Stay-Open”API modeです。
Lambda関数は、JavaScript,Python,RubyはAWSのコンソール組み込みコードエディタが使用できるので便利です。
デプロイ前のビルドが必要なJavaなどは、このようなローカルで動かす仕組みがあるとちょっと安心できる気がします。
この二通りの差異はいろいろと参考になりそうです。