Connexion aux bases de données Amazon Neptune à l'aide d'IAM avec Gkremlin 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 d'IAM avec Gkremlin Java

Voici un exemple de connexion à Neptune à l'aide du pilote Java Gkremlin avec signature Sigv4 (cela suppose des connaissances générales sur l'utilisation de Maven).

Note

Les exemples suivants ont été mis à jour pour inclure l'utilisation de RequestInterceptor (). Cela a été ajouté dans la version TinkerPop 3.6.6. Avant la TinkerPop version 3.6.6, les exemples de code utilisaient HandshakeInterceptor (), qui était obsolète avec cette version.

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

Amazon Neptune SigV4 Signer prend en charge l'utilisation des versions 1.x et 2.x du SDK Java. AWS L'exemple suivant utilise la version 2.x où il DefaultCredentialsProvider s'agit d'une software.amazon.awssdk.auth.credentials.AwsCredentialsProvider instance, mais vous pouvez également utiliser le formulaire 1.x avec n'importe quelle instance. com.amazonaws.auth.AWSCredentialsProvider Si vous passez de la version 1.x à la version 2.x, vous pouvez en savoir plus sur les modifications entre les versions 1.x et 2.x dans la documentation relative aux modifications apportées au fournisseur d'informations d'identification du SDK for AWS 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); }

Authentification IAM entre comptes

Amazon Neptune prend en charge l'authentification IAM 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 utilisateur ou rôle IAM dans le AWS compte d'application, avec une politique de confiance qui permet à l'utilisateur ou au rôle d'assumer un autre rôle IAM. Attribuez ce rôle au calcul hébergeant l'application (EC2 instance, fonction Lambda, tâche ECS, etc.).

  • Créez un nouveau rôle IAM dans le compte de base de données Neptune qui permet d'accéder à la AWS base de données Neptune et d'assumer un rôle à partir du compte d'application IAM utilisateur/rôle. Utilisez une politique de confiance basée sur :

    JSON
    { "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) .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(); }