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

aws lambda in golang triggered by sqs with type error

PHPz
PHPzforward
2024-02-09 13:46:13781browse

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)
        }
    })
}

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"
    }
  ]
}

and received this message:

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

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

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete