Connessione ai database IAM Amazon Neptune tramite Gremlin Java - Amazon Neptune

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Connessione ai database IAM Amazon Neptune tramite Gremlin Java

Utilizzo della versione TinkerPop 3.4.11 o superiore per connettersi a Neptune con la firma Sig4

Ecco un esempio di come connettersi a Neptune utilizzando Gremlin API Java con firma Sig4 quando si utilizza 3.4.11 o versioni successive (si presuppone una conoscenza generale sull' TinkerPop uso di Maven). Innanzitutto, definire le dipendenze come parte del file pom.xml:

<dependency> <groupId>com.amazonaws</groupId> <artifactId>amazon-neptune-sigv4-signer</artifactId> <version>2.4.0</version> </dependency>

Quindi, utilizzare un codice come il seguente:

import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.neptune.auth.NeptuneNettyHttpSigV4Signer; import com.amazonaws.neptune.auth.NeptuneSigV4SignerException; ... System.setProperty("aws.accessKeyId","your-access-key"); System.setProperty("aws.secretKey","your-secret-key"); ... Cluster cluster = Cluster.build((your cluster)) .enableSsl(true) .handshakeInterceptor( r -> { try { NeptuneNettyHttpSigV4Signer sigV4Signer = new NeptuneNettyHttpSigV4Signer("(your region)", new DefaultAWSCredentialsProviderChain()); sigV4Signer.signRequest(r); } catch (NeptuneSigV4SignerException e) { throw new RuntimeException("Exception occurred while signing the request", e); } return r; } ).create(); try { Client client = cluster.connect(); client.submit("g.V().has('code','IAD')").all().get(); } catch (Exception e) { throw new RuntimeException("Exception occurred while connecting to cluster", e); }
Nota

Se si sta eseguendo l'aggiornamento da 3.4.11, rimuovere i riferimenti alla libreria amazon-neptune-gremlin-java-sigv4. Non è più necessaria quando si utilizza handshakeInterceptor() come mostrato nell'esempio precedente. Non tentare di utilizzare handshakeInterceptor() insieme al channelizer (SigV4WebSocketChannelizer.class), perché produrrà errori.

Autenticazione tra account IAM

Amazon Neptune supporta l'autenticazione tra IAM account attraverso l'uso dell'assunzione di ruolo, a volte chiamata anche concatenazione dei ruoli. Per fornire l'accesso a un cluster Neptune da un'applicazione ospitata in un account diverso: AWS

  • Crea un nuovo IAM utente o ruolo nell' AWS account dell'applicazione, con una politica di fiducia che consenta all'utente o al ruolo di assumere un altro IAM ruolo. Assegna questo ruolo al computer che ospita l'applicazione (EC2istanza, funzione Lambda, ECS Task, ecc.).

    { "Version": "2012-10-17", "Statement": [ { "Sid": "assume-role-policy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "(ARN of the role in the database account)" } ] }
  • Crea un nuovo IAM ruolo nell'account del database Neptune che consenta l'accesso al AWS database Neptune e consenta l'assunzione del ruolo dall'utente/ruolo dell'account dell'applicazione. IAM Utilizzate una politica di fiducia di:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "(ARN of application account IAM user or role)" ] }, "Action": "sts:AssumeRole", "Condition": {} } ] }
  • Utilizzate il seguente esempio di codice come guida su come utilizzare questi due ruoli per consentire all'applicazione di accedere a Neptune. In questo esempio, il ruolo dell'account dell'applicazione verrà assunto tramite DefaultCredentialProviderChaindurante la creazione di. STSclient STSclientViene quindi utilizzato tramite il STSAssumeRoleSessionCredentialsProvider per assumere il ruolo ospitato nell'account del database AWS Neptune.

    public static void main( String[] args ) { /* * Establish an STS client from the application account. */ AWSSecurityTokenService client = AWSSecurityTokenServiceClientBuilder .standard() .build(); /* * Define the role ARN that you will be assuming in the database account where the Neptune cluster resides. */ String roleArnToAssume = "arn:aws:iam::012345678901:role/CrossAccountNeptuneRole"; String crossAccountSessionName = "cross-account-session-" + UUID.randomUUID(); /* * Change the Credentials Provider in the SigV4 Signer to use the STSAssumeRole Provider and provide it * with both the role to be assumed, the original STS client, and a session name (which can be * arbitrary.) */ Cluster cluster = Cluster.build() .addContactPoint("neptune-cluster.us-west-2.neptune.amazonaws.com") .enableSsl(true) .port(8182) .handshakeInterceptor( r -> { try { NeptuneNettyHttpSigV4Signer sigV4Signer = // new NeptuneNettyHttpSigV4Signer("us-west-2", new DefaultAWSCredentialsProviderChain()); new NeptuneNettyHttpSigV4Signer( "us-west-2", new STSAssumeRoleSessionCredentialsProvider .Builder(roleArnToAssume, crossAccountSessionName) .withStsClient(client) .build()); sigV4Signer.signRequest(r); } catch (NeptuneSigV4SignerException e) { throw new RuntimeException("Exception occurred while signing the request", e); } return r; } ).create(); GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using(cluster)); /* whatever application code is necessary */ cluster.close(); }

Utilizzo di una versione TinkerPop precedente alla 3.4.11 per connettersi a Neptune con la firma Sig4

TinkerPop le versioni precedenti 3.4.11 non supportavano la handshakeInterceptor() configurazione mostrata nella sezione precedente e quindi dovevano fare affidamento sul amazon-neptune-gremlin-java-sigv4 pacchetto. Questa è una libreria Neptune che contiene SigV4WebSocketChannelizer la classe, che sostituisce il Channelizer TinkerPop standard con uno che può iniettare automaticamente una firma SigV4. Ove possibile, aggiorna alla versione 3.4.11 o superiore, perché la libreria è obsoleta TinkerPop . amazon-neptune-gremlin-java-sigv4

Ecco un esempio di come connettersi a Neptune utilizzando Gremlin API Java con firma Sig4 quando si TinkerPop utilizzano versioni precedenti alla 3.4.11 (si presuppone una conoscenza generale su come usare Maven).

Innanzitutto, definire le dipendenze come parte del file pom.xml:

<dependency> <groupId>com.amazonaws</groupId> <artifactId>amazon-neptune-gremlin-java-sigv4</artifactId> <version>2.4.0</version> </dependency>

La dipendenza di cui sopra include la versione 3.4.10 del driver Gremlin. Sebbene sia possibile utilizzare versioni più recenti del driver Gremlin (fino alla 3.4.13), un aggiornamento del driver dopo la versione 3.4.10 dovrebbe includere una modifica per utilizzare il modello handshakeInterceptor() sopra descritto.

L'oggetto Cluster gremlin-driver deve quindi essere configurato come segue nel codice Java:

import org.apache.tinkerpop.gremlin.driver.SigV4WebSocketChannelizer; ... Cluster cluster = Cluster.build(your cluster) .enableSsl(true) .channelizer(SigV4WebSocketChannelizer.class) .create(); Client client = cluster.connect(); client.submit("g.V().has('code','IAD')").all().get();