Menghubungkan ke database Amazon Neptunus menggunakan IAM dengan Gremlin Java - Amazon Neptune

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

Menghubungkan ke database Amazon Neptunus menggunakan IAM dengan Gremlin Java

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

Berikut adalah contoh cara terhubung ke Neptunus menggunakan Gremlin Java API 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

catatan

Contoh berikut telah diperbarui untuk menyertakan penggunaan requestInterceptor (). Ini ditambahkan di TinkerPop 3.6.6. Sebelum TinkerPop versi 3.6.6, contoh kode menggunakan HandshakeInterceptor (), yang tidak digunakan lagi dengan rilis itu.

<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) .requestInterceptor( 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 requestInterceptor() seperti yang ditunjukkan pada contoh di atas. Jangan mencoba untuk menggunakan requestInterceptor() dalam hubungannya dengan channelizer (SigV4WebSocketChannelizer.class), karena akan menghasilkan kesalahan.

Autentikasi IAM lintas akun

Amazon Neptunus mendukung otentikasi IAM lintas 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 pengguna atau peran IAM baru di AWS akun aplikasi, dengan kebijakan kepercayaan yang memungkinkan pengguna atau peran untuk mengambil peran IAM lain. Tetapkan peran ini ke komputasi yang menghosting aplikasi (EC2 misalnya, fungsi Lambda, Tugas ECS, 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 peran IAM baru di akun AWS database Neptunus yang memungkinkan akses ke database Neptunus dan memungkinkan asumsi peran dari pengguna/peran IAM akun aplikasi. 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) .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(); }

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 requestInterceptor() 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 Gremlin Java API 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. requestInterceptor()

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