如何用Python CDK为Step Functions添加waitForTaskToken配置
在Python CDK中,你不需要手动指定arn:aws:states:::lambda:invoke.waitForTaskToken这个资源ARN,而是通过设置LambdaInvoke任务的integration_pattern参数来实现相同效果,CDK会自动生成对应的资源配置。
具体实现步骤
导入必要的CDK模块
确保你导入了Step Functions核心模块以及Lambda任务模块:from aws_cdk import ( aws_stepfunctions as sfn, aws_stepfunctions_tasks as tasks, aws_lambda as _lambda, Stack ) from constructs import Construct创建目标Lambda函数
先定义你要调用的Lambda函数(如果已有则跳过这步):class MyStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # 创建Lambda函数 my_lambda = _lambda.Function( self, "MyLambdaFunction", runtime=_lambda.Runtime.PYTHON_3_11, handler="index.lambda_handler", code=_lambda.Code.from_asset("lambda") )配置带waitForTaskToken的LambdaInvoke任务
在创建LambdaInvoke任务时,将integration_pattern设置为IntegrationPattern.WAIT_FOR_TASK_TOKEN,同时记得在payload中传递TaskToken(Lambda需要用这个token来调用Step Functions的SendTaskSuccess或SendTaskFailureAPI完成任务):# 创建LambdaInvoke任务,启用waitForTaskToken模式 lambda_task = tasks.LambdaInvoke( self, "InvokeLambdaWaitForToken", lambda_function=my_lambda, # 设置集成模式为等待任务令牌 integration_pattern=sfn.IntegrationPattern.WAIT_FOR_TASK_TOKEN, # 在payload中传递TaskToken给Lambda payload=sfn.TaskInput.from_object({ "input.$": "$", "taskToken.$": "$$.Task.Token" }) )整合到状态机
将这个任务添加到状态机定义中:# 创建状态机 state_machine = sfn.StateMachine( self, "MyStateMachine", definition_body=sfn.DefinitionBody.from_chainable(lambda_task), timeout=cdk.Duration.minutes(5) )
原理说明
当你设置integration_pattern=sfn.IntegrationPattern.WAIT_FOR_TASK_TOKEN时,CDK会自动将状态机JSON中的Resource字段设置为arn:aws:states:::lambda:invoke.waitForTaskToken,和你之前在控制台手动修改的效果完全一致。这种模式下,Step Functions会暂停执行,直到Lambda函数调用SendTaskSuccess或SendTaskFailureAPI,传递对应的任务令牌。
内容的提问来源于stack exchange,提问作者noor

