我正在开发一个由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。