AWS SAM 用于构建 Step Functions 工作流程 - AWS Step Functions

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

AWS SAM 用于构建 Step Functions 工作流程

您可以 AWS Serverless Application Model 与 Step Functions 一起使用来构建工作流程和部署所需的基础架构,包括 Lambda 函数APIs和事件,以创建无服务器应用程序。

您还可以将 AWS Serverless Application Model CLI与结合使用, AWS Toolkit for Visual Studio Code 作为集成体验的一部分,来构建和部署 AWS Step Functions 状态机。您可以使用构建无服务器应用程序 AWS SAM,然后在 VS Code IDE 中构建您的状态机。然后,您可以验证、打包和部署您的资源。

提示

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

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

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

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

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

  • 在部署时,使用变量替换来替换ARNs到状态机中。

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

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

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

Step Functions 与 AWS SAM 规范集成

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

Step Functions 与 SAM CLI

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

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

支持的 AWS SAM CLI功能包括:

CLI命令 描述
sam init

使用模板初始化无服务器应用程序。 AWS SAM 可以与 Step Func SAM tions 的模板一起使用。

sam validate 验证 AWS SAM 模板。
sam package

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

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

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

注意

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

DefinitionSubstitutions 在 AWS SAM 模板

你可以使用定义状态机 CloudFormation 带有的模板 AWS SAM。 使用 AWS SAM,你可以在模板或单独的文件中以内联方式定义状态机。以下 AWS SAM 模板包括模拟股票交易工作流程的状态机。此状态机调用三个 Lambda 用于检查股票价格并确定是买入还是卖出股票的函数。然后,该交易记录在 Amazon DynamoDB 桌子。ARNs为了 Lambda 函数和 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

以下代码是使用 AWS SAM创建 Step Functions 状态机教程中使用的文件 stock_trader.asl.json 内的状态机定义。此状态机定义包含几个用 ${dollar_sign_brace} 表示法表示的 DefinitionSubstitutions。例如,与其指定静态 Lambda 函数ARN用于Check Stock Value任务,${StockCheckerFunctionArn}则使用替换。此替换项在模板的 DefinitionSubstitutions 属性中定义。DefinitionSubstitutions 是状态机资源的键值对的映射。在中DefinitionSubstitutions,$ {StockCheckerFunctionArn} 使用以下命令ARN映射到StockCheckerFunction资源的 CloudFormation 内在函数。!GetAtt当你部署 AWS SAM template,则模板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 AWS SAM ions 的更多信息:

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