

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

您可以使用 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 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堆疊建立過程中以實際值取代。如需詳細資訊，請參閱[AWS SAM 範本中的 DefinitionSubstitutions](#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 已與 CLI AWS SAM 整合。使用此功能可將狀態機快速開發為無伺服器應用程式。

嘗試[使用 建立 Step Functions 狀態機器 AWS SAM](tutorial-state-machine-using-sam.md)教學課程，了解如何使用 AWS SAM 來建立狀態機器。

支援的 AWS SAM CLI 函數包括：


| CLI 命令 | Description | 
| --- | --- | 
| sam init |  使用 AWS SAM 範本初始化無伺服器應用程式。可與 Step Functions 的 SAM 範本搭配使用。  | 
| 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。不過，您無法在本機使用 模擬 Step Functions AWS SAM。

## AWS SAM 範本中的 DefinitionSubstitutions
<a name="sam-definition-substitution-eg"></a>

您可以使用 CloudFormation 範本搭配 來定義狀態機器AWS SAM。使用 AWS SAM，您可以定義內嵌在範本或單獨的檔案中的狀態機器。下列AWS SAM範本包含模擬股票交易工作流程的狀態機器。此狀態機器會叫用三個 Lambda 函數來檢查股票的價格，並決定是否要購買或銷售股票。此交易接著會記錄在 Amazon DynamoDB資料表中。下列範本中Lambda函數和DynamoDB資料表ARNs 會使用 指定[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)。

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

下列程式碼是 檔案中的狀態機器定義`stock_trader.asl.json`，用於[使用 建立 Step Functions 狀態機器 AWS SAM](tutorial-state-machine-using-sam.md)教學課程。此狀態機器定義包含`DefinitionSubstitutions`以 `${dollar_sign_brace}` 表示的數個。例如，`${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 Functions AWS SAM 搭配下列資源：
+ 完成[使用 建立 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。

您也可以使用視覺化建置器，例如 中的 Workflow Studio，在基礎設施中設計和建置工作流程做為程式碼 (IaC)Infrastructure Composer。如需詳細資訊，請參閱[在 中使用 Workflow Studio Infrastructure Composer 來建置 Step Functions 工作流程](use-wfs-in-app-composer.md)。