首頁  >  文章  >  後端開發  >  golang中的aws lambda由sqs觸發並出現型別錯誤

golang中的aws lambda由sqs觸發並出現型別錯誤

PHPz
PHPz轉載
2024-02-09 13:46:13781瀏覽

golang中的aws lambda由sqs触发并出现类型错误

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除