📝

CloudShell から Java の Lambda 関数を作成してみた

2025/01/22に公開

JDK のインストールからやってみました。

前提

  • Lambda 実行ロール用の IAM ロールが作成済みであること
    • AdministratorAccess 権限を付与

手順概要

  1. JDK のインストール
  2. Maven のインストール
  3. Java プロジェクトの作成
  4. Lambda 関数作成
  5. 動作確認

1. JDK のインストール

amazon web services - Yum - what java 8 versions are available to install? - Stack Overflow

上記サイトで紹介されている方法でインストールします。

1-1. JDK をインストールします。

$ sudo yum install java-1.8.0-amazon-corretto.x86_64

1-2. JDK がインストールされたことを確認します。

$ java -version
openjdk version "1.8.0_432"
OpenJDK Runtime Environment Corretto-8.432.06.1 (build 1.8.0_432-b06)
OpenJDK 64-Bit Server VM Corretto-8.432.06.1 (build 25.432-b06, mixed mode)

2. Maven のインストール

AWS Cloud9 の Java チュートリアル - AWS Cloud9

上記ドキュメントの方法でインストールします。

2-1. Maven をインストールします。

$ sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo

$ sudo sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo

$ sudo yum install -y apache-maven

2-2. Maven がインストールされたことを確認します。

$ mvn -version
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T17:29:23+00:00)
Maven home: /usr/share/apache-maven
Java version: 23.0.1, vendor: Amazon.com Inc.
Java home: /usr/lib/jvm/java-23-amazon-corretto.x86_64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "6.1.119-129.201.amzn2023.x86_64", arch: "amd64", family: "unix"

3. Java プロジェクトの作成

3-1. ディレクトリを作成します。

$ mkdir -p test/src/main/java/com/example; cd test

3-2. pom.xml を作成します。

$ nano pom.xml

# 以下の内容を書き込みます。
<?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-world</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>lambda-hello-world</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>
        <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-s3</artifactId>
        <version>1.12.568</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>

3-3. HelloWorld.java を作成します。

$ nano src/main/java/com/example/HelloWorld.java

# 以下の内容を書き込みます。
package com.example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.Bucket;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class HelloWorld 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<>();
    AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
    List<Bucket> buckets = s3Client.listBuckets();
    output.put("buckets", buckets.stream().map(Bucket::getName).toArray());

    return output;
  }
}

3-4. JAR ファイルを生成します。

$ mvn package
$ ls -l target/*.jar
-rw-r--r--. 1 cloudshell-user cloudshell-user 7795518 Jan 16 12:37 target/lambda-hello-world-1.0.jar
-rw-r--r--. 1 cloudshell-user cloudshell-user    3248 Jan 16 12:37 target/original-lambda-hello-world-1.0.jar

4. Lambda 関数作成

create-function — AWS CLI 2.23.0 Command Reference

AWS CLI の create-function コマンドで Lambda 関数を作成します。

4-1. create-function コマンドを実行します。

$ aws lambda create-function \
--function-name java \
--handler com.example.HelloWorld::handleRequest \
--runtime java21 \
--role your-role-arn \
--zip-file fileb://target/lambda-hello-world-1.0.jar \
--timeout 10 \
--memory-size 1024

4-2. 作成された Lambda 関数を確認します。

$ aws lambda get-function \
--function-name java

5. 動作確認

invoke — AWS CLI 2.23.0 Command Reference

AWS CLI の invoke コマンドで Lambda 関数を呼び出してテスト実行します。

$ aws lambda invoke \
--function-name java \
response.json > /dev/null && cat response.json | python -m json.tool
{
    "buckets": [
        "amazon-connect-xxx",
        "cdk-hnb659fds-assets-012345678901-ap-northeast-1",
        "cf-templates-xxx-ap-northeast-1"
    ]
}

実行できました。

まとめ

今回は CloudShell から Java の Lambda 関数を作成してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion