「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上に置いておきました。
まずはpom.xmlにAWS SDKを追加します。今回は面倒だったのでフルで依存関係を設定していますが、サービス単位とかで細かく指定することも可能です。例えばaws-java-sdk-dynamodbを指定することも可能です。
というわけでpom.xmlの<dependencies></dependencies>
に追加します。
<dependencies>
--省略--
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.9.7</version>
</dependency>
</dependencies>
続いてコードです。
今回はこんな感じです。
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の画面で確認してみます。
はい、ちゃんと実行できてますね。
Rubyほど簡単ではないですがこのようにJavaからもLambda functionを呼び出せます。
免責
こちらは個人の意見で、所属する企業や団体は関係ありません。