Java
AWS
AWS_SDK
lambda
aws-sdk

AWS LambdaをJavaから使ってみる

More than 3 years have passed since last update.

AWS LambdaをRubyから使ってみる」のJava版です。
コードの部分がJavaに変わった以外に特に違いはありません。
なので、元記事も参照してもらえるといいかと思います。

AWS LambdaはS3やKinesis、DynamoDBのイベントをトリガーにJavaScript/Node.jsで書かれたコードスニペットを実行するというサービスです。
イベントの実行元として上記以外にAPIからの直接実行も可能となっているので今回はAWS SDK for Javaを利用してこれを試してみます。

Lambda functionは前回と同様のものを「invoke-from-sdk」という名前であらかじめ作成しておきます。実行される処理も前回と同様で渡されたパラメータ(JSON形式)のkey1というキーの値を読み取ってコンソールに出力します。

Java側のプロジェクトはMavenプロジェクトとして構成しています。
サンプルコードはgithub上に置いておきました。

https://github.com/Keisuke69/lambda-java-sample

まずはpom.xmlにAWS SDKを追加します。今回は面倒だったのでフルで依存関係を設定していますが、サービス単位とかで細かく指定することも可能です。例えばaws-java-sdk-dynamodbを指定することも可能です。
というわけでpom.xmlの<dependencies></dependencies>に追加します。

pom.xml
  <dependencies>
--省略--
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.9.7</version>
    </dependency>
  </dependencies>

続いてコードです。
今回はこんな感じです。

Sample.java
package org.sample.lambda;

import com.amazonaws.services.lambda.AWSLambdaClient;
import com.amazonaws.services.lambda.model.InvokeAsyncRequest;
import com.amazonaws.services.lambda.model.InvokeAsyncResult;

public class Sample {
    public static void main(String[] args){
        Sample sample = new Sample();
        sample.invokeLambdaFunction();
    }

    private void invokeLambdaFunction(){
        AWSLambdaClient lambda = new AWSLambdaClient();

        InvokeAsyncRequest invokeAsyncRequest = new InvokeAsyncRequest();
        invokeAsyncRequest.setFunctionName("invoke-from-sdk");
        invokeAsyncRequest.setInvokeArgs("{\"key1\":\"from java\"}");

        InvokeAsyncResult invokeAsyncResult = lambda.invokeAsync(invokeAsyncRequest);
        int status = invokeAsyncResult.getStatus().intValue();

        if(status == 202){
            System.out.println("success");
        }
    }
}

処理内容としては前回と同様です。
Lambdaのクライアントクラスとして処理をブロックする通常のAWSLambdaClientとノンブロッキングなAWSLambdaAsyncClientの2種類がありますが今回はサンプルなのでAWSLambdaClient(ブロックする方)を使っています。
従ってレスポンスが返ってくるまでwaitすることになります。

あと、今回はちゃんと例外処理をしていませんがinvokeAsyncメソッドはいくつかRuntimeExceptionを発生させるので実際にはtry~catchで囲むなど適切に処理してください。

実行したら一応CloudWatchの画面で確認してみます。

Screen Shot 2014-11-25 at 4.59.53 PM.png

はい、ちゃんと実行できてますね。
Rubyほど簡単ではないですがこのようにJavaからもLambda functionを呼び出せます。

免責
こちらは個人の意見で、所属する企業や団体は関係ありません。