Heim  >  Artikel  >  Backend-Entwicklung  >  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

王林
王林nach vorne
2024-02-08 22:20:21628Durchsuche

连接到启用 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)
}

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
        })

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen