Conexión con Neptune mediante Java y Gremlin con firma de Signature Version 4 - 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 con Neptune mediante Java y Gremlin con firma de Signature Version 4

Usar TinkerPop 3.4.11 o superior para conectarse a Neptune con la firma Sig4

Este es un ejemplo de cómo conectarse a Neptuno usando el Gremlin Java API con firma Sig4 cuando se usa la versión TinkerPop 3.4.11 o superior (se supone tener conocimientos generales sobre el uso de Maven). Primero, defina las dependencias como parte del archivo pom.xml:

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

Luego, utilice código como el siguiente:

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

Si está actualizando desde 3.4.11, elimine las referencias a la biblioteca de amazon-neptune-gremlin-java-sigv4. Ya no es necesario cuando se utiliza handshakeInterceptor() como se muestra en el ejemplo anterior. No intente utilizarla handshakeInterceptor() junto con el canalizador (SigV4WebSocketChannelizer.class), ya que se producirán errores.

Autenticación entre cuentas IAM

Amazon Neptune admite la IAM autenticación entre cuentas mediante el uso de la suposición de roles, lo que a veces también se denomina 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 IAM usuario o rol en la AWS cuenta de la aplicación, con una política de confianza que permita al usuario o rol asumir otro IAM rol. Asigne esta función al proceso que aloja la aplicación (EC2instancia, función Lambda, ECS tarea, etc.).

    { "Version": "2012-10-17", "Statement": [ { "Sid": "assume-role-policy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "(ARN of the role in the database account)" } ] }
  • Cree un nuevo IAM rol en la AWS cuenta de base de datos de Neptuno que permita el acceso a la base de datos de Neptuno y que permita asumir el rol desde el usuario/rol de la cuenta de aplicación. IAM Utilice una política de confianza de:

    { "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 sobre cómo utilizar estas dos funciones para permitir que la aplicación acceda a Neptune. En este ejemplo, el rol de cuenta de la aplicación se asumirá mediante el DefaultCredentialProviderChainal crear elSTSclient. 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) .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(); }

Uso de una versión TinkerPop anterior a la 3.4.11 para conectarse a Neptune con la firma Sig4

TinkerPop las versiones anteriores 3.4.11 no eran compatibles con la handshakeInterceptor() configuración que se muestra en la sección anterior y, por lo tanto, deben basarse en el amazon-neptune-gremlin-java-sigv4 paquete. Esta es una biblioteca de Neptune que contiene la SigV4WebSocketChannelizer clase, que reemplaza el TinkerPop Channelizer estándar por uno que puede inyectar automáticamente una firma SiGv4. Siempre que sea posible, actualice a la versión TinkerPop 3.4.11 o superior, ya que la biblioteca está obsoleta. amazon-neptune-gremlin-java-sigv4

A continuación, se muestra un ejemplo de cómo conectarse a Neptune utilizando el Java de Gremlin API con firma Sig4 cuando se utilizan TinkerPop versiones anteriores a la 3.4.11 (se supone tener conocimientos generales sobre cómo usar Maven).

Primero, defina las dependencias como parte del archivo pom.xml:

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

La dependencia anterior incluirá la versión del controlador de Gremlin 3.4.10. Aunque es posible utilizar versiones más recientes del controlador de Gremlin (hasta la 3.4.13), la actualización del controlador a partir de la versión 3.4.10 debería incluir un cambio para utilizar el modelo de handshakeInterceptor() descrito anteriormente.

A continuación, el objeto de clúster gremlin-driver debe configurarse de la siguiente manera en el código 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();