はのちゃ爆発

はのちゃが技術ネタとか日常のこととかを書いてます。

Eclipse のインストールから始める Java で AWS Lambda

JavaAWS Lambda を使おうとしていろいろ躓いたので、やり方をまとめておく。

1. Eclipse のインストール

何はともあれ、まずは 最新の Eclipse を導入しましょう。

私は最新のものを使わなかったばっかりに半日無駄にしました。

2016/08/15 現在、最新版のコードネームは "Neon" でした。

eclipse.org

"Eclipse IDE for Java EE Developers"、もしくは "Eclipse IDE for Java Developers" を導入すればいいかと思います。

2. AWS Toolkit for Eclipse のインストール

早速インストールした Eclipse を開き、上部の "Help" => "Install New Software..." を開きます。

f:id:hano_tea:20160817162944p:plain

開いたウィンドウの "Work with" 欄に http://aws.amazon.com/eclipse と入力しエンター。

少し待つと、下部のリストにインストールできるパッケージ一覧が出ます。

ここのパッケージ一覧画面の表示が、各種解説サイト(含む公式ドキュメント)とは異なっています。 先頭に "Optional" と付いていない、

  • AWS Core Management Tools
  • AWS Deployment Tools

の2つにチェックを入れて、 "Next" をクリック。後は画面の指示に従ってインストールを進めます。

3. AWS 認証情報の追加

AWS の認証情報をコマンドライン上などで登録したことがない場合、ここで認証情報を追加する必要があります。 AWSAccess Key ID と Secret Access Key の2つを記入して追加します。

この辺りの説明は割愛します。

4. AWS Lambda Java Project の作成

"File" => "New" => "Other..." と選択すると出てくるメニューで "AWS" フォルダ内の "AWS Lambda Java Project" を選択。

f:id:hano_tea:20160817163146p:plain

プロジェクトの新規作成画面が表示されるので、お好きな "Project Name" をまず入力します。

次に、"Lambda Function Handler" 内の項目で、実際の AWS Lambda Function (Lambda関数)に関する設定を行います。 以下の様な設定項目があります。

  • Package Name
  • Class Name
  • Handler Type
  • Input Type
  • Output Type

"Package Name" はJavaのパッケージ名です。Javaっぽいですね。 正直この辺の命名規則とかはあまりよく知らないのですが、ドメイン名の逆順がよく出てきます。 詳しく知りたい、ちゃんと設定したい方は以下のページを見るといいかもしれません。

パッケージ (Java) - Wikipedia

とりあえず動かすだけなら、あまり深く考えずに com.example.hogefuga みたいな感じでもいいと思います。 (Javaの使い手に殺されそう)

"Class Name" は、Lambdaで実行されるクラスの名前を指定します。 ここで指定したクラス内に、AWS Lambda が呼び出す Lambda 関数のハンドラーを実装します。

"Handler Type" ではハンドラーの種類を "Request Handler" か "Stream Request Handler" から選びます…が、わかりにくいので、公式ドキュメントから説明を引用。

AWS Lambda は、Lambda 関数を実行するときにハンドラーを呼び出します。最初のパラメータはハンドラーへの入力です。これは、イベントデータ(イベントソースによって公開される)または文字列やカスタムデータオブジェクトなど、ユーザーが提供するカスタム入力とすることができます。

AWS Lambda は、ハンドラーの次の入出力タイプをサポートします。

Java のシンプルな型(AWS Lambda は、文字列型、整数型、ブール型、マップ型、およびリスト型をサポートします)

POJO (Plain Old Java Object) 型

・ストリーム型(POJO を使用しない場合、または Lambda のシリアル化のアプローチがニーズに合わない場合は、バイトストリーム実装を使用できます)

ここで選択するのはストリーム型がそうでないかの二択です。 基本的にはストリームでない "Request Handler" を選んでおけば大丈夫です。

"Input Type" は、Lambda を起動するためのイベントソース、もしくは任意の型を指定します。 イベントソースは他のAWSサービス、S3やSNSKinesisなどが指定できます。 一番簡単なのは、 "Custom" を選択して適当な型…デフォルトの "Object" のまま、もしくは "String" などを指定することです。

"Output Type" はその名の通り出力されるデータの型です。 こちらも "Object" や "String" にしておくのが楽です。

5. Lambda 関数の編集

上記手順で生成されるコードは以下の様なものです。

package com.hanocha.lambdatest;

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

public class LambdaFunctionHandler implements RequestHandler<String, String> {

    @Override
    public String handleRequest(String input, Context context) {
        context.getLogger().log("Input: " + input);

        // TODO: implement your handler
        return null;
    }

}

生成直後のこのコードでも、Lambda 関数として成立しています。 ただ、一番最後の返り値が null なので、そこだけ input などに書き換えておきましょう。

6. AWS Lambda へのアップロード

自動生成されたコードですが、とりあえず AWS Lambda にアップロードしてみましょう。 Eclipse のコードエディタで右クリックし、メニューの "AWS Lambda" => "Upload function to AWS Lambda" を選択。

f:id:hano_tea:20160817163333p:plain

最初の画面では、アップロードしたいリージョンと新たに作成したい Lambda 関数名を指定します。 すでにある Lambda 関数を選択してアップデートすることもできます。指定したら次へ。

f:id:hano_tea:20160817163433p:plain

次の画面の "Basic Settings" 内の "description" には Lambda 関数の説明を書きますが、空でも大丈夫です。

続いて "Function Execution" ですが、"Handler" は自動的に先ほど自動生成されたクラスが指定されているはずです。

"IAM Role" は、 Lambda 関数用の "IAM Role" を選択します。特に用意していなくても、 リスト横の "Create" ボタンを押せば都合のいいものを自動作成してくれます。

"S3 Bucket for Function Code" では、そのまま、Lambda 関数のコードを(一時?)保存しておくための AWS S3 Bucket を指定します。 これまた、特に用意していなくても、 "Create" ボタンで適当な Bucket を作成してくれます。

"Advanced Settings" は一旦そのままで構いません。 実際に使える Lambda 関数を作成するときには、ここの値を適切に設定しないとタイムアウトで動かなかったり、 メモリ量が足りなくて動かなかったり、多くのメモリで長時間動かしすぎて課金発生したり…とかなります。

設定が終わったら、 "Finish" ボタンを押すとコードのアップロードが始まります。終わるまで気長に待ちましょう。

7. Lambda 関数の実行

f:id:hano_tea:20160817163608p:plain

アップロードが終わったら、同じく右クリックメニューから "Run function on AWS Lambda..." を選びます。 すると、Lambda 関数に渡すパラメータを入力する画面が出てきます。

f:id:hano_tea:20160817163647p:plain

関数の作成時、 "Input Type" で指定した型に合わせた内容を渡す必要があります。 String を 指定していた場合は何らかの文字列なので、 "" で囲まれた任意の文字列を入力します。 Object を指定した場合は JSON 形式でオブジェクトを入力します。

データを入力したら "Invoke" を押すと、Lambda 関数が実行されます。

まとめ

以上、Eclipse を使った AWS Lambda Java の簡単な使い方でした。

あとは自動生成された Java コードにプログラムを追加していくだけで、簡単に Lambda を使えます。

他の AWS サービス、例えば S3 と連携して Lambda を動かすといったものもありますが、それはまた別の機会に。