Python-连接到AWS Neptune

时间:2018-08-14 14:28:05

标签: python amazon-web-services graph-databases amazon-neptune

我在aws中创建了一个海王星实例。我现在如何连接到它?

我从笔记本电脑本地尝试了documentation中给出的示例。

from gremlin_python.structure.graph import Graph
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection

graph = Graph()

g = graph.traversal().withRemote(DriverRemoteConnection('ws://my_endpoint:8182/gremlin','g'))

print(g.V().limit(2).toList())

但是我收到了带有以下堆栈跟踪的超时异常

File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/gremlin_python/driver/driver_remote_connection.py", line 45, in __init__
    password=password)
  File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/gremlin_python/driver/client.py", line 76, in __init__
    self._fill_pool()
  File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/gremlin_python/driver/client.py", line 88, in _fill_pool
    conn = self._get_connection()
  File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/gremlin_python/driver/client.py", line 101, in _get_connection
    self._transport_factory, self._executor, self._pool)
  File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/gremlin_python/driver/connection.py", line 40, in __init__
    self.connect()
  File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/gremlin_python/driver/connection.py", line 46, in connect
    self._transport.connect(self._url)
  File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/gremlin_python/driver/tornado/transport.py", line 33, in connect
    lambda: websocket.websocket_connect(url))
  File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/tornado/ioloop.py", line 458, in run_sync
    return future_cell[0].result()
  File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/tornado/concurrent.py", line 238, in result
    raise_exc_info(self._exc_info)
  File "<string>", line 4, in raise_exc_info
  File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/tornado/stack_context.py", line 316, in wrapped
    ret = fn(*args, **kwargs)
  File "/home/cegprakash/.virtualenvs/cegprakash-6Wq6Rd61/lib/python3.5/site-packages/tornado/simple_httpclient.py", line 307, in _on_timeout
    raise HTTPError(599, error_message)
tornado.httpclient.HTTPError: HTTP 599: Timeout while connecting

数据库连接时是否缺少身份验证?

3 个答案:

答案 0 :(得分:1)

连接性问题通常归因于安全组设置的某些问题。这已经在另一个问题[1]中得到了回答。如果有帮助,请在此处发布响应。


如果在连接数据库时看到超时,第一步将是检查您是否与端点具有网络连接。

尝试:telnet endpoint port

如果您具有连通性,则会看到以下内容:

Trying 172.217.5.110...
Connected to endpoint (172.217.5.110).
Escape character is '^]'

如果这行得通,那么任何HTTP客户端都应该能够连接到您的数据库。 (CURL,POSTMAN等)

如果telnet不起作用,则几乎可以肯定您没有正确配置EC2安全组。您需要做的要点是:

  1. 创建一个安全组(例如“ ec2”)并将其附加到您的EC2客户端实例。默认情况下,此安全组应允许到所有IP的出站连接。如果不是这种情况,请添加它。

  2. 创建一个安全组(例如'db')。在“入站规则”中,添加一个规则,该规则允许入站TCP连接到您的数据库端口,并将其作为在#1中创建的安全组。

  3. 现在修改您的Neptune群集,并在其上附加“ db”。

  4. 安全组更改传播得非常快,因此您应该能够使用telnet进行测试。

您可能会找到其他答案,这些答案表明您需要数据库和EC2实例位于同一安全组中。这并非完全正确,这只是上述步骤的特例,您可以为数据库和客户端实例使用一个安全组,而不必创建两个安全组。从安全和设计的角度来看,最好是为数据库和客户端实例设置单独的安全组。

希望这会有所帮助。

[1] https://stackoverflow.com/a/51940587/3069919

答案 1 :(得分:1)

确保您的EC2和Neptune在同一VPC中。

在安全组中,允许端口8182的TCP连接。

尝试从('ws://my_endpoint:8182/gremlin','g')更改URL 到('wss://my_endpoint:8182/gremlin','g')

对我有用。

答案 2 :(得分:0)

只能从在其中设置群集的VPC中运行的EC2实例(或类似的实例)访问AWS Neptune。

https://docs.aws.amazon.com/neptune/latest/userguide/security-vpc.html

如果证明这是一个障碍,则可以使用AWS Lambda快速创建原型,该AWS Lambda允许通过本教程访问Neptune。

https://docs.aws.amazon.com/neptune/latest/userguide/get-started-cfn-lambda.html