如何在Amazon Step Functions中从Lambda函数获取并传递变量?
问题1:Choice步骤不支持ResultPath,如何存储product ID?
Choice类型确实没有ResultPath属性,要保留之前生成的product ID,有两种实用方案:
方案1:在第一个Lambda任务中直接保留上下文
给LambdaFunction_AddToCart这个Task步骤添加ResultPath,把Lambda的输出(包含productID)合并到原始输入中,而非直接替换整个上下文。这样后续步骤既能拿到statusCode做判断,也能全程保留productID。
示例修改:
"LambdaFunction_AddToCart": { "Type": "Task", "Resource": "arn:aws:lambda:xxx", "Parameters": { "product_name": "Television", "product_price": 1500 }, "ResultPath": "$.cartData", // 将Lambda输出存入cartData字段,保留原始上下文 "Next": "CheckStatusFrom_AddToCart" }
之后Choice步骤检查状态时,变量路径改为$.cartData.statusCode,productID可通过$.cartData.productID获取。
方案2:用Pass步骤中转并保留变量
如果一定要用Pass步骤,注意不能直接在Result里写JSONPath(会被当成字符串存储),需要用Parameters字段映射需要保留的变量,再通过ResultPath合并到上下文:
"GetProductID_From_AddToCart": { "Type": "Pass", "Parameters": { "product_id.$": "$.productID", // 引用原上下文的productID "statusCode.$": "$.statusCode" // 保留状态码用于后续判断 }, "ResultPath": "$", // 替换上下文为映射后的内容(或指定路径合并) "Next": "CheckStatusFrom_AddToCart" }
问题2:LambdaFunction_ThankYou步骤找不到$.productID的报错修复
报错核心原因:LambdaFunction_MakePayment执行后,默认用Lambda的输出({"statusCode": 200, "body": "..."})替换了整个上下文,导致之前的productID被覆盖丢失。
解决办法是给这个Task步骤添加ResultPath,将Lambda的输出合并到现有上下文,而非直接替换:
1. 修改LambdaFunction_MakePayment步骤
"LambdaFunction_MakePayment": { "Type": "Task", "Resource": "arn:aws:yyy", "Parameters": { "product_price": 1500, "paid_price": 1500, "product_id.$": "$.productID" }, "ResultPath": "$.paymentData", // 将支付Lambda的输出存入paymentData字段 "Next": "CheckStatusFrom_Payment" }
2. 同步修改CheckStatusFrom_Payment的判断路径
因为状态码现在存在$.paymentData.statusCode里,所以Choice步骤的变量要更新:
"CheckStatusFrom_Payment": { "Type": "Choice", "Choices": [ {"Variable": "$.paymentData.statusCode", "NumericEquals": 200, "Next": "LambdaFunction_ThankYou"}, {"Variable": "$.paymentData.statusCode", "NumericEquals": 400, "Next": "Fail_Payment"} ] }
这样到LambdaFunction_ThankYou步骤时,$.productID依然存在于上下文根节点,就能正常获取了。
完整修改后的Step Functions定义
{ "StartAt": "LambdaFunction_AddToCart", "States": { "LambdaFunction_AddToCart": { "Type": "Task", "Resource": "arn:aws:lambda:xxx", "Parameters": { "product_name": "Television", "product_price": 1500 }, "ResultPath": "$.cartData", "Next": "CheckStatusFrom_AddToCart" }, "CheckStatusFrom_AddToCart": { "Type": "Choice", "Choices": [ {"Variable": "$.cartData.statusCode", "NumericEquals": 200, "Next": "LambdaFunction_MakePayment"}, {"Variable": "$.cartData.statusCode", "NumericEquals": 400, "Next": "Fail_Payment"} ] }, "LambdaFunction_MakePayment": { "Type": "Task", "Resource": "arn:aws:yyy", "Parameters": { "product_price": 1500, "paid_price": 1500, "product_id.$": "$.cartData.productID" }, "ResultPath": "$.paymentData", "Next": "CheckStatusFrom_Payment" }, "CheckStatusFrom_Payment": { "Type": "Choice", "Choices": [ {"Variable": "$.paymentData.statusCode", "NumericEquals": 200, "Next": "LambdaFunction_ThankYou"}, {"Variable": "$.paymentData.statusCode", "NumericEquals": 400, "Next": "Fail_Payment"} ] }, "LambdaFunction_ThankYou": { "Type": "Task", "Resource": "arn:aws:lambda:zzz", "Parameters": { "product_name": "Television", "product_id.$": "$.cartData.productID" }, "Next": "Success_Payment" }, "Success_Payment": { "Type": "Pass", "End": true }, "Fail_Payment": { "Type": "Fail" } } }
内容的提问来源于stack exchange,提问作者erdomester
相关产品推荐
相关产品推荐

