本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Lambda 编排示例
此示例项目演示了如何在 Step Functions 状态机中集成 Amazon Lambda 函数。
在这个项目中,Step Functions 使用 Lambda 函数来检查股票价格并确定买入或卖出交易建议。然后向用户提供此建议,用户可以选择是买入还是卖出股票。交易结果将使用 SNS 主题返回。
有关 Step Functions 服务集成的更多信息,请参阅以下内容:
-
适用于以下内容的 IAM 策略:
注意
此示例项目可能会产生费用。
对于新 Amazon 用户,可以使用免费使用套餐。在此套餐中,低于某种使用水平的服务是免费的。有关 Amazon 费用和免费套餐的更多信息,请参阅定价
第 1 步:创建状态机并预置资源
-
打开 Step Functions 控制台
,然后选择创建状态机。 -
在搜索框中键入
Orchestrate Lambda functions
,然后从返回的搜索结果中选择编排 Lambda 函数。 -
选择下一步以继续。
-
Step Functions 列出了您选择的示例项目中 Amazon Web Services 使用的。它还显示了示例项目的工作流图。将此项目部署到您的, Amazon Web Services 账户 或者将其用作构建您自己的项目的起点。根据您想继续的方式,选择运行演示或构建依据。
该示例项目部署了以下资源:
-
五个 Lambda 函数
-
一个 Amazon Simple Queue Service 队列
-
一个 Amazon Simple Notification Service 主题
-
一个 Amazon Step Functions 状态机
-
相关 Amazon Identity and Access Management (IAM) 角色
下图显示了编排 Lambda 函数示例项目的工作流图:
-
-
选择使用模板继续进行选择。
-
请执行以下操作之一:
-
如果您选择构建依据,Step Functions 将为您选择的示例项目创建工作流原型。Step Functions 不会部署工作流定义中列出的资源。
在 Workflow Studio 的设计模式下,从状态浏览器中拖放状态,继续构建工作流原型。或者切换到代码模式,该模式提供了一个类似于 VS Code 的集成代码编辑器,用于在 Step Functions 控制台中更新状态机的 Amazon States Language(ASL)定义。有关使用 Workflow Studio 构建状态机的更多信息,请参阅使用 Workflow Studio。
重要
请记住,在运行工作流之前,为示例项目中使用的资源更新占位符 Amazon 资源名称 (ARN)。
-
如果您选择了 “运行演示”,Step Functions 将创建一个只读示例项目,该项目使用 Amazon CloudFormation 模板将该模板中列出的 Amazon 资源部署到您的 Amazon Web Services 账户。
提示
要查看示例项目的状态机定义,请选择代码。
准备就绪后,选择部署并运行以部署示例项目并创建资源。
创建这些资源和相关 IAM 权限可能需要长达 10 分钟的时间。在部署资源时,您可以打开 CloudFormation 堆栈 ID 链接以查看正在配置哪些资源。
创建示例项目中的所有资源后,您可以在状态机页面上看到新的示例项目。
重要
CloudFormation 模板中使用的每项服务都可能收取标准费用。
-
第 2 步:运行状态机
配置并部署完所有资源后,将显示启动执行对话框。
-
在状态机页面上,选择您的示例项目。
-
在示例项目页面上,选择启动执行。
-
在启动执行对话框中,执行以下操作:
-
(可选)要识别您的执行,您可以在名称框中为其指定一个名称。默认情况下,Step Functions 会自动生成一个唯一的执行名称。
注意
Step Functions 允许您为状态机、执行和活动创建名称,以及包含非 ASCII 字符的标签。这些非 ASCII 名称不适用于亚马逊。 CloudWatch为确保您可以跟踪 CloudWatch 指标,请选择一个仅使用 ASCII 字符的名称。
-
(可选)在输入框中,以 JSON 格式输入输入值以便运行工作流。
如果您选择运行演示,则无需提供任何执行输入。
注意
如果您部署的演示项目包含预先填充的执行输入数据,请使用该输入来运行状态机。
-
选择启动执行。
-
Step Functions 控制台会将您引导到一个以您的执行 ID 为标题的页面。该页面被称为执行详细信息页面。在此页面上,您可以随着执行的进展或者在执行完成后查看执行结果。
要查看执行结果,请在图表视图上选择各个状态,然后在步骤详细信息窗格中选择各个选项卡,分别查看每个状态的详细信息,包括输入、输出和定义。有关可在执行详细信息页面上查看的执行信息的详细信息,请参阅“执行详细信息”页面 – 界面概述。
-
关于状态机及其执行
此示例项目中的状态机 Amazon Lambda 通过将参数直接传递给这些资源来集成,使用 Amazon SQS 队列管理人工批准请求,并使用 Amazon SNS 主题返回查询结果。
Step Functions 执行接收 JSON 文本作为输入并将该输入传递到工作流中的第一个状态。各个状态将接收输入形式的 JSON 数据并通常将 JSON 数据以输出形式传递到下一个状态。在本示例项目中,每个步骤的输出都作为输入传递给工作流中的下一个步骤。例如,生成买入/卖出建议步骤接收检查股价步骤的输出作为输入。此外,生成买入/卖出建议步骤的输出将作为输入传递到下一个步骤请求人工审批,该步骤模拟人工审批步骤。
要实现人工审批步骤,通常需要暂停工作流的执行,直到任务令牌返回。在此示例项目中,一条消息被传递到 Amazon SQS 队列,该队列被用作定义用于处理回调功能的 Lambda 函数的触发器。该消息包含任务令牌和上一步返回的输出。Lambda 函数使用消息的有效载荷被调用。工作流执行将暂停,直到它通过 SendTaskSuccess
API 调用收到返回的任务令牌。有关任务令牌的更多信息,请参阅等待具有任务令牌的回调。
StepFunctionsSample-HelloLambda-ApproveSqsLambda
函数的以下代码显示了如何定义该函数,以便通过 Step Functions 状态机自动批准 Amazon SQS 队列提交的任何任务。
exports.lambdaHandler = (event, context, callback) => {
const stepfunctions = new aws.StepFunctions();
// For every record in sqs queue
for (const record of event.Records) {
const messageBody = JSON.parse(record.body);
const taskToken = messageBody.TaskToken;
const params = {
output: "\"approved\"",
taskToken: taskToken
};
console.log(`Calling Step Functions to complete callback task with params ${JSON.stringify(params)}`);
// Approve
stepfunctions.sendTaskSuccess(params, (err, data) => {
if (err) {
console.error(err.message);
callback(err.message);
return;
}
console.log(data);
callback(null);
});
}
};
浏览此示例状态机以了解 Step Functions 如何控制 Lambda 和 Amazon SQS。
有关 Amazon Step Functions 如何控制其他 Amazon 服务的更多信息,请参阅与其他服务 Amazon Step Functions 一起使用。
{
"StartAt": "Check Stock Price",
"States": {
"Check Stock Price": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLam-CheckStockPriceLambda-444455556666",
"Next": "Generate Buy/Sell recommendation"
},
"Generate Buy/Sell recommendation": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-Hello-GenerateBuySellRecommend-123456789012",
"ResultPath": "$.recommended_type",
"Next": "Request Human Approval"
},
"Request Human Approval": {
"Type": "Task",
"Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",
"Parameters": {
"QueueUrl": "https://sqs.us-west-1.amazonaws.com/111122223333/StepFunctionsSample-HelloLambda4444-5555-6666-RequestHumanApprovalSqs-777788889999",
"MessageBody": {
"Input.$": "$",
"TaskToken.$": "$$.Task.Token"
}
},
"ResultPath": null,
"Next": "Buy or Sell?"
},
"Buy or Sell?": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.recommended_type",
"StringEquals": "buy",
"Next": "Buy Stock"
},
{
"Variable": "$.recommended_type",
"StringEquals": "sell",
"Next": "Sell Stock"
}
]
},
"Buy Stock": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLambda-BuyStockLambda-000000000000",
"Next": "Report Result"
},
"Sell Stock": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLambda-SellStockLambda-111111111111",
"Next": "Report Result"
},
"Report Result": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "arn:aws:sns:us-west-1:111122223333:StepFunctionsSample-HelloLambda1111-2222-3333-ReportResultSnsTopic-222222222222",
"Message": {
"Input.$": "$"
}
},
"End": true
}
}
}
有关在将 Step Functions 与其他 Amazon 服务一起使用时如何配置 IAM 的信息,请参阅集成服务的 IAM 策略。
IAM 示例
示例项目生成的这些示例 Amazon Identity and Access Management (IAM) 策略包括执行状态机和相关资源所需的最低权限。我们建议在您的 IAM 策略中仅包含这些必需的权限。
{
"Statement": [
{
"Action": [
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLam-CheckStockPriceLambda-444455556666",
"Effect": "Allow"
}
]
}
{
"Statement": [
{
"Action": [
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-Hello-GenerateBuySellRecommend-123456789012",
"Effect": "Allow"
}
]
}
{
"Statement": [
{
"Action": [
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLambda-BuyStockLambda-777788889999",
"Effect": "Allow"
}
]
}
{
"Statement": [
{
"Action": [
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLambda-SellStockLambda-000000000000",
"Effect": "Allow"
}
]
}
{
"Statement": [
{
"Action": [
"sqs:SendMessage*"
],
"Resource": "arn:aws:sqs:us-west-1:111122223333:StepFunctionsSample-HelloLambda4444-5555-6666-RequestHumanApprovalSqs-111111111111",
"Effect": "Allow"
}
]
}
{
"Statement": [
{
"Action": [
"sns:Publish"
],
"Resource": "arn:aws:sns:us-west-1:111122223333:StepFunctionsSample-HelloLambda1111-2222-3333-ReportResultSnsTopic-222222222222",
"Effect": "Allow"
}
]
}
有关在将 Step Functions 与其他 Amazon 服务一起使用时如何配置 IAM 的信息,请参阅集成服务的 IAM 策略。