LambdaのFunction URLsを使って特定のヘッダを返すと500エラーになる
なにが起きる?
Lambda Function URLs を使ってx-amzn-remapped-connection
などのx-amzn-remapped-
が付いているヘッダをレスポンスに含めると500 Internal Server Errorになる。
確認したこと
- Function URLsを使っている場合のみエラーになる
- API Gateway経由で動かした場合はエラーにならない
- Lambda自体はエラーを返していない
- AWS X-Rayにもエラーは記録されない
- x-amzn-remapped-connection ヘッダを付けてレスポンスを返すとエラーになる
- x-amzn-remapped-content-length を付けてもエラーになる
- x-amzn-hoge ヘッダはエラーにならない
なにが原因?
おそらくFunction URLsの内部でAPI Gatewayと同じような動作をする物がいて、そこの処理が甘い。
API Gatewayはconnection
などの特定ヘッダを返すと、X-Amzn-Remapped-
を付けて置き換えられる機能があるのでおそらく同じような機能がFunction URLsにもあり、クライアントが直接返してくることを想定していなさそう。
どういうときに起こるの?
x-amzn-remapped-connection
なんてヘッダーは普通は付けない。どういうときに起こるのか?
実はNext.js v14.1.0をLambda Web Adaptorで動かしたとき、Server Actionsでredirectをすると簡単に再現することができた。v14.1.2ではエラーを引き起こす挙動が変更され再現しなくなっている。
redirectのドキュメントには記載がない挙動として、リダイレクトする前にリダイレクト先のページを先読みして、リダイレクトのレスポンスに含めてしまう仕様がある。先読みしたときに付いていたヘッダをそのまま返すのが仕様になっており、このときFunction URLsを通ってしまうので、付いていたconnection
ヘッダはx-amzn-remapped-connection
に置き換えられてレスポンスが返ってしまい上記のエラーになる。
redirectのときに先読みをするのはレスポンス高速化のためだと思われるが、v14.1.1まではサーバー内部で完結せず、CDNを通ってしまう仕様で効率が良くなかったため、v14.1.2でこの挙動が修正され、x-amzn-remapped-connection
に置き換えられることがなくなったためNext.jsでは再現しなくなった。
バグ報告しないの?
こんなどうでもいいバグ報告するのに$29.00払うのはちょっと...
v14.1.1の扱い変じゃない?
v14.1.1は普通にバグってリダイレクトするだけでNex.tjsがエラー吐いたのでノーカン