Connessione ai database Amazon Neptune tramite IAM con 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 Amazon Neptune tramite IAM con Gremlin Java

Ecco un esempio di come connettersi a Neptune utilizzando l'API Java Gremlin con firma Sig4 (si presuppone una conoscenza generale dell'uso di Maven). Questo esempio utilizza la libreria Amazon Neptune SigV4 Signer per facilitare la firma delle richieste. Innanzitutto, definire le dipendenze come parte del file pom.xml:

Nota

I seguenti esempi utilizzanorequestInterceptor(), che è stata introdotta nella versione 3.6.6. TinkerPop Se stai usando una TinkerPop versione precedente alla 3.6.6 (ma 3.5.5 o successiva), usa handshakeInterceptor() invece che negli esempi di requestInterceptor() codice seguenti.

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

Amazon Neptune SigV4 Signer supporta entrambe le versioni 1.x e 2.x di Java SDK. AWS I seguenti esempi utilizzano 2.x, dove è un'istanza. DefaultCredentialsProvider software.amazon.awssdk.auth.credentials.AwsCredentialsProvider Se stai effettuando l'aggiornamento da 1.x a 2.x, consulta le modifiche al provider Credentials nella documentazione di SDK for AWS Java 2.x.

import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; 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) .requestInterceptor( r -> { try { NeptuneNettyHttpSigV4Signer sigV4Signer = new NeptuneNettyHttpSigV4Signer("(your region)", DefaultCredentialsProvider.create()); 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); }

Autenticazione IAM tra account

Amazon Neptune supporta l'autenticazione IAM tra 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 utente o ruolo IAM nell' AWS account dell'applicazione, con una policy di fiducia che consenta all'utente o al ruolo di assumere un altro ruolo IAM. Assegna questo ruolo al computer che ospita l'applicazione (istanza EC2, funzione Lambda, ECS Task, ecc.).

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Sid": "assumeRolePolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::111122223333:role/role-name" } ] }
  • Crea un nuovo ruolo IAM nell'account del database Neptune che consenta l'accesso al AWS database Neptune e consenta l'assunzione del ruolo dall'utente/ruolo IAM dell'account dell'applicazione. Utilizza una politica di fiducia di:

    JSON
    { "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) .requestInterceptor( r -> { try { NeptuneNettyHttpSigV4Signer sigV4Signer = // new NeptuneNettyHttpSigV4Signer("us-west-2", DefaultCredentialsProvider.create()); 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(); }