AWS ALB->Lambda 502

AWS ALB->Lambda 502

いろいろ調べてみましたが、これについてはあまり見つかりませんでした。ALB のドキュメント/デバッグはかなり貧弱なようです...

理由はわかりませんが、ALB から 502 が返されます。Lambda ターゲットを持つ ALB があります。Lambda はこれを ALB に送信します:

{\n statusCode: 200,\n body: 'Root...',\n multiValueHeaders: {\n
'x-powered-by': [ 'Express' ],\n 'access-control-allow-origin': [ '*' ],\n 'content-type': [ 'text/html; charset=utf-8' ],\n
'content-length': [ '7' ],\n etag: [ 'W/"7-bEyWHAj7Nx3j68RN5+dEhPIpvp0"' ]\n },\n isBase64Encoded: false,\n statusDescription: '200 OK'\n}`

Cloudwatch ログに次の内容が表示されます。

h2 2021-01-10T18:48:47.956319Z app/api-dev/955d2b8cbf36b4d0 73.231.54.75:32892 - 0.005 0.029 0.000 502 - 19 594 "GEThttps://api.dev.co:443/docsHTTP/2.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/87.0.4280.88 Safari/537.36" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-west-2:025080367422:targetgroup/api-dev/106c350fe23bff29 "Root=1-5ffb4c0f-103216757067a60b58ecf857" "api.dev.co" "arn:aws:acm:us-west-2:025080367422:certificate/0a6623b2-85e8-4d31-889e-9cc0354d74ec" 0 2021-01-10T18:48:47.921000Z "転送" "-" "LambdaUnhandled" "-" "-" "-" "-"

私の知る限り、私は正しい応答を送信していますよね?


以下のコメントによると、'text/html' を返すエンドポイントでは失敗します。また、'application/json' を返すエンドポイントは機能しますが、次のコードは失敗します。

{\n statusCode: 200,\n body: 'AAABAAEAIB4AA[...]//8=',\n multiValueHeaders: {\n 'x-powered-by': [ 'Express' ],\n
'access-control-allow-origin': [ '*' ],\n 'accept-ranges': [ 'bytes' ],\n 'cache-control': [ 'public, max-age=0' ],\n
'last-modified': [ 'Sun, 10 Jan 2021 18:57:00 GMT' ],\n etag: [ 'W/"fb6-176eda8a060"' ],\n 'content-type': [ 'image/x-icon' ],\n
'content-length': [ 4022 ]\n },\n isBase64Encoded: true、\n statusDescription: '200 OK'\n}

答え1

応答は JSON 形式である必要がありますか? その場合は、すべての属性名を二重引用符で囲む必要があります。つまり、...

{ statusCode: 200, body: 'Root...', ... }

そのはず:

{ "statusCode": 200, "body": "Root...", ... }

答え2

返されるペイロードが 1 MB を超える可能性がありますか? 「ターゲットは Lambda 関数であり、レスポンス本文が 1 MB を超えています。」 ->https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html

答え3

わかりました。修正しました。この質問を投稿したときに、どこにいたのかはわかりませんが、HTTP ヘッダーが悪かったことが原因でした。実際には、許可されていない (悪かったわけではない) ヘッダーのようでした。結局、serverless-express を破棄して、次のように単純化しました。

https://gist.github.com/alsonkemp/cd133900bbc664095ee852cd20a5e9f5

これに関するドキュメントは見つかりませんでした...

考えるそれを壊したのは「accept-ranges」ヘッダーでした。

関連情報