本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Lambda 编排示例
此示例项目演示了如何集成Amazon LambdaStep Functions 状态机。此示例项目创建了以下资源:
-
五个 Lambda 函数
-
Amazon Service 队列
-
Amazon Service 主题
-
相关Amazon Identity and Access Management(IAM) 角色
在这个项目中,Step Functions 使用 Lambda 函数来检查股票价格并确定买入或卖出交易建议。然后向用户提供此建议,并可以选择是买入还是卖出股票。交易结果使用 SNS 主题返回。
有关 Step Functions 服务集成的更多信息,请参阅以下内容:
-
的 IAM 策略:
此示例项目可能会产生费用。
为新 Amazon 用户提供了免费使用套餐。在此套餐中,低于某种使用水平的服务是免费的。有关的更多信息Amazon费用和免费套餐,请参阅定价
创建状态机并预置资源
-
打开Step Functions ct
然后选择创建状态机. -
在选择创作方法页面,选择运行示例项目.
-
选择编排 Lambda 函数.
状态机定义和可视化工作流显示。
-
选择 Next(下一步)。
此时将显示 Deploy resources (部署资源) 页面,其中列出了将创建的资源。对于本示例项目,资源包括:
-
状态机
-
Amazon SQS 队列
-
五个 Lambda 函数
-
一个 Amazon SNS 主题
-
相关的 IAM 角色
-
-
选择 Deploy Resources (部署资源)。
注意 创建这些资源和相关的 IAM 权限最多可能需要 10 分钟。当显示 Deploy resources (部署资源) 页面时,您可打开 Stack ID (堆栈 ID) 链接以查看正在预置的资源。
启动新的执行
配置和部署所有资源后,开始执行对话框出现。
-
(可选)要识别您的执行,可以在中为其指定一个名称名称盒子。默认情况下,Step Functions 会自动生成一个唯一的执行名称。
注意 Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于亚马逊 CloudWatch. 为了确保你可以追踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
-
选择 Start execution (开始执行)。
-
(可选)执行完成后,在图表检查器,然后选择Step In和步骤输出选项卡分别查看每个状态的输入和输出。
关于状态机及其执行
此示例项目中的状态机集成了Amazon Lambda通过将参数直接传递给这些资源,使用 Amazon SQS 队列管理人工批准请求,并使用 Amazon SNS 主题返回查询结果。
Step Functions 执行接收 JSON 文本作为输入,并将该输入传递给工作流中的第一个状态。各个状态接收 JSON 数据作为输入,通常将 JSON 数据作为输出传递给下一个状态。在此示例项目中,每个步骤的输出将作为输入传递到工作流中的下一个步骤。例如,生成买入/卖出建议step 接收输出查看股票价格步骤作为输入。此外,的输出生成买入/卖出建议step s 作为输入,传递给下一个步骤,请求人工批准,它模仿了人工批准的步骤。
要实现人工批准步骤,通常需要暂停工作流程执行,直到返回任务令牌。在此示例项目中,一条消息被传递到 Amazon SQS 队列,该队列用作定义用于处理回调功能的 Lambda 函数的触发器。该消息包含任务令牌和上一步返回的输出。使用消息的负载调用 Lambda 函数。工作流程执行将暂停,直到它收到带有SendTaskSuccess
API 调用。有关任务令牌的更多信息,请参阅等待具有任务令牌的回调.
的以下代码StepFunctionsSample-HelloLambda-ApproveSqsLambda
函数显示了如何将其定义为自动批准 Amazon SQS 队列通过 Step Functions 状态机提交的任何任务。
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
}
}
}
有关如何配置 IAM 与其他功能配合使用 Step FunctionsAmazon服务,请参阅集成服务的 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"
}
]
}
有关如何配置 IAM 与其他功能配合使用 Step FunctionsAmazon服务,请参阅集成服务的 IAM 策略.