Gremlin Java による IAM を使用した Amazon Neptune データベースへの接続 - Amazon Neptune

Gremlin Java による IAM を使用した Amazon Neptune データベースへの接続

3.4.11 以降のバージョンの TinkerPop を使用して Sig4 署名で Neptune に接続する

TinkerPop 3.4.11 以上を使用しているときに、Sig4 署名付きの Gremlin Java APIを使用して Neptune に接続する方法の例を示します (Maven の使用に関する一般的知識を前提としています)。この例では、Amazon Neptune SigV4 Signer ライブラリを使用して署名をリクエストすることを支援します。まず、pom.xml ファイルの一部として依存関係を定義します。

注記

次の例が更新され、requestInterceptor() の使用が追加されました。これは TinkerPop 3.6.6 で追加されました。3.6.6 より前のバージョンの TinkerPop では、コード例で handshakeInterceptor() が使用されていましたが、このリリースで廃止されました。

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

Amazon Neptune SigV4 Signer は、AWS Java SDK のバージョン 1.x と 2.x の両方の使用をサポートしています。次の例では、DefaultCredentialsProvidersoftware.amazon.awssdk.auth.credentials.AwsCredentialsProvider インスタンスである 2.x を使用していますが、任意の com.amazonaws.auth.AWSCredentialsProvider で 1.x フォームを均等に使用できます。1.x から 2.x にアップグレードする場合は、AWS SDK for Java 2.x ドキュメントの認証情報プロバイダーの変更で 1.x と 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); }
注記

3.4.11 からアップグレードする場合は、amazon-neptune-gremlin-java-sigv4 ライブラリへの参照を削除してください。上の例に示されているように、requestInterceptor() を使用するときには不要になります。requestInterceptor() をちゃねライザー (SigV4WebSocketChannelizer.class) と組み合わせて使用しようとしないでください。エラーが発生します。

クロスアカウント IAM 認証

Amazon Neptune は、ロールの仮定を使用することによるクロスアカウント IAM 認証をサポートしています。これは、ロールの連鎖とも呼ばれます。別の AWS アカウントでホストされているアプリケーションから Neptune クラスターへのアクセス権を付与するには:

  • ユーザーまたはロールが別の IAM ロールを引き受けることを許可する信頼ポリシーを使用して、アプリケーション AWS アカウントに新しい IAM ユーザーまたはロールを作成します。このロールをアプリケーションをホストするコンピューティング (EC2 インスタンス、Lambda 関数、ECS タスクなど) に割り当てます。

  • Neptune データベースへのアクセスを許可し、アプリケーションアカウントの IAM ユーザー/ロールからのロールの引き受けを許可する新しい IAM ロールを Neptune データベース AWS アカウントに作成します。次の信頼ポリシーを使用します。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "(ARN of application account IAM user or role)" ] }, "Action": "sts:AssumeRole", "Condition": {} } ] }
  • これらの 2 つのロールを使用してアプリケーションが Neptune にアクセスできるようにする方法のガイダンスとして次のコード例を使用します。この例では、アプリケーションアカウントロールは、STSclient の作成時に DefaultCredentialProviderChain を介して引き受けられます。その後、STSclientSTSAssumeRoleSessionCredentialsProvider を介して使用され、Neptune データベース AWS アカウントでホストされているロールを引き受けます。

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

3.4.11 より前のバージョンの TinkerPop を使用して Sig4 署名で Neptune に接続する

3.4.11 より前の TinkerPop バージョンは、前のセクションで示した requestInterceptor() 設定をサポートしていなかったため、amazon-neptune-gremlin-java-sigv4 パッケージに依存する必要があります。これは、標準の TinkerPop チャネライザーを SigV4 署名を自動的に注入できるチャネライザーに置き換える SigV4WebSocketChannelizer クラスを含む Neptune ライブラリです。amazon-neptune-gremlin-java-sigv4 ライブラリは廃止されているので、可能であれば、TinkerPop 3.4.11 以降にアップグレードしてください。

3.4.11 より前の TinkerPop バージョンを使用しているときに、Sig4 署名付きの Gremlin Java API を使用して Neptune に接続する方法の例を示します (Maven の使用に関する一般的知識を前提としています)。

まず、pom.xml ファイルの一部として依存関係を定義します。

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

上記の依存関係には Gremlin ドライバーのバージョン 3.4.10 が含まれます。より新しい Gremlin ドライバーバージョン (3.4.13 まで) を使用することも可能ですが、3.4.10 以降にドライバーをアップグレードする場合は、上記requestInterceptor() モデルを使用するように変更する必要があります。

その後、gremlin-driver Cluster オブジェクトを 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();