You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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']

问题分析

  1. 起始步骤配置错误:Get Account Permission Sets作为工作流第一个节点,设置InputPath": "$.Payload"毫无意义——初始输入中不存在Payload字段,这会导致该步骤输入为空,Lambda执行后的输出传递逻辑直接断裂。
  2. 路径配置逻辑混乱:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:12:05