📝
CloudShell から Java の Lambda 関数を作成してみた
JDK のインストールからやってみました。
前提
- Lambda 実行ロール用の IAM ロールが作成済みであること
- AdministratorAccess 権限を付与
手順概要
- JDK のインストール
- Maven のインストール
- Java プロジェクトの作成
- Lambda 関数作成
- 動作確認
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 関数を作成してみました。
どなたかの参考になれば幸いです。
参考資料
- amazon web services - Yum - what java 8 versions are available to install? - Stack Overflow
- AWS Cloud9 の Java チュートリアル - AWS Cloud9
- create-function — AWS CLI 2.23.0 Command Reference
- get-function — AWS CLI 2.23.0 Command Reference
- invoke — AWS CLI 2.23.0 Command Reference
- Use ListBuckets with an AWS SDK or CLI - AWS SDK Code Examples
- Linux標準機能で簡単JSON整形 #Python - Qiita
- AWS Lambda + Java で Hello World #lambda - Qiita
Discussion