Conexión a bases de datos de Amazon Neptune mediante IAM con Java de Gremlin - Amazon Neptune

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Conexión a bases de datos de Amazon Neptune mediante IAM con Java de Gremlin

A continuación, se muestra un ejemplo de cómo conectarse a Neptune utilizando el controlador Java Gremlin con firma Sigv4 (se supone un conocimiento general sobre el uso de Maven).

nota

Los siguientes ejemplos se han actualizado para incluir el uso de requestInterceptor(). Esto se añadió en la versión 3.6.6. TinkerPop Antes de la TinkerPop versión 3.6.6, los ejemplos de código utilizaban handshakeInterceptor (), que quedó obsoleto en esa versión.

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

El Sigv4 Signer de Amazon Neptune admite el uso de las versiones 1.x y 2.x del SDK de Java. AWS En el siguiente ejemplo, se utiliza la versión 2.x, en la que DefaultCredentialsProvider es una software.amazon.awssdk.auth.credentials.AwsCredentialsProvider instancia, pero también se podría utilizar la versión 1.x con cualquier com.amazonaws.auth.AWSCredentialsProvider. Si va a actualizar de la versión 1.x a la 2.x, puede obtener más información sobre los cambios entre la versión 1.x y la 2.x en la documentación sobre los cambios en el proveedor de credenciales de la documentación del AWS SDK for Java 2.x.

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

Autenticación de IAM entre cuentas

Amazon Neptune admite la autenticación de IAM entre cuentas mediante el uso de la asunción de roles, también conocida como encadenamiento de roles. Para proporcionar acceso a un clúster de Neptune desde una aplicación alojada en una cuenta diferente AWS :

  • Cree un nuevo usuario o rol de IAM en la AWS cuenta de la aplicación, con una política de confianza que permita al usuario o rol asumir otro rol de IAM. Asigne esta función al proceso que aloja la aplicación (EC2 instancia, función Lambda, tarea de ECS, etc.).

  • Cree un nuevo rol de IAM en la cuenta de base de datos de Neptune que permita el acceso a la AWS base de datos de Neptune y permita la asunción del rol desde el usuario/rol de IAM de la cuenta de aplicación. Utilice una política de confianza de:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "(ARN of application account IAM user or role)" ] }, "Action": "sts:AssumeRole", "Condition": {} } ] }
  • Utilice el siguiente ejemplo de código como guía para utilizar estos dos roles y permitir que la aplicación acceda a Neptune. En este ejemplo, el rol de la cuenta de la aplicación se asumirá mediante el al crear el. DefaultCredentialProviderChainSTSclient Luego, STSclient se usa a través de STSAssumeRoleSessionCredentialsProvider para asumir la función alojada en la cuenta de la base AWS de datos de 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(); }