如何使用 YAML 为 Step Function StateMachine 创建资源?

问题描述 投票:0回答:2

编辑:尝试格式化此

我已在控制台中创建了一个有效的 Step Function,但我想从 CFT 部署相同的功能。我一直在搜索示例,但我无法找到有关仅使用定义创建 Step Function StateMachine 的明确答案。

理想情况下,我希望能够通过 API 网关调用步骤函数,并能够通过调用传递参数。这就是我到目前为止所拥有的,我的问题是:

  1. 我需要用花括号替换所有“$.variable.otherVariable”内容吗?就像 ${variable.otherVariable} 一样?
  2. 我需要对这些值的键执行相同的操作吗?
  3. 我将如何为步骤函数设置 API 网关路径,或者与 lambda 的设置方式相同吗?

随机SM: 类型:“AWS::StepFunctions::StateMachine” 特性: StateMachineName: !Join ["", ["RandomStateMachine1-" , !FindInMap [StageMap, !Ref Stage, ENV]]] RoleArn: !Sub 'arn:aws:iam::customLambdaRole' 状态机类型:标准 DefinitionString: !Sub {"StartAt":"RandomStateMachine1","States":{"RandomStateMachine1":{"Type":"Task","Resource":"arn:aws:states:::lambda:invoke","参数":{"FunctionName":"arn:aws:lambda:us-east-1:RandomStateMachine1-dev:$LATEST","Payload.$":"$"},"重试":[{"ErrorEquals": [“Lambda.ServiceException”,“Lambda.AWSLambdaException”,“Lambda.SdkClientException”,“Lambda.TooManyRequestsException”],“IntervalSeconds”:1,“MaxAttempts”:1,“BackoffRate”:1}],“ResultSelector”: {"start_date.$":"$.Payload.body.payload[0]","end_date.$":"$.Payload.body.payload.[1]","previous_iteration.$":"$.Payload .body.payload[2]","row_count.$":"$.Payload.body.payload[3]","httpMethod.$":"$.Payload.body.payload[4]"},

"Next":"RandomStateMachine2"},"RandomStateMachine2":{"类型":"任务","资源":"arn:aws:states:::lambda:invoke","参数":{"负载。$ ":"$","FunctionName":"arn:aws:lambda:us-east-1:RandomStateMachine2Function-dev:$LATEST"},"重试":[{"ErrorEquals":["Lambda.ServiceException"," Lambda.AWSLambdaException","Lambda.SdkClientException","Lambda.TooManyRequestsException"],"IntervalSeconds":1,"MaxAttempts":1,"BackoffRate":1}],"ResultSelector":{"start_date.$":" $.Payload.body.payload[0]","end_date.$":"$.Payload.body.payload.[1]","previous_iteration.$":"$.Payload.body.payload[2]" ,"row_count.$":"$.Payload.body.payload[3]","httpMethod.$":"$.Payload.body.payload[4]"},

"Next":"多余记录?"},"多余记录?":{"Type":"Choice","Choices":[{"Variable":"$.previous_iteration","NumericEquals":0,"下一个":"通过"},{"Not":{"变量":"$.previous_iteration","NumericEquals":0},"下一个":"RandomStateMachine2"}]},"通过":{"类型" :"通过","结束":true}}}

amazon-web-services aws-api-gateway state-machine aws-step-functions
2个回答
0
投票

这里有一些事情可以提供帮助。

首先,您可以选择使用 CloudFormation 部署在控制台中定义的工作流程。正如您可能已经确定的那样,您可以在 Step Functions 控制台的 Workflow Studio 中将工作流定义导出为 YAML 或 JSON。 部署选项的 Step Functions 文档可以帮助您了解这些选项,但我认为您的情况最好是使用

Definition
属性,它允许您将工作流定义本地嵌入到模板中。这比
DefinitionString
好得多,因为您不需要创建混乱的字符串。然后,您可以使用
DefinitionSubstitutions
使工作流程定义的某些部分成为变量。

