通过 Gremlin Java 使用 IAM 连接到 Amazon Neptune 数据库 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

通过 Gremlin Java 使用 IAM 连接到 Amazon Neptune 数据库

使用 TinkerPop 3.4.11 或更高版本通过 Sig4 签名连接到 Neptune

以下是使用 TinkerPop 3.4.11 或更高版本时如何使用 Gremlin Java API 和 Sig4 签名连接到 Neptune 的示例(它假设具有使用 Maven 的常识)。此示例使用 Amazon Neptune SigV4 Signer 库来协助请求签名。首先,将依赖关系定义为 pom.xml 文件的一部分:

注意

以下示例已更新,加入了 requestInterceptor() 的使用。此功能已添加到 TinkerPop 3.6.6 中。在 TinkerPop 版本 3.6.6 之前,这些代码示例使用的是 handshakeInterceptor(),它已被该版本弃用。

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

Amazon Neptune SigV4 Signer 支持使用 Amazon Java SDK 的版本 1.x 和 2.x。以下示例使用 2.x,其中 DefaultCredentialsProvidersoftware.amazon.awssdk.auth.credentials.AwsCredentialsProvider 实例,但您同样可以将 1.x 表单与任何 com.amazonaws.auth.AWSCredentialsProvider 一起使用。如果您要从 1.x 升级到 2.x,则可以参阅适用于 Java 2.x 的 Amazon SDK 文档的凭证提供商变更,详细了解 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 身份验证。要通过托管在不同 Amazon 账户中的应用程序提供 Neptune 集群的访问权限,请执行以下操作:

  • 在应用程序 Amazon 账户中创建新的 IAM 用户或角色,并创建信任策略,允许该用户或角色代入其他 IAM 角色。将该角色分配给托管应用程序(EC2 实例、Lambda 函数、ECS 任务等)的计算。

  • 在 Neptune 数据库 Amazon 账户中创建一个新的 IAM 角色,该角色允许访问 Neptune 数据库,并允许使用应用程序账户 IAM 用户/角色来代入角色。使用以下信任策略:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "(ARN of application account IAM user or role)" ] }, "Action": "sts:AssumeRole", "Condition": {} } ] }
  • 使用以下代码示例作为指导,了解如何使用这两个角色来允许应用程序访问 Neptune。在此示例中,系统将在创建 STSclient 时通过 DefaultCredentialProviderChain 代入应用程序账户角色。然后,通过 STSAssumeRoleSessionCredentialsProvider 使用 STSclient 来代入 Neptune 数据库 Amazon 账户中托管的角色。

    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 软件包。这是一个包含 SigV4WebSocketChannelizer 类的 Neptune 库,它用可以自动注入 SigV4 签名的通道选择器取代了标准 TinkerPop 通道选择器。如果可能,请升级到 TinkerPop 3.4.11 或更高版本,因为 amazon-neptune-gremlin-java-sigv4 库已被弃用。

以下是一个示例,说明在使用 3.4.11 之前的 TinkerPop 版本时,如何使用 Gremlin Java API 和 Sig4 签名连接到 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() 模型的更改。

然后,应在 Java 代码中按如下方式配置 gremlin-driver 集群对象:

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