实施 AWS Lambda 任务 - AWS Flow Framework 适用于 Java

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

实施 AWS Lambda 任务

关于 AWS Lambda

AWS Lambda 是一种完全托管的计算服务,可运行您的代码以响应由自定义代码生成的事件或来自各种 AWS 服务(如 Amazon S3、DynamoDB、Amazon Kinesis、Amazon SNS 和 Amazon Cognito)的事件。有关 Lambda 的更多信息,请参阅 AWS Lambda 开发人员指南

Amazon Simple Workflow Service 提供了一项 Lambda 任务,以便您可以运行 Lambda 函数来代替传统的 Amazon SWF 活动,或与此类活动一起运行。

重要

您的 AWS 账户需要针对 Amazon SWF 代表您执行的 Lambda 执行(请求)付费。有关 Lambda 定价的详细信息,请参阅 https://aws.amazon.com/lambda/pricing/

使用 Lambda 任务的优势和限制

使用 Lambda 任务替代传统 Amazon SWF 活动具有许多优势:

  • Lambda 任务不需要像 Amazon SWF 活动类型一样注册或版本化。

  • 您可以使用已在工作流中定义的任何现有 Lambda 函数。

  • Lambda 函数由 Amazon SWF 直接调用,无需像传统活动那样,需要实现工作线程程序才能执行。

  • Lambda 为您提供指标和日志,用于跟踪和分析函数的执行情况。

您还应了解 Lambda 任务有很多限制:

  • Lambda 任务只能在支持 Lambda 的 AWS 区域运行。要详细了解当前支持 Lambda 的区域,请参阅 Amazon Web Services General Reference中的 Lambda Regions and Endpoints

  • 目前,只有基础 SWF HTTP API 和在适用于 Java 的 AWS Flow Framework 中才支持 Lambda 任务。适用于 Ruby 的 AWS Flow Framework 中当前不支持 Lambda 任务。

在适用于 Java 的 AWS Flow Framework 工作流中使用 Lambda 任务

在适用于 Java 的 AWS Flow Framework 工作流中使用 Lambda 任务有三个要求:

  • 要执行的 Lambda 函数。您可以使用已定义的任何 Lambda 函数。有关创建 Lambda 函数的更多信息,请参阅 AWS Lambda Developer Guide

  • IAM 角色,用于提供访问权限以从 Amazon SWF 工作流中执行 Lambda 函数。

  • 代码,用于在工作流中安排 Lambda 任务。

设置 IAM 角色

在从 Amazon SWF 调用 Lambda 函数之前,您必须先提供一个 IAM 角色,用于从 Amazon SWF 访问 Lambda。您可以:

  • 选择预定义的角色 AWSLambdaRole,为工作流提供调用与您账户关联的任何 Lambda 函数的访问权限。

  • 定义您自己的策略和关联角色,为工作流提供调用由其 Amazon 资源名称 (ARN) 指定的特定 Lambda 函数的访问权限。

限制 IAM 角色的访问权限

您可以使用资源信任策略中的 SourceArnSourceAccount 上下文密钥来限制提供给 Amazon SWF 的 IAM 角色的访问权限。这些密钥会限制 IAM 策略的使用,使其只能在属于指定域 ARN 的 Amazon Simple Workflow Service 执行中使用。如果您同时使用两个全局条件上下文密钥,则在同一策略语句中使用 aws:SourceAccount 值和 aws:SourceArn 值中引用的账户时,必须使用相同的账户 ID。

在下面的信任策略示例中,我们使用 SourceArn 上下文密钥将 IAM 服务角色限制为只能在属于账户 123456789012 中的 someDomain 的 Amazon Simple Workflow Service 执行中使用。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "swf.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:swf:*:123456789012:/domain/someDomain" } } } ] }

在下面的信任策略示例中,我们使用 SourceAccount 上下文密钥将 IAM 服务角色限制为只能在属于账户 123456789012 的 Amazon Simple Workflow Service 执行中使用。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "swf.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:SourceAccount": "123456789012" } } } ] }

为 Amazon SWF 提供调用任何 Lambda 角色的访问权限

您可以使用预定义的角色 AWSLambdaRole,使您的 Amazon SWF 工作流能够调用与您的账户相关联的任何 Lambda 函数。

