背景/设置
我是...
尝试使用 ECS Fargate 容器中的
gremlin
库 (node.js
) 进行连接。
收到 403 错误。
非常有信心VPC/安全组/等设置没问题,因为请求显然正在通过。
如果重要的话,这是我获取
{{ writer-endpoint }}
值的地方:
我看到了这个讨论,但我不确定它是否适用。
有人对此有什么见解或建议吗?
我已经尝试过 Claude 和 ChatGPT 来解决这个问题,但是由于缺乏关于可能出现问题的详细信息,这使得解决这个问题非常困难。
我特意开放了 IAM 策略(例如,“*”表示资源访问)以便进行故障排除,并且我认为我已授予适当的 IAM 权限。
更新:根据泰勒的以下回答,我能够解决该问题。 我创建了 他的答案的 TypeScript 版本,如果它对将来的任何人有帮助的话。
至于403错误的问题,很可能是由于IAM auth造成的。 您如何签署与 Neptune 的连接请求?
以下是通过 Gremlin-Javascript 库与 IAM 签名进行连接的示例。这将使用默认凭据提供程序链获取凭据。 在这种情况下,将从 ECS 任务执行角色提供的任何内容中获取。
const gremlin = require('gremlin');
const { fromNodeProviderChain } = require('@aws-sdk/credential-providers');
const {getUrlAndHeaders} = require('gremlin-aws-sigv4/lib/utils');
const __ = gremlin.process.statics;
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;
const Graph = gremlin.structure.Graph;
const region = 'us-west-2';
const getCredentials = async () => {
let credentials;
try {
credentials = fromNodeProviderChain({ clientConfig: { region }});
} catch (e) {
console.error("No credentials found", e);
}
return credentials;
};
(main = async () => {
console.log('starting');
let provider = await getCredentials();
let creds = await provider();
creds['region'] = region;
conninfo = getUrlAndHeaders(
'neptune-cluster-endpoint.us-west-2.neptune.amazonaws.com',
'8182',
creds,
'/gremlin',
'wss');
console.log(conninfo);
dc = new DriverRemoteConnection(conninfo['url'], { headers: conninfo['headers'] });
const graph = new Graph();
const g = graph.traversal().withRemote(dc);
query = g.V('some-id').valueMap(true);
res = await query.next();
console.log(res);
dc.close();
})
main()
这与我们文档中记录的示例 Node Lambda 函数类似 (https://docs.aws.amazon.com/neptune/latest/userguide/lambda-functions-examples.html#lambda-functions-examples -javascript)。 该示例更全面,因为它还提供了处理连接错误和重新连接的方法。