使用 Amazon SAM 构建 Step Functions 工作流程
可以将 Amazon Serverless Application Model 与 Step Functions 结合使用来构建工作流程并部署所需的基础设施(包括 Lambda 函数、API 和事件),以便创建无服务器应用程序。
还可以将 Amazon Serverless Application Model CLI 与 Amazon Toolkit for Visual Studio Code 结合使用来作为集成体验的一部分,以便构建和部署 Amazon Step Functions 状态机。您可以使用 Amazon SAM 构建无服务器应用程序,然后在 VS Code IDE 中构建状态机。然后,您可以验证、打包和部署您的资源。
提示
要部署一个使用 Amazon SAM 启动 Step Functions 工作流的示例无服务器应用程序,请参阅《The Amazon Step Functions Workshop》中的 Deploy with Amazon SAM
为什么要将 Step Functions 与 Amazon SAM 结合使用?
当您将 Step Functions 与 Amazon SAM 结合使用时,您可以:
-
使用 Amazon SAM 示例模板开始。
-
将状态机构建到无服务器应用程序中。
-
使用变量替换在部署时将 ARN 替换到状态机中。
Amazon CloudFormation 支持
DefinitionSubstitutions,它们可让您将工作流定义中的动态引用添加到您在 CloudFormation 模板中提供的值。您可以使用${dollar_sign_brace}表示法将替换项添加到工作流定义中,从而添加动态引用。此外,您还需要针对 CloudFormation 模板中的 StateMachine 资源,在DefinitionSubstitutions属性中定义这些动态引用。在 CloudFormation 堆栈创建流程中,替换项将替换为实际值。有关更多信息,请参阅 Amazon SAM 模板中的 DefinitionSubstitutions。 -
使用 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。
Amazon SAM 模板中的 DefinitionSubstitutions
您可以结合使用 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 内置函数 !GetAtt 映射到 StockCheckerFunction 资源的 ARN。部署 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 } } }
后续步骤
您可以通过以下资源了解有关将 Amazon SAM 与 Step Functions 搭配使用的更多信息:
-
完成使用 Amazon SAM 创建 Step Functions 状态机教程,使用 Amazon SAM 创建状态机。
-
查找要使用的 Amazon SAM 策略模板。
-
将 Amazon Toolkit for Visual Studio Code 与 Step Functions 搭配使用。
-
查看 Amazon SAM CLI 参考,详细了解中 Amazon SAM 提供的特征。
您还可以使用 Infrastructure Composer 中的 Workflow Studio 等可视化构建器在基础设施即代码 (IaC) 中设计和构建工作流。有关更多信息,请参阅 使用Infrastructure Composer中的工作流程工作室构建 Step Functions 工作流程。