AWS Step Functions:如何等待CloudFormation堆栈创建完成?
如何在AWS Step Functions中等待CloudFormation堆栈创建完成再执行后续步骤
要实现步骤3的Lambda在第一个CloudFormation堆栈创建完成后再执行,有两种可靠的方案,具体如下:
方案1:轮询CloudFormation堆栈状态(直接易实现)
通过Step Functions内置的AWS SDK集成,结合等待和分支判断,定期检查堆栈状态,直到创建完成或失败:
- 调用第一个Lambda完成堆栈创建请求,Lambda返回目标堆栈的ID;
- 添加
Wait状态设置固定等待间隔(比如30秒,可根据堆栈创建时长调整); - 使用Step Functions的
aws-sdk:cloudformation:describeStacks任务,直接调用CloudFormation API查询堆栈状态; - 通过
Choice状态判断结果:- 若状态为
CREATE_COMPLETE,进入步骤3调用第二个Lambda; - 若状态为
CREATE_IN_PROGRESS,回到Wait状态继续轮询; - 其他状态(如
CREATE_FAILED)进入错误处理分支。
- 若状态为
状态机片段示例
{ "States": { "InvokeFirstStackLambda": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateFirstCFStack", "Next": "WaitForStackReady" }, "WaitForStackReady": { "Type": "Wait", "Seconds": 30, "Next": "CheckStackStatus" }, "CheckStackStatus": { "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:cloudformation:describeStacks", "Parameters": { "StackName.$": "$.StackId" }, "Next": "JudgeStackState" }, "JudgeStackState": { "Type": "Choice", "Choices": [ { "Variable": "$.Stacks[0].StackStatus", "StringEquals": "CREATE_COMPLETE", "Next": "InvokeSecondStackLambda" }, { "Variable": "$.Stacks[0].StackStatus", "StringEquals": "CREATE_IN_PROGRESS", "Next": "WaitForStackReady" } ], "Default": "HandleStackFailure" }, "InvokeSecondStackLambda": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateSecondCFStack", "End": true }, "HandleStackFailure": { "Type": "Fail", "Error": "StackCreationFailed", "Cause.$": "$.Stacks[0].StackStatusReason" } } }
方案2:基于事件通知的回调模式(高效无轮询)
利用CloudFormation的事件通知机制,结合Step Functions的回调模式,避免不必要的轮询,适合长时间运行的堆栈创建场景:
- 第一个Lambda在发起CloudFormation堆栈创建请求时,配置SNS主题作为堆栈事件的通知目标,同时将Step Functions的
TaskToken(从状态机输入中获取)作为消息属性传递; - Step Functions调用第一个Lambda后,进入等待回调的状态;
- 当CloudFormation堆栈状态变为
CREATE_COMPLETE或CREATE_FAILED时,SNS主题触发一个中间Lambda; - 中间Lambda根据堆栈状态,调用Step Functions的
SendTaskSuccess或SendTaskFailureAPI,通知状态机继续执行或终止。
状态机片段示例
{ "States": { "InvokeFirstStackLambda": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateFirstCFStack", "Parameters": { "TaskToken.$": "$$.Task.Token" }, "TimeoutSeconds": 3600, "Next": "InvokeSecondStackLambda" }, "InvokeSecondStackLambda": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateSecondCFStack", "End": true } } }
关键注意事项
- 权限配置:确保Step Functions、Lambda、CloudFormation之间有必要的权限,比如Step Functions需要CloudFormation的
DescribeStacks权限,Lambda需要SendTaskSuccess/Failure权限; - 超时设置:根据堆栈创建的预期时长,设置合理的状态机超时时间,避免无限等待;
- 错误处理:必须处理堆栈创建失败的场景,比如通过
Fail状态终止流程并记录失败原因。
内容的提问来源于stack exchange,提问作者prosto.vint
相关产品推荐
相关产品推荐

