

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

# AWS SAM 用于构建 Step Functions 工作流程
<a name="concepts-sam-sfn"></a>

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

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

**提示**  
要部署使用启动 Step Functions 工作流程的示例无服务器应用程序 AWS SAM，请参阅在* AWS Step Functions 研讨会 AWS SAM*中[使用部署](https://catalog.workshops.aws/stepfunctions/iac/deploy-with-sam)。

## 为什么要将 Step Functions 配合使用 AWS SAM？
<a name="concepts-sam-sfn-integration"></a>

当你将 Step Functions 与配合使用时， AWS SAM 你可以：
+ 开始使用 AWS SAM 示例模板。
+ 将状态机构建到无服务器应用程序中。
+ 在部署时，使用变量替换来替换 ARNs 到状态机中。

   AWS CloudFormation 支持 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitionsubstitutions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitionsubstitutions)，它们可让您将工作流定义中的动态引用添加到您在 CloudFormation 模板中提供的值。您可以使用 `${dollar_sign_brace}` 表示法将替换项添加到工作流定义中，从而添加动态引用。您还需要在CloudFormation模板中 StateMachine 资源的`DefinitionSubstitutions`属性中定义这些动态引用。在 CloudFormation 堆栈创建流程中，替换项将替换为实际值。有关更多信息，请参阅 [DefinitionSubstitutions 在AWS SAM模板中](#sam-definition-substitution-eg)。
+ 使用 AWS SAM 策略模板指定状态机的角色。
+ 使用 API Gateway、 EventBridge 事件或按 AWS SAM 模板中的计划启动状态机执行。

## Step Functions 与 AWS SAM 规范集成
<a name="concepts-sam-sfn-ots2"></a>

您可以使用 [AWS SAM 策略模板](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html)向状态机添加权限。借助这些权限，您可以编排 Lambda 函数 AWS 和其他资源，形成复杂而强大的工作流程。

## Step Functions 与 SAM CLI 集成
<a name="concepts-sam-sfn-ots3"></a>

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

试试[使用创建 Step Functions 状态机 AWS SAM](tutorial-state-machine-using-sam.md)教程，学习 AWS SAM 如何使用创建状态机。

支持的 AWS SAM CLI 功能包括：


| CLI 命令 | 说明 | 
| --- | --- | 
| sam init |  使用模板初始化无服务器应用程序。 AWS SAM 可以与 SAM 模板一起使用以实现 Step Functions。  | 
| 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模板中
<a name="sam-definition-substitution-eg"></a>

您可以结合使用 CloudFormation 模板和 AWS SAM 来定义状态机。使用 AWS SAM，您可以在模板或单独的文件中定义内联状态机。以下 AWS SAM 模板包含模拟股票交易工作流的状态机。该状态机调用三个 Lambda 函数来查看股票的价格并确定是买入还是卖出股票。然后，相应交易会记录在 Amazon DynamoDB 表中。以下模板中的Lambda函数和DynamoDB表使用指定[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitionsubstitutions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitionsubstitutions)。 ARNs 

```
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
```

以下代码是[使用创建 Step Functions 状态机 AWS SAM](tutorial-state-machine-using-sam.md)教程中使用的文件 `stock_trader.asl.json` 内的状态机定义。此状态机定义包含几个用 `${dollar_sign_brace}` 表示法表示的 `DefinitionSubstitutions`。例如，使用替换项 `${StockCheckerFunctionArn}`，而不是为 `Check Stock Value` 任务指定静态 Lambda 函数 ARN。此替换项在模板的 [DefinitionSubstitutions](#sam-template-def-substitution) 属性中定义。`DefinitionSubstitutions` 是状态机资源的键值对的映射。在中`DefinitionSubstitutions`，\$1 \$1StockCheckerFunctionArn\$1 使用CloudFormation内部函数映射到`StockCheckerFunction`资源的 ARN。[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html)部署 AWS 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
        }
    }
}
```

## 后续步骤
<a name="concepts-sam-sfn-next-steps"></a>

您可以通过以下资源了解有关使用 Step Funct AWS SAM ions 的更多信息：
+ 完成教[使用创建 Step Functions 状态机 AWS SAM](tutorial-state-machine-using-sam.md)程以使用创建状态机 AWS SAM。
+ 指定[AWS::Serverless::StateMachine](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html)资源。
+ 查找要使用的 [AWS SAM 策略模板](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html)。
+ 将 [AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/stepfunctions.html) 与 Step Functions 搭配使用。
+ 查看 [AWS SAM CLI 参考](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html)，详细了解中 AWS SAM提供的特征。

您还可以使用 Infrastructure Composer 中的 Workflow Studio 等可视化构建器在基础设施即代码 (IaC) 中设计和构建工作流。有关更多信息，请参阅 [使用Infrastructure Composer中的工作流程工作室构建 Step Functions 工作流程](use-wfs-in-app-composer.md)。