Heim > Backend-Entwicklung > Golang > Neptune löst einen fehlerhaften Handshake-Fehler aus, wenn eine Verbindung zu einer IAM-aktivierten Neptune-Instanz hergestellt wird

Neptune löst einen fehlerhaften Handshake-Fehler aus, wenn eine Verbindung zu einer IAM-aktivierten Neptune-Instanz hergestellt wird

王林
Freigeben: 2024-02-08 22:20:21
nach vorne
680 Leute haben es durchsucht

连接到启用 IAM 的 Neptune 实例时,Neptune 抛出错误握手错误

Neptune gibt einen Fehler aus. Ein Handshake-Fehler ist ein häufiges Problem beim Herstellen einer Verbindung zu einer IAM-fähigen Neptune-Instanz. IAM (Identity and Access Management) ist eine Funktion von Amazon Web Services (AWS), die den Zugriff auf AWS-Ressourcen verwaltet und steuert. Beim Versuch, eine Verbindung zu einer IAM-fähigen Neptune-Instanz herzustellen, können jedoch Handshake-Fehler auftreten. Dieser Fehler kann durch falsche Berechtigungen für die IAM-Rolle oder eine falsche Einrichtung der Neptune-Instanz verursacht werden. Als Reaktion auf dieses Problem wird in diesem Artikel detailliert beschrieben, wie dieser Fehler behoben werden kann, um eine reibungslose Verbindung zur IAM-fähigen Neptune-Instanz sicherzustellen.

Frageninhalt

Ich habe eine AWS Neptune-Instanz mit aktiviertem iam und kann CRUD-Vorgänge ohne Authentifizierung ausführen, aber wenn ich die Authentifizierung aktiviere, wird ein Fehler im Handshake-Fehlerprotokoll ausgegeben.

Hinweis: Die Lambda-Funktion verfügt über vollständige Neptune-Berechtigungen

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
    "time"
    
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    
    gremlingo "github.com/apache/tinkerpop/gremlin-go/v3/driver"
    "github.com/aws/aws-sdk-go/aws/session"
    v4 "github.com/aws/aws-sdk-go/aws/signer/v4"
    )

func main() {
    lambda.Start(lambdaHandler)
}

func lambdaHandler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    driverConn, g = connect()
    result, err = g.AddV("User").Property("userId", "Check").Next()
    if err != nil {
        fmt.Println(err)
    }
}

func connect() {
    awsSess, err := session.NewSesionWithOptions(session.Options{
        SharedCondfigState: session.SharedConfigEnable,
    }),
    if err != nil {
        log.Fatalf("Failed to creating session: %s", err)
    }
    
    db_endpoint := os.Genenv("DB_ENDPOINT")
    connString := "wss://" +db_endpoint+":8182/gremlin"
    
    // Signing Request
    req, _ := http.NewRequest(http.MethodGet, connString, nil)
    signer := v4.NewSigner(awsSess.Config.Credentials)
    headerToUse, err := signer.Sign(req, nil, "neptune", *awsSess.Config.Region, time.Now())
    
    driverRemoteConnection, err := gremlingo.NewDriverRemoteConnection(connString,
        func(settings *gremlingo.driverRemoteConnectionSettings) {
            settings.TraversalSource = "g"
            settings.AuthInfo.Header = headerToUse
        })
    return driverRemoteConnection, traversalSource(driverRemoteConnection)
}

func traversalSource(driverConn *gremlingo.DriverRemoteConnection) *gremlingo.GraphTraversalSource {
    return gremlingo.Traversal_().WithRemote(driverConn)
}
Nach dem Login kopieren

Fehlerprotokoll: Neue Verbindung kann nicht instanziiert werden; Verbindungsstatus wird auf geschlossen gesetzt. Fehler beim Erstellen einer neuen Verbindung für Verbindungspool: Websocket: Handshake-Fehler „e0104: Verbindung konnte nicht erfolgreich hergestellt werden: Websocket: Handshake-Fehler“

Hinweis: Ich kann Abfragen ausführen, wenn die IAM-Authentifizierung deaktiviert ist. Bitte helfen Sie.

Versuch, die Anfrage zu signieren, aber die Authentifizierung ist fehlgeschlagen.

Problemumgehung

Es gibt einige Probleme im Code, die behoben werden müssen, damit er mit Neptune iam funktioniert, wenn alle erforderlichen Berechtigungen erteilt werden.

    Der Dienstname im IAM-Signer von
  1. neptune sollte neptune-db,而不是 neptune lauten.
  2. Typ *gremlingo.driverremoteconnectionsettings 应为 *gremlingo.driverremoteconnectionsettings.
  3. settings.authinfo.header使用的标头实际上不是签名者返回的标头,而是原始请求的标头,因此应该是settings.authinfo.header = req.header.

Alles zusammengenommen sieht der Codeblock unter //signing request so aus:

// Signing Request
    req, _ := http.NewRequest(http.MethodGet, connString, nil)
    signer := v4.NewSigner(awsSess.Config.Credentials)
    _, err := signer.Sign(req, nil, "neptune-db", *awsSess.Config.Region, time.Now())
    
    driverRemoteConnection, err := gremlingo.NewDriverRemoteConnection(connString,
        func(settings *gremlingo.DriverRemoteConnectionSettings) {
            settings.TraversalSource = "g"
            settings.AuthInfo.Header = req.Header
        })
Nach dem Login kopieren

Zu beachten ist, dass gremlin-go derzeit keine Möglichkeit hat, die automatische Aktualisierung von Authentifizierungstokens zuzulassen, was bedeutet, dass nach Ablauf eine neue Verbindung hergestellt werden muss.

Ich hoffe, das hilft.

Das obige ist der detaillierte Inhalt vonNeptune löst einen fehlerhaften Handshake-Fehler aus, wenn eine Verbindung zu einer IAM-aktivierten Neptune-Instanz hergestellt wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage