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

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

Amazon Step Functions 和 Amazon SAM

Amazon Toolkit for Visual Studio Code 作为集成体验的一部分,您可以将 Amazon SAM CLI 与结合使用,在本地创建状态机。您可以使用 Amazon SAM 构建无服务器应用程序,然后在 VS Code IDE 中构建状态机。然后,您可以验证、打包和部署您的资源。或者,您也可以发布到 Amazon Serverless Application Repository。

提示

要部署一个用于启动 Step Functions 工作流程的示例无服务器应用程序 Amazon Web Services 账户,请参阅 The Worksho Amazon Step Functions p 的模块 11-使用 Amazon SAM Amazon SAM部

为什么要将 Step Functions 配合使用 Amazon SAM?

当你将 Step Functions 与配合使用时, Amazon SAM 你可以:

  • 开始使用 Amazon SAM 示例模板。

  • 将状态机构建到无服务器应用程序中。

  • 使用变量替换在部署时将 ARN 替换到状态机中。

    Amazon CloudFormation 支持 DefinitionSubstitutions,它们可让您将工作流定义中的动态引用添加到您在 CloudFormation 模板中提供的值。您可以使用 ${dollar_sign_brace} 表示法将替换项添加到工作流定义中,从而添加动态引用。您还需要在CloudFormation模板中 StateMachine 资源的DefinitionSubstitutions属性中定义这些动态引用。在 CloudFormation 堆栈创建流程中,替换项将替换为实际值。有关更多信息,请参阅DefinitionSubstitutions 在Amazon SAM模板中

  • 使用 Amazon SAM 策略模板指定状态机的角色。

  • 使用 API Gateway、 EventBridge 事件或按 Amazon SAM 模板中的计划启动状态机执行。

Step Functions 与 Amazon SAM 规范集成

您可以使用 Amazon SAM 策略模板向状态机添加权限。借助这些权限,您能够编排 Lambda 函数和其他 Amazon 资源,以形成复杂而强大的工作流程。

Step Functions 与 SAM CLI 集成

Step Functions 已与 Amazon SAM CLI 集成。这样,就可以快速将状态机开发到无服务器应用程序中。

试试本使用 Amazon SAM 创建 Step Functions 状态机教程,学习 Amazon SAM 如何使用创建状态机。

支持的 Amazon SAM CLI 功能包括:

CLI 命令 描述
sam init

使用模板初始化无服务器应用程序。 Amazon SAM 可以与 SAM 模板一起使用以实现 Step Functions。

sam validate 验证 Amazon SAM 模板。
sam package

打包 Amazon SAM 应用程序。它创建一个包含您的代码和依赖项的 ZIP 文件,然后将其上传到 Amazon S3。然后,它返回 Amazon SAM 模板的副本,并将对本地构件的引用替换为此命令已将构件上传到的 Amazon S3 位置。

sam deploy 部署 Amazon SAM 应用程序。
sam publish

将 Amazon SAM 应用程序发布到 Amazon Serverless Application Repository。此命令采用打包的 Amazon SAM 模板并将应用程序发布到指定区域。

注意

使用 Amazon SAM 本地模式时,您可以在本地模拟 Lambda 和 API Gateway。但是,你不能使用 Amazon SAM在本地模拟 Step Functions。

DefinitionSubstitutions 在Amazon SAM模板中

