本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS Lambda 任务
关于 AWS Lambda
AWS Lambda 是一项完全托管的计算服务,它运行您的代码以响应由自定义代码或各种 AWS 服务(例如亚马逊 S3、DynamoDB、Amazon Kinesis、Amazon SNS 和 Amazon Cognito)生成的事件。有关 Lambda 的更多信息,请参阅 AWS Lambda 开发人员指南。
Amazon Simple Workflow Service 提供了一项 Lambda 任务,以便您可以运行 Lambda 函数来代替传统的 Amazon SWF 活动,或与此类活动一起运行。
重要
对于亚马逊 SWF 代表您执行的 Lambda 执行(请求),将向您的 AWS 账户收费。有关 Lambda 定价的详细信息,请参阅https://aws.amazon.com/lambda/定价/。
使用 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 的 SWF HTTP API 支持 Lambda 任务。 AWS Flow Framework Ruby 版中目前不支持 Lambda 任务 AWS Flow Framework 。
在您的工作流中使用 Lambda 任务
要在 Amazon SWF 工作流中使用 Lambda 任务,您需要:
-
设置 IAM 角色,为 Amazon SWF 提供调用 Lambda 函数的权限。
-
将 IAM 角色附加到工作流。
-
在工作流执行期间调用 Lambda 函数。
设置 IAM 角色
在从 Amazon SWF 调用 Lambda 函数之前,您必须先提供一个 IAM 角色,用于从 Amazon SWF 访问 Lambda。您可以:
-
选择一个预定义的角色,即AWSLambda角色,以授予您的工作流程调用与您的账户关联的任何 Lambda 函数的权限。
-
定义您自己的策略和关联角色,以授予工作流程调用特定 Lambda 函数的权限,这些函数由其 Amazon 资源名称 () ARNs 指定。
限制 IAM 角色的访问权限
您可以使用资源信任策略中的 SourceArn
和 SourceAccount
上下文密钥来限制提供给 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 角色的访问权限
您可以使用预定义的角色(角色)使您的 Amazon SWF 工作流程能够调用与您的账户关联的任何 Lambda 函数。AWSLambda
使用 AWSLambda角色向 Amazon SWF 授予调用 Lambda 函数的权限
-
打开 Amazon IAM 控制台
。 -
选择 Roles,然后选择 Create New Role。
-
提供角色名称 (如
swf-lambda
),然后选择 Next Step。 -
在 AWS 服务角色下,选择 Amazon SWF,然后选择下一步。
-
在 “附加策略” 屏幕上,从列表中选择 “AWSLambda角色”。
-
检查角色之后,选择 Next Step,然后选择 Create Role。
定义 IAM 角色以提供调用特定 Lambda 函数的访问权限
如果要提供从工作流调用特定 Lambda 函数的访问权限,您需要定义自己的 IAM 策略。
创建 IAM 策略以提供对特定 Lambda 函数的访问权限
-
打开 Amazon IAM 控制台
。 -
选择 Policies,然后选择 Create Policy。
-
选择 “复制 AWS 托管策略”,然后从列表中选择 “AWSLambda角色”。随即将生成策略。根据需要编辑策略的名称和描述。
-
在策略文档的资源字段中,添加您的 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。
-
选择 Create Policy 完成策略创建。
您随后可以在创建新的 IAM 角色时选择该策略,并使用该角色提供对 Amazon SWF 工作流的调用访问权限。此过程与使用角色策略创建角色非常相似。相反,请在创建角色时选择自己的策略。AWSLambda
使用 Lambda 策略创建 Amazon SWF 角色
-
打开 Amazon IAM 控制台
。 -
选择 Roles,然后选择 Create New Role。
-
提供角色名称 (如
swf-lambda-function
),然后选择 Next Step。 -
在 AWS 服务角色下,选择 Amazon SWF,然后选择下一步。
-
在附加策略屏幕上,从列表中选择特定于 Lambda 函数的策略。
-
检查角色之后,选择 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 角色。提供的名称必须遵循 FunctionName 参数的约束,例如 Lambda Invoke 操作中的限制。
-
input 是函数的可选输入数据。如果已设置,则必须遵循 ClientContext 参数的约束条件,例如 Lambda Invoke 操作中的限制。
-
startToClose超时,可选的最大时间(以秒为单位),该函数在任务因超时异常而失败之前可以执行该函数。可以使用 NONE 值指定无期限。
有关更多信息,请参阅实现 AWS Lambda 任务