其次,您可以将工作流程定义外部化到单独的文件中,以便更易于管理。使用 SAM 可以轻松完成此操作,因为它会为您进行打包。这是一个简单的示例,我已经完成了此操作,并注意您的状态机定义可以是 json 或 YAML。

第三,就将所有这些与 API Gateway 连接起来而言,我建议您查看 Serverlessland 上的 Workflows Collection。有很多很棒的社区提供了常见模式的示例。对于您正在寻找的内容,我认为这个示例可能是一个很好的起点。


0
投票

试试这个:

 MyStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      DefinitionString:
        Fn::Sub: |
          {
            "Comment": "orchestrate multiple Lambda functions",
            "StartAt": "Function1",
            "States": {
              "Function1": {
                "Type": "Task",
                "Resource": "${Function1.Arn}",
                "Retry": [
                  {
                    "ErrorEquals": ["Lambda.TooManyRequestsException"],
                    "IntervalSeconds": 2,
                    "MaxAttempts": 5,
                    "BackoffRate": 2.0
                  }
                ],
                "Next": "WaitBetween1and2"
              },
              "WaitBetween1and2": {
                "Type": "Wait",
                "Seconds": 2,
                "Next": "Function2"
              },
              "Function2": {
                "Type": "Task",
                "Resource": "${Function2.Arn}",
                "Retry": [
                  {
                    "ErrorEquals": ["Lambda.TooManyRequestsException"],
                    "IntervalSeconds": 2,
                    "MaxAttempts": 5,
                    "BackoffRate": 2.0
                  }
                ],
                "Next": "WaitBeforeParallelProcessing"
              },
              "WaitBeforeParallelProcessing": {
                "Type": "Wait",
                "Seconds": 2,
                "Next": "ParallelProcessing"
              },
              "ParallelProcessing": {
                "Type": "Parallel",
                "Branches": [
                  {
                    "StartAt": "Function3",
                    "States": {
                      "Function3": {
                        "Type": "Task",
                        "Resource": "${Function3.Arn}",
                        "Retry": [
                          {
                            "ErrorEquals": ["Lambda.TooManyRequestsException"],
                            "IntervalSeconds": 2,
                            "MaxAttempts": 5,
                            "BackoffRate": 2.0
                          }
                        ],
                        "End": true
                      }
                    }
                  },
                  {
                    "StartAt": "Function4",
                    "States": {
                      "Function4": {
                        "Type": "Task",
                        "Resource": "${Function4.Arn}",
                        "Retry": [
                          {
                            "ErrorEquals": ["Lambda.TooManyRequestsException"],
                            "IntervalSeconds": 2,
                            "MaxAttempts": 5,
                            "BackoffRate": 2.0
                          }
                        ],
                        "End": true
                      }
                    }
                  }
                ],
                "Next": "WaitBeforeFunction5"
              },
              "WaitBeforeFunction5": {
                "Type": "Wait",
                "Seconds": 2,
                "Next": "Function5"
              },
              "Function5": {
                "Type": "Task",
                "Resource": "${Function5.Arn}",
                "Retry": [
                  {
                    "ErrorEquals": ["Lambda.TooManyRequestsException"],
                    "IntervalSeconds": 2,
                    "MaxAttempts": 5,
                    "BackoffRate": 2.0
                  }
                ],
                "End": true
              }
            }
          }
      RoleArn:
        Fn::GetAtt:
          - StepFunctionRole
          - Arn

  StepFunctionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: states.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: StepFunctionInvokePolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - lambda:InvokeFunction
                Resource:
                  - !GetAtt Function1.Arn
                  - !GetAtt Function2.Arn
                  - !GetAtt Function3.Arn
                  - !GetAtt Function4.Arn
                  - !GetAtt Function5.Arn
© www.soinside.com 2019 - 2024. All rights reserved.