我有一个要求,我想从 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);
}
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
也很容易自行实现自定义解决方案。