AWS Step Functions多Lambda传参失败问题排查求助
解决AWS Step Functions Lambda输出传递失败问题
问题背景
AWS状态机工作流包含多个Lambda,第一个Lambda无法将输出传递到下一个Lambda。所有Lambda输出格式如下:
{ "statusCode": 200, "body": { "key": "aws/myfile.json", "bucket_id": "bucket-name" } }
需求是将前一步输出直接作为下一步输入,怀疑状态机JSON的InputPath和OutputPath配置有误。Terraform中的状态机代码如下:
{ "Comment": "Get AWS Permission data step function", "StartAt": "Get Account Permission Sets", "States": { "Get Account Permission Sets": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "${aws_accounts_function_arn}:$LATEST" }, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ], "Next": "Get Account Assignment", "InputPath": "$.Payload" }, "Get Account Assignment": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "${aws_accounts_function_arn}:$LATEST", "Payload.$": "$" }, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ], "Next": "Get Groups Assignment", "InputPath": "$.Payload" }, "Get Groups Assignment": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "Payload.$": "$", "FunctionName": "${aws_accounts_function_arn}:$LATEST" }, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ], "Next": "Put Item Into DynamoDB", "InputPath": "$.Payload" }, "Put Item Into DynamoDB": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "Payload.$": "$", "FunctionName": "${aws_accounts_function_arn}:$LATEST" }, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ], "Next": "State Result" }, "State Result": { "Type": "Choice", "Choices": [ { "Variable": "$.statusCode", "NumericEquals": 200, "Next": "Success" } ], "Default": "Fail", "InputPath": "$.statusCode" }, "Success": { "Type": "Succeed" }, "Fail": { "Type": "Fail" } } }
执行时在Get Account Assignment步骤抛出错误:
An error occurred while executing the state 'Get Account Assignment' (entered at the event id #7). Invalid path '$.Payload' : No results for path: $['Payload']
问题分析
- 起始步骤配置错误:
Get Account Permission Sets作为工作流第一个节点,设置InputPath": "$.Payload"毫无意义——初始输入中不存在Payload字段,这会导致该步骤输入为空,Lambda执行后的输出传递逻辑直接断裂。 - 路径配置逻辑混乱:使用
arn:aws:states:::lambda:invoke调用Lambda时,Lambda返回结果会被包装在Payload字段中,但当前配置中,后续步骤错误地用InputPath读取不存在的Payload,同时OutputPath的作用位置理解错误。
修正方案
调整InputPath和OutputPath配置,确保每一步正确传递Lambda输出:
修正后的状态机代码
{ "Comment": "Get AWS Permission data step function", "StartAt": "Get Account Permission Sets", "States": { "Get Account Permission Sets": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "${aws_accounts_function_arn}:$LATEST" }, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ], "Next": "Get Account Assignment", "OutputPath": "$.Payload" }, "Get Account Assignment": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "${aws_accounts_function_arn}:$LATEST", "Payload.$": "$" }, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ], "Next": "Get Groups Assignment", "OutputPath": "$.Payload" }, "Get Groups Assignment": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "Payload.$": "$", "FunctionName": "${aws_accounts_function_arn}:$LATEST" }, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ], "Next": "Put Item Into DynamoDB", "OutputPath": "$.Payload" }, "Put Item Into DynamoDB": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "Payload.$": "$", "FunctionName": "${aws_accounts_function_arn}:$LATEST" }, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ], "Next": "State Result", "OutputPath": "$.Payload" }, "State Result": { "Type": "Choice", "Choices": [ { "Variable": "$.statusCode", "NumericEquals": 200, "Next": "Success" } ], "Default": "Fail" }, "Success": { "Type": "Succeed" }, "Fail": { "Type": "Fail" } } }
关键修正点说明
- 起始步骤:移除错误的
InputPath,添加OutputPath": "$.Payload"——提取Lambda返回的结果(即Payload内的内容)传递给下一步。 - 后续Lambda步骤:移除所有
InputPath": "$.Payload",因为上一步已经传递了Lambda的返回内容;保留OutputPath": "$.Payload"确保当前Lambda的输出被提取后继续传递。 - Choice步骤:移除
State Result的InputPath": "$.statusCode"——如果保留该配置,输入会被裁剪成仅statusCode的数值,导致后续无法读取$.statusCode进行判断。
内容的提问来源于stack exchange,提问作者K P
相关产品推荐
相关产品推荐

