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 il driver Java Gremlin con firma Sigv4 (si presuppone una conoscenza generale dell'uso di Maven).

Nota

I seguenti esempi sono stati aggiornati per includere l'uso di requestInterceptor (). Questo è stato aggiunto nella versione 3.6.6. TinkerPop Prima della TinkerPop versione 3.6.6, gli esempi di codice utilizzavano handshakeInterceptor (), che era obsoleto in quella versione.

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

Amazon Neptune SigV4 Signer supporta l'uso di entrambe le versioni 1.x e 2.x di Java SDK. AWS L'esempio seguente utilizza 2.x dove DefaultCredentialsProvider è un'software.amazon.awssdk.auth.credentials.AwsCredentialsProvideristanza, ma è possibile utilizzare ugualmente il modulo 1.x con qualsiasi. com.amazonaws.auth.AWSCredentialsProvider Se stai effettuando l'aggiornamento da 1.x a 2.x, puoi leggere ulteriori informazioni sulle modifiche tra 1.x e 2.x nella documentazione relativa alle modifiche al provider Credentials della documentazione SDK for Java 2.x. AWS

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) .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 (EC2 istanza, funzione Lambda, task ECS, ecc.).

  • 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", 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(); }