您可以结合使用 CloudFormation 模板和 Amazon SAM 来定义状态机。使用 Amazon SAM,您可以在模板或单独的文件中定义内联状态机。以下 Amazon SAM 模板包含模拟股票交易工作流的状态机。该状态机调用三个 Lambda 函数来查看股票的价格并确定是买入还是卖出股票。然后,相应交易会记录在 Amazon DynamoDB 表中。在以下模板中,Lambda 函数的 ARN 以及 DynamoDB 表是使用 DefinitionSubstitutions 指定的。

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: | step-functions-stock-trader Sample SAM Template for step-functions-stock-trader Resources: StockTradingStateMachine: Type: AWS::Serverless::StateMachine Properties: DefinitionSubstitutions: StockCheckerFunctionArn: !GetAtt StockCheckerFunction.Arn StockSellerFunctionArn: !GetAtt StockSellerFunction.Arn StockBuyerFunctionArn: !GetAtt StockBuyerFunction.Arn DDBPutItem: !Sub arn:${AWS::Partition}:states:::dynamodb:putItem DDBTable: !Ref TransactionTable Policies: - DynamoDBWritePolicy: TableName: !Ref TransactionTable - LambdaInvokePolicy: FunctionName: !Ref StockCheckerFunction - LambdaInvokePolicy: FunctionName: !Ref StockBuyerFunction - LambdaInvokePolicy: FunctionName: !Ref StockSellerFunction DefinitionUri: statemachine/stock_trader.asl.json StockCheckerFunction: Type: AWS::Serverless::Function Properties: CodeUri: functions/stock-checker/ Handler: app.lambdaHandler Runtime: nodejs18.x Architectures: - x86_64 StockSellerFunction: Type: AWS::Serverless::Function Properties: CodeUri: functions/stock-seller/ Handler: app.lambdaHandler Runtime: nodejs18.x Architectures: - x86_64 StockBuyerFunction: Type: AWS::Serverless::Function Properties: CodeUri: functions/stock-buyer/ Handler: app.lambdaHandler Runtime: nodejs18.x Architectures: - x86_64 TransactionTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: id AttributeType: S

以下代码是使用 Amazon SAM 创建 Step Functions 状态机教程中使用的文件 stock_trader.asl.json 内的状态机定义。此状态机定义包含几个用 ${dollar_sign_brace} 表示法表示的 DefinitionSubstitutions。例如,使用替换项 ${StockCheckerFunctionArn},而不是为 Check Stock Value 任务指定静态 Lambda 函数 ARN。此替换项在模板的 DefinitionSubstitutions 属性中定义。DefinitionSubstitutions 是状态机资源的键值对的映射。在中DefinitionSubstitutions,$ {StockCheckerFunctionArn} 使用CloudFormation内部函数映射到StockCheckerFunction资源的 ARN。!GetAtt部署 Amazon SAM 模板时,模板中的 DefinitionSubstitutions 将替换为实际值。

{ "Comment": "A state machine that does mock stock trading.", "StartAt": "Check Stock Value", "States": { "Check Stock Value": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "Payload.$": "$", "FunctionName": "${StockCheckerFunctionArn}" }, "Next": "Buy or Sell?" }, "Buy or Sell?": { "Type": "Choice", "Choices": [ { "Variable": "$.stock_price", "NumericLessThanEquals": 50, "Next": "Buy Stock" } ], "Default": "Sell Stock" }, "Buy Stock": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "Payload.$": "$", "FunctionName": "${StockBuyerFunctionArn}" }, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 1, "MaxAttempts": 3, "BackoffRate": 2 } ], "Next": "Record Transaction" }, "Sell Stock": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "Payload.$": "$", "FunctionName": "${StockSellerFunctionArn}" }, "Next": "Record Transaction" }, "Record Transaction": { "Type": "Task", "Resource": "arn:aws:states:::dynamodb:putItem", "Parameters": { "TableName": "${DDBTable}", "Item": { "Id": { "S.$": "$.id" }, "Type": { "S.$": "$.type" }, "Price": { "N.$": "$.price" }, "Quantity": { "N.$": "$.qty" }, "Timestamp": { "S.$": "$.timestamp" } } }, "End": true } } }

后续步骤

您可以通过以下资源了解有关使用 Step Funct Amazon SAM ions 的更多信息:

您还可以使用 Application Composer 中的 Workflow Studio 等可视化构建器在基础设施即代码 (IaC) 中设计和构建工作流。有关更多信息,请参阅使用 Application Composer 中的 Workflow Studio