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

Neptune génère une mauvaise erreur de prise de contact lors de la connexion à une instance Neptune compatible IAM

王林
Libérer: 2024-02-08 22:20:21
avant
627 Les gens l'ont consulté

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

Neptune génère une erreur L'erreur de prise de contact est un problème courant lors de la connexion à une instance Neptune compatible IAM. IAM (Identity and Access Management) est une fonctionnalité d'Amazon Web Services (AWS) qui gère et contrôle l'accès aux ressources AWS. Cependant, vous pouvez rencontrer des erreurs d'établissement de liaison lorsque vous essayez de vous connecter à une instance Neptune compatible IAM. Cette erreur peut être provoquée par des autorisations incorrectes sur le rôle IAM ou par une configuration incorrecte de l'instance Neptune. En réponse à ce problème, cet article présentera en détail comment résoudre cette erreur pour garantir une connexion fluide à l'instance Neptune compatible IAM.

Contenu de la question

J'ai une instance AWS Neptune avec iam activé et je suis capable d'effectuer des opérations CRUD sans authentification, mais lorsque j'active l'authentification, une erreur est générée dans le journal des erreurs de prise de contact.

Remarque : la fonction lambda dispose de toutes les autorisations Neptune

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

Journal des erreurs : Impossible d'instancier une nouvelle connexion ; définition de l'état de la connexion sur fermée. Erreur lors de la création d'une nouvelle connexion pour le pool de connexions : websocket : erreur de prise de contact 'e0104 : Impossible d'établir une connexion réussie : websocket : erreur de prise de contact'

Remarque : je peux exécuter des requêtes si l'authentification iam est désactivée. s'il vous plaît, aidez-moi.

Tentative de signature de la demande mais échec de l'authentification.

Solution de contournement

Certains problèmes dans le code doivent être résolus pour le faire fonctionner avec Neptune iam si toutes les autorisations nécessaires sont accordées.

    Le nom du service dans le signataire iam de
  1. neptune devrait être neptune-db,而不是 neptune.
  2. Tapez *gremlingo.driverremoteconnectionsettings 应为 *gremlingo.driverremoteconnectionsettings.
  3. settings.authinfo.header使用的标头实际上不是签名者返回的标头,而是原始请求的标头,因此应该是settings.authinfo.header = req.header.

En mettant tout cela ensemble, le bloc de code sous //signing request ressemblera à ceci :

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

Une chose à noter est que gremlin-go n'a actuellement aucun moyen d'autoriser l'actualisation automatique des jetons d'authentification, ce qui signifie qu'une nouvelle connexion doit être établie après l'expiration.

J'espère que cela vous aidera.

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!