使用 AWSLambdaRole 为 Amazon SWF 提供调用 Lambda 函数的访问权限
  1. 打开 Amazon IAM 控制台

  2. 选择 Roles,然后选择 Create New Role

  3. 提供角色名称 (如 swf-lambda),然后选择 Next Step

  4. AWS 服务角色下,选择 Amazon SWF,然后选择下一步

  5. Attach Policy 屏幕上,从列表中选择 AWSLambdaRole

  6. 检查角色之后,选择 Next Step,然后选择 Create Role

定义 IAM 角色以提供调用特定 Lambda 函数的访问权限

如果您要提供从工作流调用特定 Lambda 函数的访问权限,则需要定义自己的 IAM 策略。

创建 IAM 策略以提供对特定 Lambda 函数的访问权限
  1. 打开 Amazon IAM 控制台

  2. 选择 Policies,然后选择 Create Policy

  3. 选择复制 AWS 托管式策略,然后从列表中选择 AWSLambdaRole。随即将生成策略。根据需要编辑策略的名称和描述。

  4. 策略文档资源字段中,添加您的 Lambda 函数的 ARN。例如:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-east-1:111111000000:function:hello_lambda_function" ] } ] }
    注意

    有关如何在 IAM 角色中指定资源的完整说明,请参阅《Using IAM》中的 Overview of IAM Policies

  5. 选择 Create Policy 完成策略创建。

您随后可以在创建新的 IAM 角色时选择该策略,并使用该角色提供对 Amazon SWF 工作流的调用访问权限。此过程与使用 AWSLambdaRole 策略创建角色非常相似。不同之处是在创建角色时选择自己的策略。

使用 Lambda 策略创建 Amazon SWF 角色
  1. 打开 Amazon IAM 控制台

  2. 选择 Roles,然后选择 Create New Role

  3. 提供角色名称 (如 swf-lambda-function),然后选择 Next Step

  4. AWS 服务角色下,选择 Amazon SWF,然后选择下一步

  5. 附加策略屏幕上,从列表中选择特定于 Lambda 函数的策略。

  6. 检查角色之后,选择 Next Step,然后选择 Create Role

安排要执行的 Lambda 任务

在定义允许调用 Lambda 函数的 IAM 角色后,您可以安排在工作流中执行这些任务。

注意

AWS SDK for Java 中的 HelloLambda sample 完整演示了这一过程。

安排要执行的 Lambda 任务
  1. 在您的工作流程实现中,在 DecisionContext 实例上调用 getLambdaFunctionClient() 以获取一个 LambdaFunctionClient 实例。

    // Get a LambdaFunctionClient instance DecisionContextProvider decisionProvider = new DecisionContextProviderImpl(); DecisionContext decisionContext = decisionProvider.getDecisionContext(); LambdaFunctionClient lambdaClient = decisionContext.getLambdaFunctionClient();
  2. 使用 LambdaFunctionClient 上的 scheduleLambdaFunction() 方法安排任务,并向其传递创建的 Lambda 函数名称和 Lambda 任务的任何输入数据。

    // Schedule the Lambda function for execution, using your IAM role for access. String lambda_function_name = "The name of your Lambda function."; String lambda_function_input = "Input data for your Lambda task."; lambdaClient.scheduleLambdaFunction(lambda_function_name, lambda_function_input);
  3. 在工作流执行启动程序中,使用 StartWorkflowOptions.withLambdaRole() 将 IAM Lambda 角色添加到默认工作流选项中,然后在启动工作流时传递这些选项。

    // Workflow client classes are generated for you when you use the @Workflow // annotation on your workflow interface declaration. MyWorkflowClientExternalFactory clientFactory = new MyWorkflowClientExternalFactoryImpl(sdk_swf_client, swf_domain); MyWorkflowClientExternal workflow_client = clientFactory.getClient(); // Give the ARN of an IAM role that allows SWF to invoke Lambda functions on // your behalf. String lambda_iam_role = "arn:aws:iam::111111000000:role/swf_lambda_role"; StartWorkflowOptions workflow_options = new StartWorkflowOptions().withLambdaRole(lambda_iam_role); // Start the workflow execution workflow_client.helloWorld("User", workflow_options);

查看 HelloLambda 示例

AWS SDK for Java 中提供了使用 Lambda 任务实现工作流的示例。要查看和/或运行该示例,请下载源文件

有关如何构建和运行 HelloLambda 示例的完整说明,请参阅随适用于 Java 的 AWS Flow Framework 示例提供的 README 文件。