Wie kann ich „410 GoneException“-Fehler mit WebSocket-APIs von Amazon API Gateway beheben?

Letzte Aktualisierung: 03.11.2022

Bei dem Versuch eine Nachricht an meine WebSocket-API von Amazon API Gateway zu senden, erhalte ich den Fehler „410 GoneException“, mit einer Nachricht, die der folgenden ähnelt:

...
„errorMessage“: „GoneException: 410" 
...

Wie kann ich dies beheben?

Kurzbeschreibung

Möglicherweise wird der Fehler „410 GoneException“ angezeigt, wenn:

  • Eine Nachricht an die WebSocket-API gesendet wurde, bevor die Verbindung hergestellt wurde.
  • Die Verbindung beendet wurde oder die Verbindung nicht mehr existiert.
  • Der Client die Verbindung getrennt hat und dann versucht hat, die Verbindung mit derselben connectionId erneut herzustellen.

Hinweis: Für WebSocket-APIs ist die connectionId erforderlich, um eine Callback-Antwort vom Backend zu senden.

Behebung

Aktivieren Sie Amazon CloudWatch Logs, um WebSocket-API-Fehler zu beheben.

Hinweis: Wählen Sie für Protokollebene INFO aus, um Ausführungsprotokolle für alle Anforderungen zu generieren.

Ausführungsprotokolle enthalten Informationen, mit denen Sie die meisten API-Fehler identifizieren und beheben können. Beispiel:

Weitere Informationen zu den einzelnen Protokollierungsarten finden Sie unter CloudWatch-Protokollformate für API Gateway.

Bevor Sie Nachrichten an WebSocket-APIs senden, stellen Sie sicher, dass Ihre Verbindung hergestellt wurde, indem Sie den Vorgang getConnection mithilfe der AWS-SDK ApiGatewayManagementApi aufrufen.

Vermeiden Sie die Anforderung postToConnection über die Lambda-Funktion, die in Ihre $connect-Route integriert ist. Wenn Sie beispielsweise eine Nachricht senden möchten, nachdem die Client-Verbindung hergestellt wurde, gehen Sie wie folgt vor:

  1. Erstellen Sie eine untergeordnete Lambda-Funktion, die asynchron von der übergeordneten Funktion aufgerufen wird.
  2. Beim Initiieren einer neuen Verbindung wird die $connect-Route aufgerufen und die übergeordnete Funktion ruft die untergeordnete Funktion ab, welche die connectionId weitergibt.
  3. Die untergeordnete Lambda-Funktion empfängt die connectionId und ruft den Vorgang getConnection auf, um zu überprüfen, ob die Verbindung gültig ist. Anschließend wird die Nachricht mit der Methode postToConnection gesendet.