登录
首页 >  Golang >  Go问答

Golang中的AWS Lambda通过SQS触发出现类型错误问题

来源:stackoverflow

时间:2024-02-09 15:06:24 474浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《Golang中的AWS Lambda通过SQS触发出现类型错误问题》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我正在开发一个由 api gateway 和 sqs 触发的 lambda。

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"

    regcode "company/gateway/lambda/regcode/lib"
)

func main() {

    // start the lambda function with both sqs and lambda url handlers
    lambda.start(func(ctx context.context, event interface{}) error {
        fmt.println("event type: ", event)
        switch event.(type) {
        case events.sqsevent:
            return regcode.handlersqs(ctx, event.(events.sqsevent))
        case events.apigatewayproxyrequest:
            response, err := regcode.handlerlambdaurl(ctx, event.(events.apigatewayproxyrequest))
            if err != nil {
                log.println(err)
                return err
            }
            log.printf("api gateway response: %v", response)
            return nil
        default:
            return fmt.errorf("unknown event type: %t", event)
        }
    })
}

但是我的开关类型无法识别何时使用 sqs 或 apigateway 事件。它总是属于默认语句。例如,对于 sqs,我正在使用此事件:

{
  "records": [
    {
      "messageid": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
      "receipthandle": "messagereceipthandle",
      "body": "hello from sqs!",
      "attributes": {
        "approximatereceivecount": "1",
        "senttimestamp": "1523232000000",
        "senderid": "123456789012",
        "approximatefirstreceivetimestamp": "1523232000001"
      },
      "messageattributes": {},
      "md5ofbody": "{{{md5_of_body}}}",
      "md5ofmessageattributes": "test",
      "eventsource": "aws:sqs",
      "eventsourcearn": "arn:aws:sqs:us-east-1:123456789012:myqueue",
      "awsregion": "us-east-1"
    }
  ]
}

并收到此消息:

unknown event type: map[string]interface {}: errorstring

知道我做错了什么吗?我刚开始使用 golang,所以我在这里迷路了。

此外,我尝试将事件直接发送到 regcode.handlersqs,但出现类型转换错误。像这样:

func main() {

    // Start the Lambda function with both SQS and Lambda URL handlers
    lambda.Start(func(ctx context.Context, event interface{}) error {
        sqsEvent, _ := event.(SQSEvent)
        // ...
    })
}

sqsevent 为空。


正确答案


知道我做错了什么吗?

AWS lambda 处理程序将反映 func 中参数的类型,然后创建与您的签名匹配的 event 类型。

因此,如果您将 func 的第二个参数声明为 event events.SQSEvent,AWS 将获取其类型 events.SQSEvent,创建这样一个对象,并将其传入。

同样,如果您要在 func 中使用 event events.APIGatewayProxyRequest,AWS 将反映 event 应该是 events.APIGatewayProxyRequest 并创建它。

换句话说,AWS 不会检查传入请求是来自 SQS 还是 API。这仅根据您的处理程序的签名来确定。因此,如果您在 func 中使用 event 接口{},AWS 将准确创建您指定要创建的内容,即 interface{},而不是任何其他类型。

这就是你的开关不起作用的原因。解决这个问题的最简单方法是使用两个 lambda 函数,一个用于 SQS,一个用于 API。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>