You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CloudFormation模板中处理Step Functions状态机的$变量替换?

CloudFormation中Step Functions状态机定义的$变量处理及YAML示例

核心问题解答

  • 不需要把Step Functions路径里的$替换成大括号,只有当你要引用CloudFormation自身的变量(比如参数、资源输出)时,才需要用${变量名}的格式。如果是Step Functions自己的状态路径引用(比如$.Payload这种),完全保留原样即可。
  • 键名里的start_date.$是Step Functions的标准语法,用来标记这个字段是动态路径取值,不用修改,保留.$后缀就行。
  • 你代码里值的payload.[1]多了个多余的点,要改成payload[1]——Step Functions数组索引直接跟在键名后,不需要加.前缀。

适配YAML模板的正确写法示例

下面是把你的代码片段整合到完整CloudFormation YAML资源里的示例:

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      RoleArn: !GetAtt MyStateMachineRole.Arn
      DefinitionString: |
        {
          "Comment": "包含Lambda和Choice的状态机示例",
          "StartAt": "FirstLambdaTask",
          "States": {
            "FirstLambdaTask": {
              "Type": "Task",
              "Resource": "arn:aws:lambda:us-east-1:123456789012:function:YourFirstLambda",
              "ResultSelector": {
                "start_date.$": "$.Payload.body.payload[0]",
                "end_date.$": "$.Payload.body.payload[1]"
              },
              "Next": "DateCheckChoice"
            },
            "DateCheckChoice": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.start_date",
                  "IsLessThan": "$.end_date",
                  "Next": "SecondLambdaTask"
                }
              ],
              "Default": "InvalidDatesFail"
            },
            "SecondLambdaTask": {
              "Type": "Task",
              "Resource": "arn:aws:lambda:us-east-1:123456789012:function:YourSecondLambda",
              "End": true
            },
            "InvalidDatesFail": {
              "Type": "Fail",
              "Error": "DateValidationFailed",
              "Cause": "Start date is not earlier than end date"
            }
          }
        }
  MyStateMachineRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: states.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: StateMachineLambdaAccess
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: lambda:InvokeFunction
                Resource: 
                  - "arn:aws:lambda:us-east-1:123456789012:function:YourFirstLambda"
                  - "arn:aws:lambda:us-east-1:123456789012:function:YourSecondLambda"

补充说明

如果你的状态机定义里需要插入CloudFormation动态变量(比如Lambda函数ARN用!Ref获取),可以用!Sub包裹DefinitionString,此时CloudFormation变量用${},Step Functions的路径$保持不变,示例:

DefinitionString: !Sub |
  {
    "States": {
      "FirstLambdaTask": {
        "Resource": "${YourFirstLambda.Arn}",
        "ResultSelector": {
          "start_date.$": "$.Payload.body.payload[0]",
          "end_date.$": "$.Payload.body.payload[1]"
        }
      }
    }
  }

内容的提问来源于stack exchange,提问作者ryan6627

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:25:43