Lambda 任务 - 适用于 Java 的 AWS 开发工具包
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Lambda 任务

另一个方法是与 Amazon SWF 活动一起使用,就是使用 Lambda 函数代表工作流中的工作单元,并按照安排活动的相似方法安排它们。

本主题主要介绍如何使用AWS SDK for Java实施 Amazon SWF Lambda 任务。有关 Lambda 任务的更多概要性信息,请参阅 Amazon SWF Developer Guide 中的 AWS Lambda 任务

设置跨服务 IAM 角色以运行 Lambda 函数

在 Amazon SWF 能够运行您的 Lambda 函数前,需要设置一个 IAM 角色并授予 Amazon SWF 权限,让它代表您运行 Lambda 函数。有关如何完成该操作的完整信息,请参阅AWS Lambda 任务

在注册将使用 Lambda 任务的工作流程时,将需要此 IAM 角色的 Amazon Resource Name (ARN)。

创建 Lambda 函数

您可以使用包括 Java 在内的多种不同语言编写 Lambda 函数。有关如何编写、部署和使用 Lambda 函数的完整信息,请参阅 AWS Lambda 开发人员指南

注意

使用哪种语言编写 Lambda 函数并不重要,无论使用哪种语言编写工作流程代码,所有 Amazon SWF 工作流程都可以安排和运行您的函数。Amazon SWF 处理运行函数和传入传出数据的详细信息。

下面是一个简单的 Lambda 函数,它可以用于代替构建简单的 Amazon SWF 应用程序中的活动。

  • 此版本写入到 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 = "Amazon 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 Developer Guide 中的创建部署程序包 (Java)。您可能还希望查看标题为使用 Java 编写 LAM 函数的编程模型的章节。

Lambda 函数使用 eventinput 对象作为第一个参数,使用 context 对象作为第二个参数,提供有关运行 Lambda 函数的请求的相关信息。该特定函数要求使用 JSON 提供输入,并将 who 字段设置为用于创建问候语的名称。

注册用于 Lambda 的工作流

对于预定 Lambda 函数的工作流,必须提供 IAM 角色的名称,由其为 Amazon SWF 提供调用 Lambda 函数的权限。您可以在工作流注册期间,使用 withDefaultLambdaRolesetDefaultLambdaRole 或 RegisterWorkflowTypeRequest 方法进行设置。

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 任务与调度活动相似。您可以使用 ScheduleLambdaFunctionDecisionType 和 ScheduleLambdaFunctionDecisionAttributes 提供决策。

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 中,必须提供 name,这是要调用的 Lambda 函数的 ARN;还必须提供 id,这是用于在历史记录日志中标识 Lambda 函数的 Amazon SWF 的名称。

还可以为 Lambda 函数提供可选的 input 并设置它的 start to close timeout 值,这是在生成 LambdaFunctionTimedOut 事件之前允许 Lambda 函数运行的秒数。

注意

在给出函数名称的情况下,该代码使用 AWSLambdaClient 检索 Lambda 函数的 ARN。您可以使用该方法,以避免您的代码中包含完整 ARN 的硬编码 (包括 AWS 账户 ID)。

在决策程序中处理 Lambda 函数事件

Lambda 任务将生成许多事件,在轮询工作流工作线程中的决策任务时,您可以对这些事件执行操作,这些事件具有 Lambda、、EventType 和 LambdaFunctionScheduledLambdaFunctionStarted 任务的生命周期。LambdaFunctionCompleted 如果 Lambda 函数失败或运行时间超出其超时值,您分别会收到 LambdaFunctionFailedLambdaFunctionTimedOut 事件类型。

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 函数接收输出

当您收到 LambdaFunctionCompleted EventType 时,可以检索 Lambda 函数的返回值,方法是先对 getLambdaFunctionCompletedEventAttributesHistoryEvent 对象调用 以获取 LambdaFunctionCompletedEventAttributes,然后调用其 方法检索 getResult 函数的输出:Lambda

LambdaFunctionCompleted: running_functions--;

此示例的完整源代码

您可以在 Github 上的 aws-java-developer-guide/tree/master/doc_source/snippets/helloswf_lambda/> 中浏览此示例 (位于 aws-java-developer-guide 存储库中)。