【AWS】Lambda ~ Java / サーバサイド編 ~

 ■ はじめに

https://dk521123.hatenablog.com/entry/2017/04/05/235618

の続き。

今回は、サーバレスなのに、サーバサイドって変な感じだけど、
Javaでの簡単なサンプルを記す

 ■ Lambda

 料金
https://aws.amazon.com/jp/lambda/pricing/

より 
Lambda では 1 か月に 1,000,000 件の無料リクエストおよび
400,000 GB-秒のコンピューティング時間が無料利用枠となっています

ただし、メモリ量によって、1 か月の無料利用枠の秒数が変わることに注意

 ■ 構文

http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-programming-model-handler-types.html

より

【出力型】 【関数名】(【入力型】 input, Context context) {
   ...
}

 ■ 手順

 * 今回は、Mavenを使って、構築する(Gradle の方がお勧め)

1)Eclipse / Maven を使用したパッケージの作成

[1-1] Eclipseを起動して、[File]-[New]-[Other]-[Maven]-[Maven Project] を選択
[1-2] [New Maven Project] ウィンドウで、[Create a simple project] を選択
   (その他はデフォルトのまま)し、「Next」ボタン押下
[1-3] [New Maven Project] の [Configure project] ウィンドウで、
    以下を入力し、「Finish」ボタン押下し、プロジェクト作成
 ~~~~~
 1-3-1) Group Id: aws-demo
 1-3-2) Artifact Id: AwsLambdaDemo (プロジェクト名になる)
 1-3-3) Version: 0.0.1-SNAPSHOT
 1-3-4) Packaging: jar
 1-3-5) Name: AwsLambdaDemo
 1-3-6) Description : Demo
 ~~~~~

 2)コード作成/ビルド/JAR作成

[2-1] プロジェクト「AwsLambdaDemo」配下にある「pom.xml」をエディタで開き
    以下の「サンプル」の「pom.xml」を参考に記入し、保存する
[2-2] 「pom.xml」を右クリックし、[Run As...]-[5 Maven install]を選択
 => 「[INFO] BUILD SUCCESS」出たらOK
[2-3] プロジェクト「AwsLambdaDemo」配下にある「src/main/java」を右クリックし、
    [New]-[Class]で、以下の3つのクラスを作成する
    (ソースコードの内容は、以下の「サンプル」の「Javaコード」配下を参考)
 ~~~~~
 2-3-1) com.demo.Main.java
 2-3-2) com.demo.Request.java
 2-3-3) com.demo.Response.java
 ~~~~~
[2-4] 「pom.xml」を右クリックし、[Run As...]-[1 Maven build]を選択
 => 「[INFO] BUILD SUCCESS」出たらOK
 => 「[INFO] Replacing C:\【Workspace】\AwsLambdaDemo\target\AwsLambdaDemo-0.0.1-SNAPSHOT.jar ・・・」とあるので
     「AwsLambdaDemo-0.0.1-SNAPSHOT.jar」をコピーする(これをアップする)

 3)Lambdaファンクションを登録
http://engineer.recruit-lifestyle.co.jp/techblog/2016-11-22-serverless-architecture-lambda/

が参考になる 
[3-1] AWS にログインし、[Lambda]-[今すぐ始める]を選択し、以下を入力する
[3-2] 「設計図の選択」で「Black Function」を選択
[3-3] 「トリガーの設定」で「API Gateway」を選択し、「次へ」ボタン押下
[3-4] 「関数の設定」で以下を入力し、「次へ」ボタン押下
 ~~~~~
 3-4-1) 名前 : 任意の名前(例「HelloWorld」)
 3-4-2) 説明 : 任意の名前(例「デモ」)
 3-4-3) ランタイム : Java8
 3-4-4) コードエントリタイプ : .ZIPファイルまたはJARファイルをアップロード
 3-4-5) ハンドラ : com.demo.Main::execute (「パッケージ.クラス名::メソッド」で指定)
 3-4-6) セキュリティ : Open
 ~~~~~

 4)テスト

[4-1] [Actions]-[Edit/Test]を選択
[4-2] 入力欄に以下を入力し、「テスト」を選択
 ~~~~~
 {
  "greeting": "Hello",
  "name": "Tom"
 }
 ~~~~~

 以下が返ってくればOK
 ~~~~~
 {
   "result"="Hello, Tom"
 }
 ~~~~~

 ■ サンプル

 pom.xml

<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>aws-demo</groupId>
  <artifactId>AwsLambdaDemo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>AwsLambdaDemo</name>
  <description>Demo</description>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.1.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

com.demo.Main.java (Lambda 関数ハンドラー)

package com.demo;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;

public class Main {
  public Response execute(Request request, Context context) {
    LambdaLogger lambdaLogger = context.getLogger();
    lambdaLogger.log("Greeting = " + request.getGreeting());
    lambdaLogger.log("Name = " + request.getName());
    return new Response(request.getGreeting() + ", " + request.getName());
  }
}

com.demo.Request.java

package com.demo;

public class Request {
  private String greeting;
  private String name;
  
  public Request() {
    this.greeting = "";
    this.name = "";
  }
  public Request(String greeting, String name) {
    this.greeting = greeting;
    this.name = name;
  }
  public String getGreeting() {
    return this.greeting;
  }
  public void setGreeting(String greeting) {
    this.greeting = greeting;
  }
  public String getName() {
    return this.name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

com.demo.Response.java

package com.demo;

public class Response {
  private String result;
  
  public Response() {
    this.result = "";
  }
  public Response(String result) {
    this.result = result;
  }
  public String getResult() {
    return this.result;
  }
  public void setResult(String result) {
    this.result = result;
  }
}

 ■呼び出し側

 * 以下の関連記事を参照のこと

Lambda ~ JavaScript / クライアントサイド編 ~
https://dk521123.hatenablog.com/entry/2017/05/25/233100

 参考文献

公式サイト

パッケージの作り方の参考になる
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-create-jar-pkg-maven-and-eclipse.html
Lambda 関数ハンドラー
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-programming-model-handler-types.html

 一般サイト

http://qiita.com/Keisuke69/items/fc39a2f464d14480a432
http://yamada.daiji.ro/blog/?p=271
環境変数
http://qiita.com/ukey-ino/items/719fab82f2d570b28a58

 関連記事

Lambda ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2017/04/05/235618
Lambda ~ JavaScript / クライアントサイド編 ~
https://dk521123.hatenablog.com/entry/2017/05/25/233100