【问题标题】:400 bad request when attempting connection to AWS Neptune with IAM enabled尝试连接到启用 IAM 的 AWS Neptune 时出现 400 错误请求
【发布时间】:2020-06-25 11:35:17
【问题描述】:

我无法连接到启用了 IAM 的海王星实例。我遵循了 AWS 文档(在途中纠正了一些愚蠢的错误),但没有运气。

当我使用 SigV4Signer 通过我的 Java 应用程序连接时,当我使用 gremlin 控制台时,我收到 400 bad request websocket 错误。

o.a.t.g.d.Handler$GremlinResponseHandler : Could not process the response

io.netty.handler.codec.http.websocketx.WebSocketHandshakeException: Invalid handshake response getStatus: 400 Bad Request
    at io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker13.verify(WebSocketClientHandshaker13.java:267)
    at io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker.finishHandshake(WebSocketClientHandshaker.java:302)
    at org.apache.tinkerpop.gremlin.driver.handler.WebSocketClientHandler.channelRead0(WebSocketClientHandler.java:69)

当我运行com.amazon.neptune.gremlin.driver.example.NeptuneGremlinSigV4Example(从我的机器通过端口转发和从 EC2 跳转主机)我得到:

java.util.concurrent.TimeoutException: Timed out while waiting for an available host - check the client configuration and connectivity to the server if this message persists

我可以使用旧的已弃用证书机制连接到我的海王星实例。我正在使用 jumphost ec2 实例和端口转发。

我相信 SigV4 方面的工作方式与海王星审计日志中的一样,我可以看到连接 aws_access_key 的尝试:

1584098990319, <jumphost_ip>:47390, <db_instance_ip>:8182, HTTP_GET, [unknown], [unknown], "HttpObjectAggregator$AggregatedFullHttpRequest(decodeResult: success, version: HTTP/1.1, content: CompositeByteBuf(ridx: 0, widx: 0, cap: 0, components=0)) GET /gremlin HTTP/1.1 upgrade: websocket connection: upgrade sec-websocket-key: g44zxck9hTI9cZrq05V19Q== sec-websocket-origin: http://localhost:8182 sec-websocket-version: 13 Host: localhost:8182 X-Amz-Date: 20200313T112950Z Authorization: AWS4-HMAC-SHA256 Credential=<my_access_key>/20200313/eu-west-2/neptune-db/aws4_request, SignedHeaders=host;sec-websocket-key;sec-websocket-origin;sec-websocket-version;upgrade;x-amz-date, Signature=<the_signature> content-length: 0", /gremlin

但是当我看的时候

这是我创建的策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "neptune-db:*"
            ],
            "Resource": [
                "arn:aws:neptune-db:eu-west-2:<my_aws_account>:*/*"
            ]
        }
    ]
}

我之前尝试过使用引用我的集群资源 ID 的策略。 我创建了一个新的 api 用户,并将此策略作为其唯一权限。 (我已经试过两次了)。

IAM 显示我创建的图形用户尚未成功登录(duh)。

似乎问题出在沿线某处的 IAM 设置上。是否可以从 AWS 获取有关连接尝试失败原因的更多信息?

我正在使用最新版本的 Neptune 和 3.4.3 Gremlin 驱动程序和控制台。我在运行 NeptuneGremlinSigV4Example 并构建要部署到控制台的库时使用 Java 8。

谢谢

【问题讨论】:

    标签: amazon-neptune


    【解决方案1】:

    从审核日志输出中可以看出,正在创建的 SigV4 签名使用 localhost 作为 Host 标头。这很可能是因为您使用代理连接到 Neptune。默认情况下,NeptuneGremlinSigV4Example 假定您直接连接到 Neptune 端点,并在创建签名时将端点用作 Host 标头。

    要解决此问题,您可以使用以下示例代码覆盖此过程并允许您使用代理并仍然正确签署请求。

    https://github.com/aws-samples/amazon-neptune-samples/tree/master/gremlin/gremlin-java-client-demo

    我能够使用以下方法使其正常工作。

    • 创建从本地工作站到 EC2 跳转主机的 SSL 隧道:
    ssh -i <key-pem-file> -L 8182:<neptune-endpoint>:8182 ec2-user@<ec2-jumphost-hostname>
    
    • 设置以下环境变量:
    export AWS_ACCESS_KEY_ID=<access_key>
    export AWS_SECRET_ACCESS_KEY=<secret_key>
    export SERVICE_REGION=<region_id>  (i.e. us-west-2)
    
    • 隧道启动并设置好环境变量后,请使用以下格式和Gremlin-Java-Client-Demo
    java -jar target/gremlin-java-client-demo.jar --nlb-endpoint localhost --lb-port 8182 --neptune-endpoint <neptune-endpoint> --port 8182 --enable-ssl --enable-iam-auth
    

    【讨论】:

    • 感谢 Taylor,我将查看该示例代码。我确实想知道这是否是 localhost 方面,所以我从我的 ec2 jumphost 运行了NeptuneGremlinSigV4Example,也使用了上面提到的相同的TimeoutException
    • TimeoutException 可能暗示另一个问题。您是在使用 SSH 代理并通过 jumphost 建立隧道,还是实际上设置了 NAT 并进行端口转发。我不记得后者是否还需要通过 Neptune 上的安全组允许您的源 IP 地址。这可能是你尝试的东西。来自客户端的 TimeoutException 通常表明缺乏网络连接。
    • 在本地尝试时,它是通过 jumphost 的 SSH 代理隧道。但是当我通过直接连接从 VPC 内的 jumphost 运行时,我遇到了同样的问题。 NeptuneClusterBuilder 是否需要使用 NLB 或 ALB,或者我可以将它与 iamEnabled 一起使用
    • 我更新了上面的说明,使其更加详细。此外,我还验证了您也应该能够在跳转主机上运行它。只需设置上面列出的相同环境变量,然后使用 Java 示例:java -jar target/gremlin-java-client-demo.jar --neptune-endpoint &lt;neptune-endpoint&gt; --port 8182 --enable-ssl --enable-iam-auth
    • 感谢 Taylor,我按照您上面的说明进行操作,非常感谢您不厌其烦地发布它们。使用客户端演示应用程序,从我的本地计算机到 iam enable neptune 的连接按描述工作;我可以在图表上看到顶点的转储。我将能够在我的 java 项目中使用这些类来促进在本地和我的 VPC 中运行我的应用程序。
    猜你喜欢
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2019-10-10
    • 2018-08-19
    • 2018-02-01
    • 1970-01-01
    • 2021-05-13
    • 2015-08-22
    相关资源
    最近更新 更多