私はライターとリードレプリカなしでシンプルなAWS Neptuneクラスターを作成しました。このオプションを使用して新しいVPCを作成し、2つのセキュリティグループも自動的に作成されました。
Neptureクラスターのエンドポイントを呼び出すLambdaもあります。 LapdaにNeptuneクラスターのVPCを構成し、そのサブネットと上記の2つのセキュリティグループをすべて指定しました。 AWSコンソールからVPC構成を実行するときに(手順を実行するだけで)自動的に割り当てられた受信ルールと送信ルールを手動で変更していません。
LambdaはPythonで記述され、requests
ライブラリを使用してAWS Singature V4でHTTPS呼び出しを行います。Lambdaの実行ロールにはNeptuneFullAccess
とLambdaのVPCの構成を許可するインラインポリシー(これは、ポリシーが機能するように行われたものです)。
Lambdaは、ポート8182でクラスターの名前とIDを編集して、Neptuneクラスターのエンドポイントを呼び出します。
https://NAME.cluster-ID.us-east-1.Neptune.amazonaws.com:8182
次のエラーが発生します。
{
"errorMessage": "2020-05-20T21:26:35.066Z c8ee70ac-6390-48fd-a32e-36f80d58a24e Task timed out after 3.00 seconds"
}
何が悪いのですか?
更新:つまり、Neptuneクラスターの2番目のセキュリティグループは、クラスターの作成時にオプションを選択することによって作成されたようです。そのため、Choose existing
ではなく、セキュリティグループのCreate new
オプションを使用して再試行しました。 (まったく新しいVPCを作成していたため、以前は混乱していたと思います。セキュリティグループがすでに存在している可能性はありますか?しかし、ウィザードは、それまでに作成されるdefault
セキュリティグループを前提としています。)
これで、同じエラーは発生しなくなりました。しかし、私が見るのはこれです:
{
"errorType": "Runtime.ExitError",
"errorMessage": "RequestId: 48e3b4fb-1b88-48d3-8834-247dbb1a4f3f Error: Runtime exited without providing a reason"
}
ログはこれを示しています:
{
"requestId": "b8b91c18-34cd-c5f6-9103-ed3357b9241e",
"code": "BadRequestException",
"detailedMessage": "Bad request."
}
クエリは( 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": ""
}
助言がありますか?
更新:別の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"
]
}
あなたのエラーメッセージから:
3.00秒後にタスクがタイムアウトしました
現在の3秒の設定では競争を成功させるには不十分であるため、ラムダ実行 timeout を増やす必要があります。
Lambdaが関数を停止するまでに実行を許可する時間。デフォルトは3秒です。最大許容値は900秒です。
関数が設定されたタイムアウトを超えて実行される場合、ラムダサービスは、指定されたタイムアウトしきい値を超えて実行されているため、終了します。
補足として:
Vpcでラムダを使用するため、ラムダ関数にはパブリックIPもインターネットアクセスもできないことを覚えておく必要があります。関数のタイムアウトを増やしても、dbに接続できない場合があります。 プライベートサブネットでラムダ関数を実行し、NATゲートウェイまたはNATインスタンスが正しく設定されています。