Home > Backend Development > Golang > aws lambda in golang triggered by sqs with type error

aws lambda in golang triggered by sqs with type error

PHPz
Release: 2024-02-09 13:46:13
forward
828 people have browsed it

golang中的aws lambda由sqs触发并出现类型错误

php editor Baicao brings you questions about AWS Lambda in golang this time. When triggering a Lambda function using AWS SQS, a type error may occur. This problem may cause the Lambda function to be unable to process SQS messages normally, causing unnecessary trouble to developers. In this article, we will explore the causes of this problem and provide solutions to help developers successfully solve this type error dilemma.

Question content

I am developing a lambda triggered by api gateway and sqs.

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)
        }
    })
}
Copy after login

But my switch type doesn't recognize when using sqs or apigateway events. It always belongs to the default statement. For example, for sqs I'm using this event:

{
  "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"
    }
  ]
}
Copy after login

and received this message:

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

Any idea what I did wrong? I'm new to using golang so I'm lost here.

Additionally, I tried sending the event directly to regcode.handlersqs but I got a type conversion error. like this:

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)
        // ...
    })
}
Copy after login

sqsevent is empty.

Solution

Any idea what I'm doing wrong?

The

AWS lambda handler will reflect the types of the parameters in the func and then create an event type that matches your signature.

So if you declare the second parameter of func as event events.SQSEvent, AWS will get its type events.SQSEvent, creating this an object and pass it in.

Likewise, if you were to use event events.APIGatewayProxyRequest in func, AWS will reflect that event should be events.APIGatewayProxyRequest and create it.

In other words, AWS does not check whether the incoming request comes from SQS or API. This is only determined based on your handler's signature. So if you use an event interface{} in a func, AWS will create exactly what you specified to create, which is the interface{}, not any other types.

This is why your switch doesn't work. The easiest way to solve this problem is to use two lambda functions, one for SQS and one for the API.

The above is the detailed content of aws lambda in golang triggered by sqs with type error. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template