php小编百草这次为大家带来了关于golang中的AWS Lambda的问题。在使用AWS SQS触发Lambda函数时,可能会出现类型错误的情况。这个问题可能导致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中的aws lambda由sqs触发并出现类型错误的详细内容。更多信息请关注PHP中文网其他相关文章!