Menghubungkan ke Neptune Menggunakan Java dan Gremlin dengan Penandatangan Signature Versi 4 - Amazon Neptune

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menghubungkan ke Neptune Menggunakan Java dan Gremlin dengan Penandatangan Signature Versi 4

Menggunakan TinkerPop 3.4.11 atau lebih tinggi untuk terhubung ke Neptunus dengan penandatanganan Sig4

Berikut adalah contoh cara terhubung ke Neptunus menggunakan API Java Gremlin dengan penandatanganan Sig4 saat TinkerPop menggunakan 3.4.11 atau lebih tinggi (ini mengasumsikan pengetahuan umum tentang penggunaan Maven). Pertama, tentukan dependensi sebagai bagian dari file: pom.xml

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

Kemudian, gunakan kode seperti berikut:

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

Jika Anda memutakhirkan dari3.4.11, hapus referensi ke amazon-neptune-gremlin-java-sigv4 perpustakaan. Ini tidak lagi diperlukan saat menggunakan handshakeInterceptor() seperti yang ditunjukkan pada contoh di atas. Jangan mencoba untuk menggunakan handshakeInterceptor() dalam hubungannya dengan channelizer (SigV4WebSocketChannelizer.class), karena akan menghasilkan kesalahan.

IAMOtentikasi lintas akun

Amazon Neptunus mendukung otentikasi lintas IAM akun melalui penggunaan asumsi peran, juga kadang-kadang disebut sebagai rantai peran. Untuk menyediakan akses ke cluster Neptunus dari aplikasi yang dihosting di akun yang berbeda: AWS

  • Buat IAM pengguna atau peran baru di AWS akun aplikasi, dengan kebijakan kepercayaan yang memungkinkan pengguna atau peran untuk mengambil IAM peran lain. Tetapkan peran ini ke komputasi yang menghosting aplikasi (EC2misalnya, fungsi Lambda, ECS Tugas, dll.).

    { "Version": "2012-10-17", "Statement": [ { "Sid": "assume-role-policy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "(ARN of the role in the database account)" } ] }
  • Buat IAM peran baru di akun AWS database Neptunus yang memungkinkan akses ke database Neptunus dan memungkinkan asumsi peran dari pengguna/peran akun aplikasi. IAM Gunakan kebijakan kepercayaan dari:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "(ARN of application account IAM user or role)" ] }, "Action": "sts:AssumeRole", "Condition": {} } ] }
  • Gunakan contoh kode berikut sebagai panduan tentang cara menggunakan dua peran ini untuk memungkinkan aplikasi mengakses Neptunus. Dalam contoh ini, peran akun aplikasi akan diasumsikan melalui DefaultCredentialProviderChainsaat membuatSTSclient. Kemudian STSclient digunakan melalui STSAssumeRoleSessionCredentialsProvider untuk mengambil peran yang dihosting di akun database AWS Neptunus.

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

Menggunakan versi TinkerPop lebih awal dari 3.4.11 untuk terhubung ke Neptunus dengan penandatanganan Sig4

TinkerPop versi sebelumnya 3.4.11 tidak memiliki dukungan untuk handshakeInterceptor() konfigurasi yang ditunjukkan di bagian sebelumnya dan oleh karena itu harus bergantung pada amazon-neptune-gremlin-java-sigv4 paket. Ini adalah perpustakaan Neptunus yang berisi SigV4WebSocketChannelizer kelas, yang menggantikan Channelizer TinkerPop standar dengan yang dapat secara otomatis menyuntikkan tanda tangan SigV4. Jika memungkinkan, ugrade ke TinkerPop 3.4.11 atau yang lebih tinggi, karena amazon-neptune-gremlin-java-sigv4 pustaka tidak digunakan lagi.

Berikut adalah contoh cara terhubung ke Neptunus menggunakan API Java Gremlin dengan penandatanganan Sig4 saat menggunakan versi sebelum 3.4.11 (ini mengasumsikan pengetahuan umum tentang cara TinkerPop menggunakan Maven).

Pertama, tentukan dependensi sebagai bagian dari file: pom.xml

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

Ketergantungan di atas akan mencakup versi driver Gremlin. 3.4.10 Meskipun dimungkinkan untuk menggunakan versi driver Gremlin yang lebih baru (hingga3.4.13), peningkatan driver melewati 3.4.10 harus menyertakan perubahan untuk menggunakan model yang dijelaskan di atas. handshakeInterceptor()

Objek gremlin-driver Cluster kemudian harus dikonfigurasi sebagai berikut dalam kode 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();