如何在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
相关产品推荐
相关产品推荐

