为了账号安全,请及时绑定邮箱和手机立即绑定

通过 Golang 中的 step 函数调用 AWS lambda 函数

通过 Golang 中的 step 函数调用 AWS lambda 函数

Go
有只小跳蛙 2022-07-25 10:41:42
我有一个 AWS step 函数,它调用用 Golang 编写的 lambda 函数。由于某种原因,lambda 函数似乎无法读取 step 函数的输入。拉姆达函数 -package mainimport (    "fmt"    "github.com/aws/aws-lambda-go/lambda")type InEvent struct {    Name string `json:"name"`}type OutEvent struct {    Greeting string `json:"greeting"`}func HandleRequest(name InEvent) (OutEvent, error) {    var result OutEvent    result.Greeting = fmt.Sprintf("Hello %s!", name.Name)    return result, nil}func main() {    lambda.Start(HandleRequest)}阶跃函数 -{  "Comment": "A Hello World example of the Amazon States Language using Pass states",  "StartAt": "Invoke Lambda function",  "States": {    "Invoke Lambda function": {      "Type": "Task",      "Resource": "arn:aws:states:::lambda:invoke",      "Parameters": {        "FunctionName": "arn:aws:lambda:us-west-1:301438421794:function:SF1_1:$LATEST",        "Payload": {          "Input.$": "$"        }      },      "End": true    }  }}阶跃函数的输入 -{  "name": "ABCDE"}阶跃函数的输出 -{  "ExecutedVersion": "$LATEST",  "Payload": {    "greeting": "Hello !"  },  "SdkHttpMetadata": {    "AllHttpHeaders": {      "X-Amz-Executed-Version": [        "$LATEST"      ],      "x-amzn-Remapped-Content-Length": [        "0"      ],      "Connection": [        "keep-alive"      ],      "x-amzn-RequestId": [        "5f297331-8b1a-49a0-9ad9-17a78ec1cfd0"      ],      "Content-Length": [        "22"      ],      "Date": [        "Fri, 25 Dec 2020 19:58:20 GMT"      ],      "X-Amzn-Trace-Id": [        "root=1-5fe6445c-5cb6860d2559230940506a2f;sampled=0"      ],      "Content-Type": [        "application/json"      ]    },我希望 Output.Payload.greeting 是“Hello ABCDE!” 而是 Output.Payload.greeting 是“你好!”这里出了什么问题?为什么 lambda 函数中的 name 变量没有正确存储输入?为什么“ABCDE”在 lambda 函数中会变成一个空字符串?当我直接在 lambda 控制台上测试 lambda 函数而不使用步进函数时,一切正常。
查看完整描述

2 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

您的状态机定义中的Payload部分正在塑造传递给 Lambda 的输入:


"Payload": {

    "Input.$": "$"

}

所以 Lambda 的实际输入将是:


    Input: 

        { 

            name: 'ABCDE' 

    } 

}

因此,您需要在 Golang 代码中考虑这一点,或者Payload在状态机定义中更改该部分。


查看完整回答
反对 回复 2022-07-25
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

共享代码和示例时要小心,您的帐户 ID 也会被公开


以下是您的 golang 代码的工作状态机


    {

    "Comment": "A Hello World example of the Amazon States Language using Pass states",

    "StartAt": "Invoke Lambda function",

    "States": {

        "Invoke Lambda function": {

        "Type": "Task",

        "Resource": "arn:aws:states:::lambda:invoke",

        "Parameters": {

            "FunctionName": "arn:aws:lambda:us-east-1:301438421794:function:testfunction",

            "Payload": {

            "name.$": "$.name"

            }

        },

        "ResultPath": "$.lambdaOutput",

        "End": true

        }

    }

    }

产生如下输出:


    {

    "name": "suresh",

    "lambdaOutput": {

        "ExecutedVersion": "$LATEST",

        "Payload": {

        "greeting": "Hello suresh!"

        },

        "SdkHttpMetadata": {

    ....

    }

您可以通过像这样修改进一步切片输出


 "OutputPath": "$.lambdaOutput.Payload",

这将为您提供准确的输出


    {

    "greeting": "Hello suresh!"

    }

看看这里。这是我可以推荐的开始使用阶梯函数的最佳资源。


为了处理函数之间的数据,请保持这个方便。对于处理输入和输出,这也非常有用。


查看完整回答
反对 回复 2022-07-25
  • 2 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信