使用不同的 IAM 身份验证从 2 个不同的 AWS Neptune 集群获取数据

问题描述 投票:0回答:1

我有一个要求,我想从 2 个不同的 AWS neptune 终端节点获取数据,这些终端节点配置了不同的 IAM 角色/用户。我将为两个用户提供不同的访问密钥和秘密密钥。 根据文档“https://docs.aws.amazon.com/neptune/latest/userguide/iam-auth-connecting-gremlin-java.html”,我们需要将访问密钥和秘密密钥设置为系统属性。

那么下面的方式从2个集群中获取数据是否正确?

import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.neptune.auth.NeptuneNettyHttpSigV4Signer;
import com.amazonaws.neptune.auth.NeptuneSigV4SignerException;

 ...

System.setProperty("aws.accessKeyId","your-access-key1");
System.setProperty("aws.secretKey","your-secret-key1");

 ...

Cluster1 = Cluster.build((your cluster name1))
                 .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();
          
          
     ...

System.setProperty("aws.accessKeyId","your-access-key2");
System.setProperty("aws.secretKey","your-secret-key2");

 ...

Cluster2 = Cluster.build((your cluster name2))
                 .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 client2 = Cluster2.connect();
  client2.submit("g.V().has('code','IAD')").all().get();
} catch (Exception e) {
  throw new RuntimeException("Exception occurred while connecting to cluster", e);
}
amazon-web-services amazon-ec2 gremlin amazon-neptune neptune
1个回答
0
投票

NeptuneNettyHttpSigV4Signer
有一个构造函数,例如:

public NeptuneNettyHttpSigV4Signer(
        final String regionName, 
        final AWSCredentialsProvider awsCredentialsProvider)

Neptune 文档中的示例显示了最常见且最容易使用的

AWSCredentialsProvider
(
DefaultAWSCredentialsProviderChain
),其中将检查这些系统属性的凭据。在您的情况下,您有两个不同的签名,使用系统属性可能不是最好的方法,因为多线程环境在读取和写入它们时会遇到问题。

如果您针对这种情况提供不同的

AWSCredentialsProvider
会更好,专门为每个集群提供凭据。您可以在 javadocs 中查看所有可用的选项。也许与您正在使用的代码最相似的方法是:

NeptuneNettyHttpSigV4Signer sigV4Signer = new AWSStaticCredentialsProvider(
"(your region)", 
new BasicAWSCredentials("<access-key>","<secret-key>"));

当然,我们在这里对凭据进行硬编码,因此您可能想尝试适合您情况的实现。

AWSCredentialsProvider
也很容易自行实现自定义解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.