sil*_*rry 5 amazon-web-services amazon-vpc aws-lambda amazon-neptune
我创建了一个简单的 AWS Neptune 集群,带有写入器但没有读取副本。我使用该选项为其创建了一个新的 VPC,并且还为其自动创建了两个安全组。
我还有一个 Lambda 来调用 Nepture 集群的端点。我已使用 Neptune 集群的 VPC 配置 Lambda,指定其所有子网和上述两个安全组。当我从 AWS 控制台执行 VPC 配置时自动分配入站和出站规则(只需完成这些步骤)后,我就没有手动修改入站和出站规则。
Lambda 使用 Python 编写,并使用该requests库通过 AWS Singature V4 进行 HTTPS 调用。Lambda 的执行角色有NeptuneFullAccess一个内联策略,允许为 Lambda 配置 VPC(已完成,因此策略有效)。
Lambda 在端口 8182 上调用 Neptune 集群的终端节点(集群的名称和 ID 已编辑):
https://NAME.cluster-ID.us-east-1.neptune.amazonaws.com:8182
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
{
"errorMessage": "2020-05-20T21:26:35.066Z c8ee70ac-6390-48fd-a32e-36f80d58a24e Task timed out after 3.00 seconds"
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
更新:因此,Neptune 集群的第二个安全组似乎是我在创建集群时选择一个选项创建的。因此,我再次尝试使用Choose existing安全组选项,而不是Create new. (我想我之前很困惑,因为我正在创建一个全新的VPC,那么安全组怎么可能已经存在?但向导只是假设default届时将创建的安全组。)
现在,我不再遇到同样的错误。然而,我看到的是这样的:
{
"errorType": "Runtime.ExitError",
"errorMessage": "RequestId: 48e3b4fb-1b88-48d3-8834-247dbb1a4f3f Error: Runtime exited without providing a reason"
}
Run Code Online (Sandbox Code Playgroud)
日志显示了这一点:
{
"requestId": "b8b91c18-34cd-c5f6-9103-ed3357b9241e",
"code": "BadRequestException",
"detailedMessage": "Bad request."
}
Run Code Online (Sandbox Code Playgroud)
查询是(鉴于https://docs.amazonaws.cn/en_us/neptune/latest/userguide/iam-auth-connecting-python.html中描述的 Lambda 代码):
{
"host": "NAME.cluster-ID.us-east-1.neptune.amazonaws.com:8182",
"method": "GET",
"query_type": "status",
"query": ""
}
Run Code Online (Sandbox Code Playgroud)
有什么建议么?
更新:尝试另一个 Neptune 集群时,[Errno 111] Connection refused'错误再次出现。然而,我注意到一件奇怪的事情:我有一些孤立的网络接口,这些接口是从 Lambda 与现已删除的 Neptune 集群的 VPC 关联时开始的。但是,网络接口被标记为in use,我无法分离和删除它们,即使使用该Force detachment选项也是如此。收到You are not allowed to manage 'ela-attach' attachments错误。
更新:从全新的 Lambda 开始(无需重做其 VPC 配置,因此不再有孤立的网络接口)和启用并配置了 IAM Auth 的全新 Neptune 集群(甚至为调试目的而授予 Lambda 执行角色完全管理员访问权限) ,以消除任何缺失的权限),仍然收到此错误:
{
"errorMessage": "HTTPSConnectionPool(host='NAME.cluster-ID.us-east-1.neptune.amazonaws.com', port=8182): Max retries exceeded with url: /status/ (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f1f9f98c310>: Failed to establish a new connection: [Errno 111] Connection refused'))",
"errorType": "ConnectionError",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 71, in lambda_handler\n return make_signed_request(host, method, query_type, query)\n",
" File \"/var/task/lambda_function.py\", line 264, in make_signed_request\n r = requests.get(request_url, headers=headers, verify=False, params=request_parameters)\n",
" File \"/var/task/requests/api.py\", line 76, in get\n return request('get', url, params=params, **kwargs)\n",
" File \"/var/task/requests/api.py\", line 61, in request\n return session.request(method=method, url=url, **kwargs)\n",
" File \"/var/task/requests/sessions.py\", line 530, in request\n resp = self.send(prep, **send_kwargs)\n",
" File \"/var/task/requests/sessions.py\", line 643, in send\n r = adapter.send(request, **kwargs)\n",
" File \"/var/task/requests/adapters.py\", line 516, in send\n raise ConnectionError(e, request=request)\n"
]
}
Run Code Online (Sandbox Code Playgroud)
感谢 Neptune 团队的帮助(令人惊叹的回应!他们打电话给我讨论这个问题),我能够解决这个问题。
首先,当我使用新的 Neptune 集群和安全组选项以及添加到 Neptune 集群的 VPC 的全新 LambdaConnection refused重新设置后,错误就消失了。Use existing显然,在 Lambda 上重做 VPC 配置有时会留下难以删除的孤立网络接口。因此,只需在 Lambda 上进行一次 VPC 配置!
其次,此后开始出现的运行时错误是由于 AWS 提供的 Python 代码中的错误所致:https: //docs.aws.amazon.com/neptune/latest/userguide/iam-auth-connecting-python .html
也就是说,make_signed_request该脚本中的函数不返回值。它应该返回r.text,或者更好的是,json.loads(r.text). 然后,一切都很好。
| 归档时间: |
|
| 查看次数: |
2372 次 |
| 最近记录: |