

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 name="iam-auth-connecting-gremlin-java"></a>

Este es un ejemplo de cómo conectarse a Neptune mediante la API Java de Gremlin con firma Sig4 (se supone tener conocimientos generales sobre el uso de Maven). En este ejemplo, se utiliza la biblioteca [Amazon Neptune SigV4 Signer](https://github.com/aws/amazon-neptune-sigv4-signer) para facilitar la firma de solicitudes. Primero, defina las dependencias como parte del archivo `pom.xml`:

**nota**  
En los siguientes ejemplos se utiliza`requestInterceptor()`, que se introdujo en la versión 3.6.6. TinkerPop Si utiliza una TinkerPop versión anterior a la 3.6.6 (pero 3.5.5 o superior), utilícela en `handshakeInterceptor()` lugar de `requestInterceptor()` en los ejemplos de código que aparecen a continuación.

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

 El Sigv4 Signer de Amazon Neptune es compatible con las versiones 1.x y 2.x del SDK de Java. AWS En los siguientes ejemplos se utiliza la versión 2.x, donde es una instancia. `DefaultCredentialsProvider` `software.amazon.awssdk.auth.credentials.AwsCredentialsProvider` Si vas a actualizar de la versión 1.x a la 2.x, consulta los [cambios en el proveedor de credenciales](https://docs.aws.amazon.com//sdk-for-java/latest/developer-guide/migration-client-credentials.html) en la documentación de AWS SDK for 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);
}
```

## Autenticación de IAM entre cuentas
<a name="iam-auth-connecting-gremlin-java-cross-account"></a>

 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](https://docs.aws.amazon.com//neptune/latest/userguide/bulk-load-tutorial-chain-roles.html#bulk-load-tutorial-chain-cross-account). 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 este rol al servicio de computación que aloja la aplicación (instancia EC2, función de Lambda, tarea de ECS, etc.). 

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "assumeRolePolicy",
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::111122223333:role/role-name"
      }
    ]
  }
  ```

------
+  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. [DefaultCredentialProviderChain](https://docs.aws.amazon.com//sdk-for-java/v1/developer-guide/credentials.html)`STSclient` 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", 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();
    }
  ```