

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

# 实施 AWS Lambda 任务
<a name="lambda-task"></a>

**Topics**
+ [关于 AWS Lambda](#about-aws-lambda)
+ [使用 Lambda 任务的优势和限制](#benefits-limitations-lambda-tasks)
+ [在 AWS Flow Framework 适用于 Java 的工作流程中使用 Lambda 任务](#using-lambda-tasks-in-java-flow-workflows)
+ [查看 HelloLambda 样本](#see-lambda-sample)

## 关于 AWS Lambda
<a name="about-aws-lambda"></a>

AWS Lambda 是一项完全托管的计算服务，它运行您的代码以响应由自定义代码或各种 AWS 服务（例如亚马逊 S3、DynamoDB、Amazon Kinesis、Amazon SNS 和 Amazon Cognito）生成的事件。有关 Lambda 的更多信息，请参阅 [AWS Lambda 开发人员指南](https://docs.aws.amazon.com/lambda/latest/dg/)。

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

**重要**  
对于亚马逊 SWF 代表您执行的 Lambda 执行（请求），将向您的 AWS 账户收费。[有关 Lambda 定价的详细信息，请参阅https://aws.amazon.com/lambda/定价/。](https://aws.amazon.com/lambda/pricing/)

## 使用 Lambda 任务的优势和限制
<a name="benefits-limitations-lambda-tasks"></a>

使用 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](https://docs.aws.amazon.com/general/latest/gr/rande.html#lambda_region)。
+ 目前，只有基本 SWF HTTP API 和适用于 Java 的 SWF HTTP API 支持 Lambda 任务。 AWS Flow Framework Ruby 版中目前不支持 Lambda 任务 AWS Flow Framework 。

## 在 AWS Flow Framework 适用于 Java 的工作流程中使用 Lambda 任务
<a name="using-lambda-tasks-in-java-flow-workflows"></a>

在 AWS Flow Framework 适用于 Java 的工作流程中使用 Lambda 任务有三个要求：
+ 要执行的 Lambda 函数。您可以使用已定义的任何 Lambda 函数。有关创建 Lambda 函数的更多信息，请参阅 [AWS Lambda Developer Guide](https://docs.aws.amazon.com/lambda/latest/dg/)。
+ IAM 角色，用于提供访问权限以从 Amazon SWF 工作流中执行 Lambda 函数。
+ 代码，用于在工作流中安排 Lambda 任务。

### 设置 IAM 角色
<a name="set-up-lambda-role"></a>

在从 Amazon SWF 调用 Lambda 函数之前，您必须先提供一个 IAM 角色，用于从 Amazon SWF 访问 Lambda。您可以：
+ 选择一个预定义的角色，即*AWSLambda角色*，以授予您的工作流程调用与您的账户关联的任何 Lambda 函数的权限。
+ 定义您自己的策略和关联角色，以授予工作流程调用特定 Lambda 函数的权限，这些函数由其 Amazon 资源名称 () ARNs 指定。

#### 限制 IAM 角色的访问权限
<a name="limit-iam-role-permissions"></a>

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

在以下示例中，`SourceArn`上下文密钥将 IAM 服务角色限制为仅在属于账户的 Amazon Simple Workflow Service 执行`someDomain`中使用。`123456789012`


+ **报表 1**

  **校长**：`"Service": "swf.amazonaws.com"`

  **操作：**`sts:AssumeRole`

```
"Condition": {
   "ArnLike": {
     "aws:SourceArn": "arn:aws:swf:*:123456789012:/domain/someDomain"
   }
}
```

在以下示例中，`SourceAccount`上下文密钥将 IAM 服务角色限制为只能在账户中的亚马逊简单工作流程服务执行中使用。`123456789012`

```
"Condition": {
   "StringLike": {
     "aws:SourceAccount": "123456789012"
   }
}
```

#### 为 Amazon SWF 提供调用任何 Lambda 角色的访问权限
<a name="providing-swf-access-invoke-any-lambda-role"></a>

*您可以使用预定义的角色（角色）使您的 Amazon SWF 工作流程能够调用与您的账户关联的任何 Lambda 函数。AWSLambda*

**使用 AWSLambda角色授予亚马逊 SWF 调用 Lambda 函数的权限**

1. 打开 [Amazon IAM 控制台](https://console.aws.amazon.com/iam/)。

1. 选择 **Roles**，然后选择 **Create New Role**。

1. 提供角色名称 (如 `swf-lambda`)，然后选择 **Next Step**。

1. 在 **AWS 服务角色**下，选择 **Amazon SWF**，然后选择**下一步**。

1. 在**附加策略**屏幕上，从列表中选择**AWSLambda角色**。

1. 检查角色之后，选择 **Next Step**，然后选择 **Create Role**。

#### 定义 IAM 角色以提供调用特定 Lambda 函数的访问权限
<a name="defining-iam-role-provide-access-invoke-specific-lambda-function"></a>

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

**创建 IAM 策略以提供对特定 Lambda 函数的访问权限**

1. 打开 [Amazon IAM 控制台](https://console.aws.amazon.com/iam/)。

1. 选择 **Policies**，然后选择 **Create Policy**。

1. 选择 “**复制 AWS 托管策略**”，然后从列表中选择 “**AWSLambda角色**”。随即将生成策略。根据需要编辑策略的名称和描述。

1. 在**策略文档**的*资源*字段中，添加您的 Lambda 函数的 ARN。例如：
   + **资源：**`arn:aws:lambda:us-east-1:111122223333:function:hello_lambda_function`
**注意**  
有关如何在 IAM 角色中指定资源的完整说明，请参阅**《Using IAM》中的 [Overview of IAM Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies_overview.html)。

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

您随后可以在创建新的 IAM 角色时选择该策略，并使用该角色提供对 Amazon SWF 工作流的调用访问权限。*此过程与使用角色策略创建角色非常相似。相反，请在创建角色时选择自己的策略。AWSLambda*

**使用 Lambda 策略创建 Amazon SWF 角色**

1. 打开 [Amazon IAM 控制台](https://console.aws.amazon.com/iam/)。

1. 选择 **Roles**，然后选择 **Create New Role**。

1. 提供角色名称 (如 `swf-lambda-function`)，然后选择 **Next Step**。

1. 在 **AWS 服务角色**下，选择 **Amazon SWF**，然后选择**下一步**。

1. 在**附加策略**屏幕上，从列表中选择特定于 Lambda 函数的策略。

1. 检查角色之后，选择 **Next Step**，然后选择 **Create Role**。

### 安排要执行的 Lambda 任务
<a name="schedule-lambda-tasks-for-execution"></a>

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

**注意**  
中的[HelloLambda 示例](#see-lambda-sample)充分证明了此过程 适用于 Java 的 AWS SDK。

**安排要执行的 Lambda 任务**

1. 在您的工作流程实现中，在 `DecisionContext` 实例上调用 `getLambdaFunctionClient()` 以获取一个 `LambdaFunctionClient` 实例。

   ```
   // Get a LambdaFunctionClient instance
   DecisionContextProvider decisionProvider = new DecisionContextProviderImpl();
   DecisionContext decisionContext = decisionProvider.getDecisionContext();
   LambdaFunctionClient lambdaClient = decisionContext.getLambdaFunctionClient();
   ```

1. 使用 `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);
   ```

1. 在工作流执行启动程序中，使用 `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 样本
<a name="see-lambda-sample"></a>

 适用于 Java 的 AWS SDK中提供了使用 Lambda 任务实现工作流的示例。要查看 and/or 运行它，[请下载源代码](https://aws.amazon.com/code/3015904745387737)。

Java *HelloLambda*示例随附的自述文件中提供了 AWS Flow Framework 有关如何生成和运行该示例的完整说明。