Lambda Java コンテナ超入門

前回の続きで Java の Lambda をコンテナで動かすメモ。

以下の Usage に従う。

イメージの作成

ソースは前回のものを流用する。

You can use maven-dependency-plugin to collect runtime dependencies: のところに書かれているプラグインを追加する。

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.1.2</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>

            </configuration>
          </execution>
        </executions>
      </plugin>

    </plugins>
  </build>

Maven のようのサンプルの通りに Dockerfile を作成する。ハンドラーのクラス名はアプリケーションに合わせる。

FROM public.ecr.aws/lambda/java:11

# Copy function code and runtime dependencies from Maven layout
COPY target/classes ${LAMBDA_TASK_ROOT}
COPY target/dependency/* ${LAMBDA_TASK_ROOT}/lib/

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "example.Handler::handleRequest" ]

依存関係を集める。

mvn compile dependency:copy-dependencies -DincludeScope=runtime

target/dependency に依存関係の jar が集められる。

イメージをビルドする。

docker build -t lambda-java-example .

イメージを確認する。

$ docker images lambda-java-example
REPOSITORY            TAG       IMAGE ID       CREATED              SIZE
lambda-java-example   latest    ef8b4bafb132   About a minute ago   521MB

ローカルでテストする。

docker run -p 9000:8080 lambda-java-example

別のターミナルから curl する。動いた。

$ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
"200 OK"%

ECR に Push

リポジトリを作成する。

aws ecr create-repository --repository-name lambda-java-example

ECR にログインする。

AWS_ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
AWS_REGION=$(aws configure get region)
aws ecr get-login-password | docker login --username AWS --password-stdin https://${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

タグ付けして Push する。

docker tag lambda-java-example ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/lambda-java-example
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/lambda-java-example

Lambda 関数のデプロイ

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

ECR に置いたイメージを指定する。

テストを実行する。

ログ出力は以下。

START RequestId: 635c8316-8e65-4a3f-878c-21379e3449a1 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": "128",
"TZ": ":/etc/localtime",
"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-container-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-627e2882-5cd481374a239ec47fa28425;Parent\u003d5cfb039c3b620232;Sampled\u003d0",
"AWS_SECRET_KEY": "snip",
"PWD": "/var/task",
"AWS_LAMBDA_RUNTIME_API": "127.0.0.1:9001",
"AWS_REGION": "ap-northeast-1",
"AWS_LAMBDA_LOG_STREAM_NAME": "2022/05/13/[$LATEST]73be34ef59f24517b4c71e518ef27d37",
"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",
"SHLVL": "0",
"AWS_LAMBDA_FUNCTION_NAME": "my-java-container-function"
}CONTEXT: {
"memoryLimit": 128,
"awsRequestId": "635c8316-8e65-4a3f-878c-21379e3449a1",
"logGroupName": "/aws/lambda/my-java-container-function",
"logStreamName": "2022/05/13/[$LATEST]73be34ef59f24517b4c71e518ef27d37",
"functionName": "my-java-container-function",
"functionVersion": "$LATEST",
"invokedFunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:my-java-container-function",
"deadlineTimeInMs": 1652435079657,
"logger": {}
}EVENT: {
"key1": "value1",
"key2": "value2",
"key3": "value3"
END RequestId: 635c8316-8e65-4a3f-878c-21379e3449a1
REPORT RequestId: 635c8316-8e65-4a3f-878c-21379e3449a1  Duration: 804.33 ms Billed Duration: 2186 ms    Memory Size: 128 MB Max Memory Used: 83 MB  Init Duration: 1381.58 ms