【问题标题】:How to integrate the visualisation tool Graphexp with Neptune from EC2 instance in the same VPC as Neptune如何在与 Neptune 相同的 VPC 中将可视化工具 Graphexp 与来自 EC2 实例的 Neptune 集成
【发布时间】:2021-04-27 16:18:10
【问题描述】:

我设置了一个 AWS Neptune 数据库集群,其中一个主节点和两个副本节点位于三个私有子网中,每个子网位于同一区域的三个可用区中。我还创建了相应的公共子网,其中 EC2 实例将具有图形数据库可视化应用程序,例如 https://github.com/bricaud/graphexphttps://github.com/erandal/graphexp。我正在使用后者(erandal),因为它的 UI 更吸引人。它也部署在 apache httpd web 服务器中。

私有子网可以通过与公共子网关联的 NAT 网关访问互联网。

目前我只有一个 EC2 实例,可以先尝试这些 UI 工具与 Neptune 的连接,然后再通过在不同 AZ 中部署副本来提高实例的可用性。

我尝试通过 Graphexp 公开的两个选项(websockets 和 http)进行连接,但没有成功。我在 Chrome 开发工具控制台中不断收到错误 - ERR_ADDRESS_UNREACHABLE。我尝试连接到 Neptune 集群的集群端点主机名及其内部 IP 地址等。有趣的是,我能够使用 cURL 从 EC2 实例的 shell 成功调用 Neptune 的 gremlin 端点。 为什么这个网络应用程序不起作用?

【问题讨论】:

    标签: amazon-web-services amazon-vpc amazon-neptune graphexp


    【解决方案1】:

    我已将 GraphExp 与 Neptune 无缝结合使用。设置中的主要问题是数据库调用是通过 AJAX 进行的,这意味着您需要设置网络连接(安全组),以便运行浏览器的客户端实例可以访问 Neptune 端点.

    在您的情况下,您提到您设置 SG 的方式是让您的 EC2 实例能够成功向数据库发出 CURL 请求。托管 GraphExp 后,您是如何在浏览器中打开页面的?您是否使 graphexp 端点可以在您的 VPC 外部访问并直接从其他网络连接到它?如果是,那么您的客户端实例(打开了浏览器页面的那个)需要能够与数据库端点对话。尝试从该实例到数据库端点执行 CURL,看看它是否有效。

    如果您确认上述假设成立,解决此问题的一种方法是创建一个由您的 Neptune DB 端点 (IP) 支持的 ALB。然后将一个安全组附加到 ALB,使其可以从您的客户端计算机访问。现在,让 GraphExp 与 ALB 端点而不是实际的 Neptune 端点对话。我最终在我的实验中使用了这个。对我来说,一个小问题是我没有让 websocket 工作。 HTTP 对我来说已经足够好了,我没有费心去调试 WS 发生的事情。

    一旦一切正常,请告诉我您是否需要了解其他技巧以使工作更好。例如,我最终禁用了 GraphExp 中的一些代码,这些代码用于发出我并不真正感兴趣的大量读取查询。这使我的演示应用程序加载速度更快。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我想在 VPC 内的 EC2 实例上托管 GraphEXP,以便我们的团队可以看到图形可视化。最后,我设置了一个 apache 服务器并托管了一个简单的 php 脚本,该脚本对 Neptune 端点进行了 curl,这样我就不必创建一个可从 Internet 访问的 lambda 端点(EC2 域位于 Cloudflare 访问之后)。 下面是我写的简单的php api。

      <?php
      header("Content-Type:application/json");
      $url = $_POST['server_url'];
      $query = $_POST['query'];
      $queryObject = new stdClass();
      $queryObject->gremlin = $query;
      $curl = curl_init();
      
      curl_setopt($curl, CURLOPT_POST, 1);
      curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($queryObject));
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($curl, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/json',
      ));
      curl_setopt($curl, CURLOPT_URL, $url . "/gremlin");
      $result = curl_exec($curl);
      echo $result;
      

      我还必须修改 run_ajax_request 函数中的 GraphEXP graphioGremlin.js 脚本文件我将 $.ajax 参数 url 替换为我的 php api 的路径,然后我还注释掉了 contentType 并更改了data 的值改为{query: gremlin_query, server_url} 所以它看起来像下面

      type: "POST",
      url: [path to my api php file],
      timeout: REST_TIMEOUT,
      data: {query: gremlin_query, server_url}
      

      graphConf.js 内部,我将主机值设置为没有端口的 Neptune 端点。然后在graphEXP ui中我选择了REST选项,一切正常。希望能帮助别人...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-05
        • 2018-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-30
        • 2015-04-24
        相关资源
        最近更新 更多