

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

# AWS Lambda 亚马逊 SWF 中的任务
<a name="lambda-task"></a>

**Topics**
+ [关于 AWS Lambda](#about-aws-lambda)
+ [使用 Lambda 任务的优势和限制](#benefits-limitations-lambda-tasks)
+ [在您的工作流中使用 Lambda 任务](#using-lambda-tasks-in-workflows)

## 关于 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 。

## 在您的工作流中使用 Lambda 任务
<a name="using-lambda-tasks-in-workflows"></a>

要在 Amazon SWF 工作流中使用 Lambda 任务，您需要：

1. 设置 IAM 角色，为 Amazon SWF 提供调用 Lambda 函数的权限。

1. 将 IAM 角色附加到工作流。

1. 在工作流执行期间调用 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角色向 Amazon 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**。

### 将 IAM 角色附加到工作流
<a name="attach-iam-role-to-workflow"></a>

定义 IAM 角色后，您需要将其附加到工作流，用于调用允许 Amazon SWF 访问的 Lambda 函数。

可以将角色附加到工作流的位置有两个：
+ 在工作流类型注册时。随后，在每次执行该工作流类型时，可以将此角色用作默认 Lambda 角色。
+ 在启动工作流执行时。此角色将仅在此工作流执行期间（且在整个执行过程中）使用。

**为工作流类型提供默认 Lambda 角色**
+ 调用时 RegisterWorkflowType，将该 defaultLambdaRole 字段设置为您定义的角色的 ARN。

**提供工作流执行期间使用的 Lambda 角色**
+ 调用时 StartWorkflowExecution，将 LambdaRole 字段设置为您定义的角色的 ARN。

**注意**  
如果调用 RegisterWorkflowType 或的账户 StartWorkflowExecution 无权使用给定角色，则调用将失败，并显示 OperationNotPermittedFault。

### 从 Amazon SWF 工作流调用 Lambda 函数
<a name="call-lambda-function-from-swf-workflow"></a>

您可以使用 ScheduleLambdaFunctionDecisionAttributes 数据类型来标识在工作流程执行期间要调用的 Lambda 函数。

在致电时 RespondDecisionTaskCompleted，请 ScheduleLambdaFunctionDecisionAttributes 向您的决策清单提供一个。例如：

```
{
  "decisions": [{
    "ScheduleLambdaFunctionDecisionAttributes": {
      "id": "lambdaTaskId",
      "name": "myLambdaFunctionName",
      "input": "inputToLambdaFunction",
      "startToCloseTimeout": "30"
    },
  }],
}
```

设置以下参数：
+ *ID* 是 Lambda 任务的标识符。此值必须为 1-256 个字符的字符串，且不能包含 :（冒号）、/（斜杠）、\$1（竖线）等字符，也不能保护任何控制字符（\$1u0000 - \$1u001f 和 \$1u007f - \$1u009f）及文字字符串 `arn`。
+ *name* 是 Lambda 函数的名称。您必须为 Amazon SWF 工作流提供一个允许其调用 Lambda 函数的 IAM 角色。提供的名称必须遵循 FunctionName 参数的约束，例如 Lambda Invoke 操作中的限制。
+ *input* 是函数的可选输入数据。如果已设置，则必须遵循 ClientContext 参数的约束条件，例如 Lambda Invoke 操作中的限制。
+ *startToClose超时*，可选的最大时间（以秒为单位），该函数在任务因超时异常而失败之前可以执行该函数。可以使用 NONE 值指定无期限。

有关更多信息，请参阅[实现 AWS Lambda 任务](https://docs.aws.amazon.com/amazonswf/latest/awsflowguide/lambda-task.html) 