Herstellen von Verbindungen mit Neptune über Java und Gremlin mit Signature-Version-4-Signierung - 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 von Verbindungen mit Neptune über Java und Gremlin mit Signature-Version-4-Signierung

Verwenden Sie TinkerPop 3.4.11 oder höher, um mit Sig4-Signatur eine Verbindung zu Neptune herzustellen

Hier ist ein Beispiel dafür, wie Sie sich mit Gremlin Java API mit Sig4-Signatur mit Neptune verbinden können, wenn Sie TinkerPop 3.4.11 oder höher verwenden (es setzt allgemeine Kenntnisse über die Verwendung von Maven voraus). Definieren Sie zunächst die Abhängigkeiten als Teil der Datei pom.xml:

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

Verwenden Sie dann Code wie den folgenden:

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

Wenn Sie ein Upgrade von 3.4.11 ausführen, entfernen Sie Verweise auf die amazon-neptune-gremlin-java-sigv4-Bibliothek. Dies ist nicht mehr erforderlich, wenn Sie handshakeInterceptor() wie im Beispiel oben gezeigt verwenden. Versuchen Sie nicht, handshakeInterceptor() in Verbindung mit dem Channelizer (SigV4WebSocketChannelizer.class) zu verwenden, da dies zu Fehlern führen würde.

Kontenübergreifende Authentifizierung IAM

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 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 (EC2Instanz, Lambda-Funktion, ECS Task usw.).

    { "Version": "2012-10-17", "Statement": [ { "Sid": "assume-role-policy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "(ARN of the role in the database account)" } ] }
  • Erstellen Sie eine neue IAM Rolle im AWS Neptune-Datenbankkonto, die den Zugriff auf die Neptune-Datenbank und die Rollenübernahme durch den Benutzer/die Rolle des Anwendungskontos ermöglicht. IAM Verwenden Sie eine Vertrauensrichtlinie von:

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

Eine TinkerPop frühere Version als 3.4.11 verwenden, um eine Verbindung zu Neptune mit Sig4-Signatur herzustellen

TinkerPop Frühere Versionen unterstützten die im vorherigen Abschnitt gezeigte handshakeInterceptor() Konfiguration nicht und müssen sich daher auf das amazon-neptune-gremlin-java-sigv4 Paket verlassen. 3.4.11 Dies ist eine Neptune-Bibliothek, die die SigV4WebSocketChannelizer Klasse enthält, die den TinkerPop Standard-Channelizer durch eine ersetzt, die automatisch eine SigV4-Signatur einfügen kann. Führen Sie nach Möglichkeit ein Upgrade auf TinkerPop 3.4.11 oder höher durch, da die Bibliothek veraltet ist. amazon-neptune-gremlin-java-sigv4

Hier ist ein Beispiel dafür, wie man sich mit Gremlin Java API mit Sig4-Signatur mit Neptune verbindet, wenn man TinkerPop Versionen vor 3.4.11 verwendet (es setzt allgemeine Kenntnisse über die Verwendung von Maven voraus).

Definieren Sie zunächst die Abhängigkeiten als Teil der Datei pom.xml:

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

Die Abhängigkeit oben enthält die Gremlin-Treiberversion 3.4.10. Es ist zwar möglich, neuere Gremlin-Treiberversionen (bis 3.4.13) zu verwenden. Ein Upgrade des Treibers über Version 3.4.10 hinaus sollte jedoch eine Änderung enthalten, sodass das oben beschriebene handshakeInterceptor()-Modell verwendet wird.

Das gremlin-driver-Cluster-Objekt sollte dann wie folgt im Java-Code konfiguriert werden:

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