Amazon Lambda 任务 - Amazon Simple Workflow Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon Lambda 任务

关于 Amazon Lambda

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

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

重要

您的 Amazon 账户需要针对 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 的 Amazon 区域运行。要详细了解当前支持 Lambda 的区域,请参阅 Amazon Web Services General Reference中的 Lambda Regions and Endpoints

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

在您的工作流中使用 Lambda 任务

要在 Amazon SWF 工作流中使用 Lambda 任务,您需要:

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

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

  3. 在工作流执行期间调用 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. Amazon 服务角色下,选择 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. 选择复制 Amazon 托管式策略,然后从列表中选择 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. Amazon 服务角色下,选择 Amazon SWF,然后选择下一步

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

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

将 IAM 角色附加到工作流

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

可以将角色附加到工作流的位置有两个:

  • 在工作流类型注册时。随后,在每次执行该工作流类型时,可以将此角色用作默认 Lambda 角色。

  • 在启动工作流执行时。此角色将仅在此工作流执行期间(且在整个执行过程中)使用。

为工作流类型提供默认 Lambda 角色
  • 在调用 RegisterWorkflowType 时,将 defaultLambdaRole 字段设为已定义角色的 ARN。

提供工作流执行期间使用的 Lambda 角色
  • 在调用 StartWorkflowExecution 时,将 lambdaRole 字段设为已定义角色的 ARN。

注意

如果调用 RegisterWorkflowType 或 StartWorkflowExecution 的账户无权使用给定角色,则调用将失败并返回 OperationNotPermittedFault。

从 Amazon SWF 工作流调用 Lambda 函数

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

在调用 RespondDecisionTaskCompleted 时,请向决策列表提供 ScheduleLambdaFunctionDecisionAttributes。例如:

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

设置以下参数:

  • ID 是 Lambda 任务的标识符。此值必须为 1-256 个字符的字符串,且不能包含 :(冒号)、/(斜杠)、|(竖线)等字符,也不能保护任何控制字符(\u0000 - \u001f 和 \u007f - \u009f)及文字字符串 arn

  • name 是 Lambda 函数的名称。您必须为 Amazon SWF 工作流提供一个允许其调用 Lambda 函数的 IAM 角色。像 Lambda 调用操作一样,提供的名称必须遵循对 FunctionName 参数的约束。

  • input 是函数的可选输入数据。像 Lambda 调用操作一样,如果设置,则它必须遵循 ClientContext 参数的约束。

  • startToCloseTimeout 是在任务失败并返回超时异常之前,函数可以花费的可选最长时间(以秒为单位)。可以使用 NONE 值指定无期限。

有关更多信息,请参阅 Implementing Amazon Lambda Tasks