Lambda タスク - AWS SDK for Java 1.x

AWS SDK for Java 1.x は 2025 年 12 月 31 日にend-of-supportしました。新しい機能、可用性の向上、セキュリティ更新のために、AWS SDK for Java 2.x に移行することをお勧めします。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Lambda タスク

Amazon SWF アクティビティの代わりに、またはこれに併せて Lambda 関数を使用してワークフローの作業単位を表し、それらをアクティビティに合わせて同様にスケジュールできます。

このトピックでは、AWS SDK for Java を使用して Amazon SWF Lambda タスクを実装する方法について説明します。一般的な Lambda タスクの詳細については、「Amazon SWF デベロッパーガイド」の「AWS Lambda Tasks」を参照してください。

Lambda 関数を実行するサービス間 IAM ロールの設定

Amazon SWF が Lambda 関数を実行するには、事前に、ユーザーに代わって Lambda 関数を実行するための Amazon SWF 許可を付与するよう IAM ロールを設定する必要があります。これを行う方法に関する詳細については、「AWS Lambda Tasks」を参照してください。

Lambda タスクを使用するワークフローを登録するときに、この IAM ロールの Amazon リソースネーム (ARN) が必要になります。

Lambda 関数の作成

Java を含め、多数の異なる言語で Lambda 関数を記述できます。Lambda 関数の作成、デプロイ、および使用の詳細については、「AWS Lambda デベロッパーガイド」を参照してください。

注記

Lambda 関数の記述に使用する言語は何であってもかまいません。ワークフローコードが記述されている言語にかかわらず、任意の Amazon SWF ワークフローによってスケジュールおよび実行できます。Amazon SWF は関数の実行の詳細を処理し、データをやり取りします。

シンプルな Amazon SWF アプリケーションの構築のアクティビティの代わりに使用できるシンプルな Lambda 関数を次に示します。

  • このバージョンは JavaScript で書かれており、AWS マネジメントコンソールを使用して直接入力できます。

    exports.handler = function(event, context) { context.succeed("Hello, " + event.who + "!"); };
  • 次に示すのは、Java で書かれた同じ関数です。これも Lambda でデプロイして実行できます。

    package example.swf.hellolambda; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.util.json.JSONException; import com.amazonaws.util.json.JSONObject; public class SwfHelloLambdaFunction implements RequestHandler<Object, Object> { @Override public Object handleRequest(Object input, Context context) { String who = "{SWF}"; if (input != null) { JSONObject jso = null; try { jso = new JSONObject(input.toString()); who = jso.getString("who"); } catch (JSONException e) { e.printStackTrace(); } } return ("Hello, " + who + "!"); } }
    注記

    Java 関数の Lambda へのデプロイの詳細については、AWS Lambda デベロッパーガイドのデプロイパッケージの作成 (Java) を参照してください。また、Java で Lambda 関数を作成するためのプログラミングモデルというタイトルのセクションも参照することをお勧めします。

Lambda 関数は、event または input オブジェクトを最初のパラメータとして受け取り、context オブジェクトを 2 番目のパラメータとして受け取ります。このオブジェクトは、Lambda 関数を実行するリクエストに関する情報を提供します。この特定の関数は、入力が JSON で、who フィールドがあいさつの作成に使用される名前に設定されていることを想定しています。

Lambda で使用するワークフローを登録する

ワークフローで Lambda 関数をスケジュールするには、Amazon SWF 関数を呼び出すアクセス権限を Lambda に提供する IAM ロールの名前を指定する必要があります。これは、withDefaultLambdaRoleRegisterWorkflowTypeRequestsetDefaultLambdaRole または メソッドを使用して、ワークフロー登録中に設定できます。

