Home > Article > Backend Development > aws lambda in golang triggered by sqs with type error
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.
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.
Any idea what I'm doing wrong?
TheAWS 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!