Comment puis-je résoudre les erreurs 410 de GoneException avec les API WebSocket d'Amazon API Gateway ?

Dernière mise à jour: 03-11-2022

Je reçois un message d'erreur « 410 GoneException » lorsque j'essaie de publier un message sur mon API Amazon API Gateway WebSocket similaire au suivant :

...
« Message d'erreur » : « Exception disparue : 410 » 
...

Comment résoudre ce problème ?

Brève description

Vous pouvez recevoir l'erreur « 410 GoneException » si :

  • Un message a été publié sur l'API WebSocket avant que la connexion ne soit établie.
  • La connexion a été interrompue ou la connexion n'existe plus.
  • Le client s'est déconnecté puis a essayé de se reconnecter en utilisant le mêmeconnectionId.

Remarque: Pour les API WebSocket, le connectionId est requis pour envoyer une réponse de rappel depuis le backend.

Solution

Pour résoudre les erreurs d'API WebSocket, activez Amazon CloudWatch Logs.

Remarque : Pour le niveau Log, choisissez INFO pour générer des journaux d'exécution pour toutes les requêtes.

Les journaux des exécutions contiennent des informations que vous pouvez utiliser pour identifier et résoudre la plupart des erreurs d'API. Par exemple :

Pour plus d'informations sur chaque type de journalisation, consultez Formats de journaux CloudWatch pour API Gateway.

Avant de publier des messages sur les API WebSocket, assurez-vous que votre connexion est établie en appelant l'opérationgetConnection à l'aide du SDK AWSAPIGatewayManagementAPI.

Évitez de faire la requêtepostToConnection à partir de la fonction Lambda intégrée à votre route $connect. Par exemple, si vous souhaitez publier un message une fois la connexion client établie, procédez comme suit :

  1. Créez une fonction Lambda enfant invoquée de manière asynchrone par la fonction parent.
  2. Lors de l'initiation d'une nouvelle connexion, la route $connect est invoquée et la fonction parent invoque la fonction enfant en transmettant leconnectionId.
  3. La fonction enfant Lambda reçoit leconnectionId et appelle l'opérationgetConnection pour vérifier que la connexion est valide. Le message est ensuite envoyé à l'aide de la méthodepostToConnection.