Maison > développement back-end > Golang > le corps du texte

aws lambda dans golang déclenché par sqs avec erreur de type

PHPz
Libérer: 2024-02-09 13:46:13
avant
750 Les gens l'ont consulté

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

l'éditeur php Baicao vous pose cette fois des questions sur AWS Lambda en golang. Lors du déclenchement d'une fonction Lambda à l'aide d'AWS SQS, une erreur de type peut se produire. Ce problème peut empêcher la fonction Lambda de traiter normalement les messages SQS, provoquant des problèmes inutiles aux développeurs. Dans cet article, nous explorerons les causes de ce problème et fournirons des solutions pour aider les développeurs à résoudre avec succès ce dilemme d’erreur de type.

Contenu de la question

Je développe un lambda déclenché par une passerelle API et des sqs.

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)
        }
    })
}
Copier après la connexion

Mais mon type de commutateur ne reconnaît pas lors de l'utilisation d'événements sqs ou apigateway. Il appartient toujours à l'instruction par défaut. Par exemple, pour les sqs, j'utilise cet événement :

{
  "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"
    }
  ]
}
Copier après la connexion

et j'ai reçu ce message :

unknown event type: map[string]interface {}: errorstring
Copier après la connexion

Une idée de ce que j'ai fait de mal ? Je viens de commencer à utiliser Golang donc je suis perdu ici.

De plus, j'ai essayé d'envoyer l'événement directement à regcode.handlersqs mais j'ai eu une erreur de conversion de type. Comme ça :

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)
        // ...
    })
}
Copier après la connexion

sqlevent est vide.

Solution

Une idée de ce que j'ai mal fait ?

Les gestionnaires lambda AWS refléteront func 中参数的类型,然后创建与您的签名匹配的 event types.

Donc, si vous func 的第二个参数声明为 event events.SQSEvent,AWS 将获取其类型 events.SQSEvent, créez un objet comme celui-ci et transmettez-le.

De même, si vous deviez func 中使用 event events.APIGatewayProxyRequest,AWS 将反映 event 应该是 events.APIGatewayProxyRequest et le créer.

En d'autres termes, AWS ne vérifie pas si la requête entrante provient de SQS ou d'API. Ceci est uniquement déterminé en fonction de la signature de votre gestionnaire. Donc si vous êtes en func 中使用 event 接口{},AWS 将准确创建您指定要创建的内容,即 interface{} et pas dans un autre type.

C'est pourquoi votre interrupteur ne fonctionne pas. Le moyen le plus simple de résoudre ce problème consiste à utiliser deux fonctions lambda, une pour SQS et une pour l'API.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!