在SQS触发的golang中使用lambda,并获得类型错误



我正在开发一个由API网关和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或apiggateway事件时,我的交换机类型无法识别。它总是落在默认语句中。例如,对于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 interface{}, aws将创建您指定要创建的interface{},而不是任何其他类型。

所以这就是为什么你的开关不工作。解决这个问题最简单的方法是使用两个lambda函数,一个用于SQS,一个用于API。

相关内容

  • 没有找到相关文章

最新更新