通过 Gremlin Java 使用 IAM 连接到 Amazon Neptune 数据库
使用 TinkerPop 3.4.11 或更高版本通过 Sig4 签名连接到 Neptune
以下是使用 TinkerPop 3.4.11 或更高版本时如何使用 Gremlin Java API 和 Sig4 签名连接到 Neptune 的示例(它假设具有使用 Maven 的常识)。此示例使用 Amazon Neptune SigV4 Signerpom.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,其中 DefaultCredentialsProvider 为 software.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 用户/角色来代入角色。使用以下信任策略:
-
使用以下代码示例作为指导,了解如何使用这两个角色来允许应用程序访问 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();