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