System.out.println("** Registering the workflow type '" + WORKFLOW + "-" + WORKFLOW_VERSION + "'."); try { swf.registerWorkflowType(new RegisterWorkflowTypeRequest() .withDomain(DOMAIN) .withName(WORKFLOW) .withDefaultLambdaRole(lambda_role_arn) .withVersion(WORKFLOW_VERSION) .withDefaultChildPolicy(ChildPolicy.TERMINATE) .withDefaultTaskList(new TaskList().withName(TASKLIST)) .withDefaultTaskStartToCloseTimeout("30")); } catch (TypeAlreadyExistsException e) {

Lambda タスクのスケジュール

Lambda タスクのスケジュールは、アクティビティのスケジュールに似ています。`ScheduleLambdaFunction`DecisionTypeScheduleLambdaFunctionDecisionAttributes を使用して Decision を提供します。

running_functions == 0 && scheduled_functions == 0) { AWSLambda lam = AWSLambdaClientBuilder.defaultClient(); GetFunctionConfigurationResult function_config = lam.getFunctionConfiguration( new GetFunctionConfigurationRequest() .withFunctionName("HelloFunction")); String function_arn = function_config.getFunctionArn(); ScheduleLambdaFunctionDecisionAttributes attrs = new ScheduleLambdaFunctionDecisionAttributes() .withId("HelloFunction (Lambda task example)") .withName(function_arn) .withInput(workflow_input); decisions.add(

ScheduleLambdaFuntionDecisionAttributes で、呼び出す Lambda 関数の ARN である name と、履歴ログで Lambda 関数を識別するために Amazon SWF が使用する名前である id を指定する必要があります。

また、Lambda 関数のオプションの input を指定し、その start to close timeout 値を設定できます。これは、LambdaFunctionTimedOut イベントを生成する前に Lambda 関数に実行が許可される秒数です。

注記

このコードは、AWSLambdaClient を使用して、関数名が指定されると Lambda 関数の ARN を取得します。この手法を使用すれば、コードで完全な ARN のハードコーディング (AWS アカウント ID を含む) を行わなくても済みます。

ディサイダーでの Lambda 関数イベントの処理

Lambda タスクでは、ワークフローワーカーの決定タスクでポーリングを行うときにアクションを実行できる数多くのイベントを生成します。これらは、Lambda タスクのライフサイクルに対応し、LambdaFunctionScheduled などの LambdaFunctionStartedEventTypeLambdaFunctionCompleted 値を取ります。Lambda 関数が失敗するか、設定されたタイムアウト値よりも長い時間がかかる場合、それぞれ LambdaFunctionFailed または LambdaFunctionTimedOut イベントタイプを受け取ります。

boolean function_completed = false; String result = null; System.out.println("Executing the decision task for the history events: ["); for (HistoryEvent event : events) { System.out.println(" " + event); EventType event_type = EventType.fromValue(event.getEventType()); switch(event_type) { case WorkflowExecutionStarted: workflow_input = event.getWorkflowExecutionStartedEventAttributes() .getInput(); break; case LambdaFunctionScheduled: scheduled_functions++; break; case ScheduleLambdaFunctionFailed: scheduled_functions--; break; case LambdaFunctionStarted: scheduled_functions--; running_functions++; break; case LambdaFunctionCompleted: running_functions--; function_completed = true; result = event.getLambdaFunctionCompletedEventAttributes() .getResult(); break; case LambdaFunctionFailed: running_functions--; break; case LambdaFunctionTimedOut: running_functions--; break;

Lambda 関数からの出力の受け取り

LambdaFunctionCompletedEventAttributes オブジェクトを取得するために HistoryEventLambdaFunctionCompleted`EventType, you can retrieve your –0— function’s return value by first calling `getLambdaFunctionCompletedEventAttributes を受け取り、getResult メソッドを呼び出して Lambda 関数の出力を取得する場合は以下のようになります。

LambdaFunctionCompleted: running_functions--;

この例の完全なソース。

この例の完全なソース :github:`<awsdocs/aws-java-developer-guide/tree/master/doc_source/snippets/helloswf_lambda/> は、Github の aws-java-developer-guide レポジトリで参照できます。