

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SAM を使用して Step Functions ワークフローを構築する
<a name="concepts-sam-sfn"></a>

Step Functions AWS Serverless Application Model で を使用すると、ワークフローを構築し、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 サンプルテンプレートの使用を開始します。
+ ステートマシンをサーバーレスアプリケーションにビルドします。
+ 変数置換を使用して、デプロイ時に ARN をステートマシンに置き換えます。

   AWS CloudFormation は、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) をサポートしています。`${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 リソースをオーケストレーションして、複雑で堅牢なワークフローを作成できます。

## SAM CLI との Step Functions の統合
<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 コマンド | 説明 | 
| --- | --- | 
| 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 テンプレートを受け取り、指定されたリージョンにアプリケーションを公開します。  | 

**注記**  
local を使用する場合は AWS SAM 、Lambda と API Gateway をローカルでエミュレートできます。ただし、 を使用して Step Functions をローカルでエミュレートすることはできません AWS SAM。

## AWS SAM テンプレート内の DefinitionSubstitutions
<a name="sam-definition-substitution-eg"></a>

ステートマシンは、AWS SAM で CloudFormation テンプレートを使用して定義できます。AWS SAM では、ステートマシンをテンプレート内でインラインで定義するか、別個のファイルに定義できます。以下の AWS SAM テンプレートには、株取引のワークフローをシミュレートするステートマシンが含まれています。このステートマシンは 3 つの Lambda 関数を呼び出して、株の価格を確認し、株を売買するかを決定します。その後、この取引は Amazon DynamoDB テーブルに記録されます。次のテンプレートの Lambda 関数と DynamoDB テーブルの ARN は、[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
```

以下のコードは、[を使用して Step Functions ステートマシンを作成する AWS SAM](tutorial-state-machine-using-sam.md) チュートリアルで使用する、`stock_trader.asl.json` ファイルのステートマシン定義です。このステートマシン定義には、`${dollar_sign_brace}` 表記で示される複数の `DefinitionSubstitutions` が含まれています。例えば、`Check Stock Value` タスクに静的 Lambda 関数 ARN を指定する代わりに、置換 `${StockCheckerFunctionArn}` が使用されます。この置換はテンプレートの [DefinitionSubstitutions](#sam-template-def-substitution) プロパティで定義されます。`DefinitionSubstitutions` はステートマシンリソースのキーと値のペアのマップです。`DefinitionSubstitutions` では、\$1\$1StockCheckerFunctionArn\$1 は CloudFormation 組み込み関数 [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) を使用して `StockCheckerFunction` リソースの ARN にマッピングされます。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>

 AWS SAM で Step Functions を使用する方法の詳細については、次のリソースを参照してください。
+ [を使用して 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) を検索します。
+ Step Functions と共に [AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/stepfunctions.html) を使用 
+  AWS SAMで利用できる機能の詳細については「[AWS SAM CLI リファレンス](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html)」を確認してください。

Infrastructure Composer の Workflow Studio などのビジュアルビルダーを使用して、Infrastructure as Code (IaC) でワークフローを設計および構築することもできます。詳細については、「[Infrastructure Composer で Workflow Studio を使用して Step Functions ワークフローを構築する](use-wfs-in-app-composer.md)」を参照してください。