编辑:尝试格式化此
我已在控制台中创建了一个有效的 Step Function,但我想从 CFT 部署相同的功能。我一直在搜索示例,但我无法找到有关仅使用定义创建 Step Function StateMachine 的明确答案。
理想情况下,我希望能够通过 API 网关调用步骤函数,并能够通过调用传递参数。这就是我到目前为止所拥有的,我的问题是:
随机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}}}
这里有一些事情可以提供帮助。
首先,您可以选择使用 CloudFormation 部署在控制台中定义的工作流程。正如您可能已经确定的那样,您可以在 Step Functions 控制台的 Workflow Studio 中将工作流定义导出为 YAML 或 JSON。 部署选项的 Step Functions 文档可以帮助您了解这些选项,但我认为您的情况最好是使用
Definition
属性,它允许您将工作流定义本地嵌入到模板中。这比 DefinitionString
好得多,因为您不需要创建混乱的字符串。然后,您可以使用 DefinitionSubstitutions
使工作流程定义的某些部分成为变量。
其次,您可以将工作流程定义外部化到单独的文件中,以便更易于管理。使用 SAM 可以轻松完成此操作,因为它会为您进行打包。这是一个简单的示例,我已经完成了此操作,并注意您的状态机定义可以是 json 或 YAML。
第三,就将所有这些与 API Gateway 连接起来而言,我建议您查看 Serverlessland 上的 Workflows Collection。有很多很棒的社区提供了常见模式的示例。对于您正在寻找的内容,我认为这个示例可能是一个很好的起点。
试试这个:
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