web-dev-qa-db-ja.com

LambdaからNeptuneへの接続の問題

私はライターとリードレプリカなしでシンプルな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
silverberry

あなたのエラーメッセージから:

3.00秒後にタスクがタイムアウトしました

現在の3秒の設定では競争を成功させるには不十分であるため、ラムダ実行 timeout を増やす必要があります。

Lambdaが関数を停止するまでに実行を許可する時間。デフォルトは3秒です。最大許容値は900秒です。

関数が設定されたタイムアウトを超えて実行される場合、ラムダサービスは、指定されたタイムアウトしきい値を超えて実行されているため、終了します。

補足として:

Vpcでラムダを使用するため、ラムダ関数にはパブリックIPインターネットアクセスもできないことを覚えておく必要があります。関数のタイムアウトを増やしても、dbに接続できない場合があります。 プライベートサブネットでラムダ関数を実行し、NATゲートウェイまたはNATインスタンスが正しく設定されています。

0
Marcin