Connexion aux bases de données Amazon Neptune à l'aide de G705 IAM Java - Amazon Neptune

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Connexion aux bases de données Amazon Neptune à l'aide de G705 IAM Java

Utilisation de la TinkerPop version 3.4.11 ou supérieure pour se connecter à Neptune avec la signature Sig4

Voici un exemple de connexion à Neptune à l'aide du langage Java Gremlin API avec signature Sig4 lorsque vous utilisez la version TinkerPop 3.4.11 ou une version ultérieure (cela suppose des connaissances générales sur l'utilisation de Maven). Définissez d'abord les dépendances dans le cadre du fichier pom.xml :

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

Utilisez ensuite du code tel que le suivant :

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

Si vous effectuez une mise à niveau depuis la version 3.4.11, supprimez les références à la bibliothèque amazon-neptune-gremlin-java-sigv4. Elle n'est plus nécessaire lors de l'utilisation de handshakeInterceptor(), comme indiqué dans l'exemple ci-dessus. N'essayez pas d'utiliser handshakeInterceptor() en conjonction avec channelizer (SigV4WebSocketChannelizer.class), car des erreurs seraient générées.

IAMAuthentification entre comptes

Amazon Neptune prend en charge IAM l'authentification entre comptes grâce à l'utilisation de l'hypothèse de rôles, parfois appelée chaînage de rôles. Pour donner accès à un cluster Neptune à partir d'une application hébergée sur un autre AWS compte, procédez comme suit :

  • Créez un nouvel IAM utilisateur ou un nouveau rôle dans le AWS compte de l'application, avec une politique de confiance qui permet à l'utilisateur ou au rôle d'assumer un autre IAM rôle. Attribuez ce rôle au calcul hébergeant l'application (EC2instance, fonction Lambda, ECS tâche, etc.).

    { "Version": "2012-10-17", "Statement": [ { "Sid": "assume-role-policy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "(ARN of the role in the database account)" } ] }
  • Créez un nouveau IAM rôle dans le AWS compte de base de données Neptune qui autorise l'accès à la base de données Neptune et autorise l'attribution de rôles à partir de l'utilisateur/rôle du compte d'application. IAM Utilisez une politique de confiance basée sur :

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "(ARN of application account IAM user or role)" ] }, "Action": "sts:AssumeRole", "Condition": {} } ] }
  • Utilisez l'exemple de code suivant pour savoir comment utiliser ces deux rôles pour autoriser l'application à accéder à Neptune. Dans cet exemple, le rôle du compte d'application sera assumé via le DefaultCredentialProviderChainlors de la création duSTSclient. STSclientIl est ensuite utilisé via le STSAssumeRoleSessionCredentialsProvider pour assumer le rôle hébergé dans le compte de base AWS de données 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(); }

Utilisation d'une version TinkerPop antérieure à 3.4.11 pour se connecter à Neptune avec la signature Sig4

TinkerPop les versions antérieures 3.4.11 ne prenaient pas en charge la handshakeInterceptor() configuration présentée dans la section précédente et devaient donc s'appuyer sur le amazon-neptune-gremlin-java-sigv4 package. Il s'agit d'une bibliothèque Neptune qui contient la SigV4WebSocketChannelizer classe, qui remplace le TinkerPop Channelizer standard par un autre capable d'injecter automatiquement une signature SigV4. Dans la mesure du possible, passez à la TinkerPop version 3.4.11 ou supérieure, car la amazon-neptune-gremlin-java-sigv4 bibliothèque est obsolète.

Voici un exemple de connexion à Neptune à l'aide du Java Gremlin API avec signature Sig4 lorsque vous utilisez des TinkerPop versions antérieures à 3.4.11 (cela suppose des connaissances générales sur l'utilisation de Maven).

Définissez d'abord les dépendances dans le cadre du fichier pom.xml :

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

La dépendance ci-dessus inclut la version 3.4.10 du pilote Gremlin. Bien qu'il soit possible d'utiliser des versions plus récentes du pilote Gremlin (jusqu'à la version 3.4.13), toute mise à niveau du pilote après la version 3.4.10 devrait inclure une modification visant à utiliser le modèle handshakeInterceptor() décrit ci-dessus.

L'objet cluster gremlin-driver doit ensuite être configuré comme suit dans le code 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();