[Serverless Framework] Java + gradle のLambda Functionを作成する

はじめに

前回、Serverless ApplicationをJavaで作成する手段としてAWS Toolkit for Eclipse で Serverless Applicationを作成するという記事を書きました。この方法はEclipseからGUIで操作できることが特徴ですが、使用するライブラリの管理は標準のEclipseプロジェクトと同じ方式のようです。

今回はServerless Frameworkを用いてLambda FunctionをGradleプロジェクトとして作成し、Gradleでライブラリを管理する方法を試してみました。

プロジェクトの作成

先にも書いたようにServerless Frameworkを使用します。このフレームワークはnpmでインストールするため、Javaの他にnpmの実行環境も必要となります。以下、プロジェクトの作成手順となります。

1.Serverless Frameworkのインストール

プロジェクトを作成したいフォルダに移動し、以下のコマンドでServerless Frameworkをインストールします。私は好みでローカルフォルダ内にインストールしましたが、グローバル領域にインストールしたい場合は -g を付けて下さい。

$ npm install serverless

2.プロジェクトの作成

以下のコマンドでプロジェクトを作成します。

$ ./node_modules/.bin/serverless create --template aws-java-gradle

Serverless: Generating boilerplate...
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.3.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-java-gradle"
Serverless: NOTE: Please update the "service" property in serverless.yml with your service name

3.serverless.ymlの修正

上記のプロジェクト作成時の結果にも出ているように、サービス名を修正することにします。またステージとリージョンについても修正しました。修正したserverless.ymlは以下のようになります。

# Welcome to Serverless!
#
# This file is the main config file for your service.
# It's very minimal at this point and uses default values.
# You can always add more config options for more control.
# We've included some commented out config examples here.
# Just uncomment any of them to get that config option.
#
# For full config options, check the docs:
#    docs.serverless.com
#
# Happy Coding!

service: serverless-lambda-sample # NOTE: update this with your service name

# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
# frameworkVersion: "=X.X.X"

provider:
  name: aws
  runtime: java8

# you can overwrite defaults here
#  stage: dev
#  region: us-east-1
  stage: dev
  region: ap-northeast-1
(以降略)

デプロイ

作成したプロジェクトには雛形のソースが記述されています。まずは何も修正しないでデプロイしてみたいと思います。

1.ビルド

デプロイする前にビルドを行う必要があります。今回はEclipseのメニューよりGradleのビルドを行いました。

2.デプロイ

以下のコマンドでデプロイを行います。

$ ./node_modules/.bin/serverless deploy

(中略)
Service Information
service: serverless-lambda-sample
stage: dev
region: ap-northeast-1
api keys:
  None
endpoints:
  None
functions:
  serverless-lambda-sample-dev-hello: arn:aws:lambda:ap-northeast-1:xxxxxxxxxx:function:serverless-lambda-sample-dev-hello

CloudFormationが実行され、作成されたLambda FunctionのARNが出力されます。以下、CloudFormationとLambda Functionのスクリーンショットです。

CloudFormation

serverless-java-lambda-cloudformation

Lambda Function

serverless-java-lambda-complete

Gradleにてライブラリの追加

先ほどのプロジェクトのGradleファイルにライブラリを追加してみます。今回はLombokを追加してみました。

1.build.gradle

build.gradleのLombokを追加します。以下のようになりました。

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile (
        'com.amazonaws:aws-lambda-java-core:1.1.0',
        'com.amazonaws:aws-lambda-java-events:1.3.0'
    )
    compile('org.projectlombok:lombok:1.16.12')
}
(以降略)

2.プログラム変更

Lombokを追加したので、プログラムを変更して利用してみたいと思います。Getter・Setterのみのクラスが雛形にあったので、それをLombokの@Dataを使用するよう変更しました。

(変更前)Request.java
package hello;

public class Request {

	private String key1;
	private String key2;
	private String key3;

	public Request() {
	}

	public String getKey1() {
		return key1;
	}

	public String getKey2() {
		return key2;
	}

	public String getKey3() {
		return key3;
	}

	public void setKey1(String key1) {
		this.key1 = key1;
	}

	public void setKey2(String key2) {
		this.key2 = key2;
	}

	public void setKey3(String key3) {
		this.key3 = key3;
	}
}
(変更後)Request.java
package hello;

import lombok.Data;

@Data
public class Request {
	private String key1;
	private String key2;
	private String key3;

}

3.ビルド

プログラムを変更後にGradleのビルドを行います。

4.デプロイ

以下のコマンドでデプロイを行います。

$ ./node_modules/.bin/serverless deploy

まとめ

今回はLambda Functionだけデプロイしましたが、設定を変更することによりAPI Gateway + Lambdaのデプロイも出来るようです。JavaでLambdaを開発する場合、AWS Toolkit for Eclipseと同じく、1つの選択肢になるのではないかと思います。