在启用 IAM 的情况下尝试连接到 AWS Neptune 时出现 400 错误请求
400 bad request when attempting connection to AWS Neptune with IAM enabled
我无法连接到启用了 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 jumphost)我得到:
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 显示我创建的图形用户未成功登录(呃)。
问题似乎出在沿线某处的 IAM 设置上。是否可以从 AWS 获取有关连接尝试失败原因的更多信息?
我正在使用最新版本的 Neptune 和 3.4.3 Gremlin 驱动程序和控制台。当 运行 设置 NeptuneGremlinSigV4Example
并构建要部署到控制台的库时,我正在使用 Java 8。
谢谢
从审核日志输出看来,正在创建的 SigV4 签名正在使用 localhost
作为 Host
header。这很可能是因为您正在使用代理连接到 Neptune。默认情况下,NeptuneGremlinSigV4Example
假定您直接连接到 Neptune 端点,并在创建签名时将端点重新用作 Host
header。
要解决此问题,您可以使用以下示例代码来覆盖此过程并允许您使用代理并仍然正确地签署请求。
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
我无法连接到启用了 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 jumphost)我得到:
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 显示我创建的图形用户未成功登录(呃)。
问题似乎出在沿线某处的 IAM 设置上。是否可以从 AWS 获取有关连接尝试失败原因的更多信息?
我正在使用最新版本的 Neptune 和 3.4.3 Gremlin 驱动程序和控制台。当 运行 设置 NeptuneGremlinSigV4Example
并构建要部署到控制台的库时,我正在使用 Java 8。
谢谢
从审核日志输出看来,正在创建的 SigV4 签名正在使用 localhost
作为 Host
header。这很可能是因为您正在使用代理连接到 Neptune。默认情况下,NeptuneGremlinSigV4Example
假定您直接连接到 Neptune 端点,并在创建签名时将端点重新用作 Host
header。
要解决此问题,您可以使用以下示例代码来覆盖此过程并允许您使用代理并仍然正确地签署请求。
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