AWS Lambda 在 Golang 中被 SQS 触发并出现类型错误。

3

我正在开发一个由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或API网关事件。它总是落在默认语句中。例如,对于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为空。

1个回答

2
有没有想法我做错了什么?
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{},而不是任何其他类型。
这就是为什么您的switch不起作用的原因。最简单的解决方法是拥有两个lambda函数,一个用于SQS,一个用于API。

我明白了,我会尝试一下。那类型转换呢?将interface{}转换为SQS事件是否可行?event.(events.SQSEvent) - milho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接