Herstellen einer Verbindung zu Amazon Neptune Neptune-Datenbanken mithilfe von IAM mit Gremlin Java - Amazon Neptune

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Herstellen einer Verbindung zu Amazon Neptune Neptune-Datenbanken mithilfe von IAM mit Gremlin Java

Hier ist ein Beispiel dafür, wie Sie mithilfe des Gremlin-Java-Treibers mit Sigv4-Signatur eine Verbindung zu Neptune herstellen können (es werden allgemeine Kenntnisse über die Verwendung von Maven vorausgesetzt).

Anmerkung

Die folgenden Beispiele wurden aktualisiert und beinhalten nun auch die Verwendung von requestInterceptor (). Dies wurde in 3.6.6 hinzugefügt. TinkerPop Vor TinkerPop Version 3.6.6 wurde in den Codebeispielen HandshakeInterceptor () verwendet, das in dieser Version veraltet war.

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

Der Amazon Neptune SigV4 Signer unterstützt die Verwendung der beiden Versionen 1.x und 2.x des Java SDK. AWS Im folgenden Beispiel wird 2.x verwendet, wobei es sich um eine software.amazon.awssdk.auth.credentials.AwsCredentialsProvider Instanz DefaultCredentialsProvider handelt, aber Sie könnten auch das 1.x-Formular mit jeder anderen verwenden. com.amazonaws.auth.AWSCredentialsProvider Wenn Sie ein Upgrade von 1.x auf 2.x durchführen, finden Sie weitere Informationen zu den Änderungen zwischen 1.x und 2.x in den Änderungen des Credentials-Providers der AWS SDK for Java 2.x-Dokumentation.

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

Kontenübergreifende IAM-Authentifizierung

Amazon Neptune unterstützt die kontoübergreifende IAM-Authentifizierung mithilfe von Rollenübernahme, manchmal auch als Rollenverkettung bezeichnet. So gewähren Sie Zugriff auf einen Neptune-Cluster von einer Anwendung aus, die in einem anderen AWS Konto gehostet wird:

  • Erstellen Sie einen neuen IAM-Benutzer oder eine neue IAM-Rolle im AWS Anwendungskonto mit einer Vertrauensrichtlinie, die es dem Benutzer oder der Rolle ermöglicht, eine andere IAM-Rolle anzunehmen. Weisen Sie diese Rolle dem Computer zu, der die Anwendung hostet (EC2 Instanz, Lambda-Funktion, ECS-Task usw.).

  • Erstellen Sie eine neue IAM-Rolle im AWS Neptune-Datenbankkonto, die den Zugriff auf die Neptune-Datenbank und die Rollenübernahme vom IAM-Benutzer/der Rolle des Anwendungskontos ermöglicht. Verwenden Sie eine Vertrauensrichtlinie von:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "(ARN of application account IAM user or role)" ] }, "Action": "sts:AssumeRole", "Condition": {} } ] }
  • Verwenden Sie das folgende Codebeispiel als Anleitung zur Verwendung dieser beiden Rollen, um der Anwendung den Zugriff auf Neptune zu ermöglichen. In diesem Beispiel wird die Rolle des Anwendungskontos DefaultCredentialProviderChainbeim Erstellen des übernommen. STSclient Das STSclient wird dann über das verwendetSTSAssumeRoleSessionCredentialsProvider, um die im AWS Neptune-Datenbankkonto gehostete Rolle zu übernehmen.

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