[アップデート] Amazon API Gateway の統合タイムアウトを 29 秒より長く設定出来るようになったので、申請から設定までやってみた

2024.06.16

いわさです。

みなさま Amazon API Gateway は使ってますか。
オーソライザーやスロットリング、使用量プランが使えるので個人的に最高なサービスだと思っているのですが、それでも採用を見送らざるを得ないケースがよくあります。
特に「約 30 秒の最大タイムアウト」と「10 MB の最大ペイロードサイズ制限」この2つが原因で採用できずに ALB とかに倒されるケースが多いです。

先日のアップデートでなんと一部のタイプの API でタイムアウト上限が緩和出来るようになりました。

次の公式ドキュメントにも各クォータの上限が記載されていますが、抜粋すると以下です。

  • HTTP API はタイムアウト 30 秒のまま
  • WebSocket API も据え置きで 50 ミリ秒 ~ 29 秒のまま
  • REST API が上限緩和申請出来るようになった
    • デフォルトは WebSocket と同じで従来どおりの 50 ミリ秒 ~ 29 秒
    • リージョンとプライベートの場合は上限緩和申請が可能

アナウンスされてすぐに上限緩和申請をしていたのですが、昨晩ついに制限緩和されたので実際に試してみました。

上限緩和申請の様子

上限緩和の方法ですが、マネジメントコンソール上で Service Quotas から申請を行うことができます。

Amazon API Gateway の「Maximum integration timeout in milliseconds」というのが対象です。
調整可能性プロパティが「アカウントレベル」になっていますね。

対象クォータ項目を選択し、「アカウントレベルでの引き上げをリクエスト」を押します。

そうすると、どの程度まで引き上げるか入力することが可能です。
今回はデフォルトの 29,000 を約 2 倍の 60,000 に変更して申請してみました。

上記ダイアログの下部に記載されていますが、増減リクエストが大きいほど承認されにくくなります。
また、申請した数値で必ずしも緩和されるとは限りません。
AWS サポートチームの判断で申請よりも小さな数値で緩和されたり、あるいは逆に大きくなることもあります(過去に私はあった)

今回は、上記申請からしばらく経過すると、サポート経由でクォータ引き上げの背景というかユースケースを問われました。
小さな増減の場合はそのまま自動承認されることもあるので 60,000 にしてみたのですがダメだった。

AWS サポート機能を使ってユースケースを送信します。
その後数日して昨晩ついに緩和 OK の連絡が来ました。

申請日が 6 月 5 日で、緩和されたのが 6 月 15 日だったので、10 日くらいかかりました。
アップデート直後ということもあってリクエストが多かったのかもしれませんね。上記日数は今回の実績値なので参考までに。

API Gateway からタイムアウトを設定して使ってみよう

では早速タイムアウト緩和の恩恵を確認してみたいと思います。
30 秒以上実行される Lambda 関数あたりを統合してやるのが良いですかね。

Lambda 関数の実行時間を調整し、40 秒のスリープ後にレスポンスを送信する関数を作成しました。

API Gateway から REST API を新規作成しました。
適当なリソースパスに対してメソッドを作成しましょう。

統合タイプを Lambda 関数にして先ほど作成した関数を指定します。
この統合構成を行うところで、ありました。タイムアウト設定です。
デフォルトタイムアウトが ON になっており、29 秒だと表記されています。

こいつを OFF にしてやるとカスタムタイムアウトが設定できます。
でもラベルがあれですね。「タイムアウトは 50~29,000 ミリ秒の間である必要があります」と表記されています。
嫌な予感がする。

試しに上限緩和した数値よりも大きなタイムアウト時間を入力して登録してみます。
すると登録ができずに次のようなメッセージが表示されました。

あー、これは良さそうですね!
最大 60,000 ms で指定しろと、上限緩和した数値が反映されてますよ。

デフォルト以上かつ上限に収まるようにここでは 50,000 ms を指定しておきます。

登録することができました。
統合リクエストを確認してみると 50,000 ミリ秒と表記されています。良さそうですね。

ステージへデプロイし、API にリクエストを送信してみます。

% curl https://qlrzcu9z0i.execute-api.ap-northeast-1.amazonaws.com/hoge
"Hello from Lambda!"

40 秒後レスポンスを取得することができました。やったー。

Edge エンドポイントタイプで試したが

冒頭対象の API について触れましたが、リージョンとプライベートが対象ということでエッジが含まれていませんね。
エッジも試してみましょう。

次のように先ほどのタイムアウト確認ができたリージョン API のエンドポイントタイプを Edge に変更しました。

メソッドの統合リクエストを確認してみると、50,000 ミリ秒のままです。
これはもしかしていけるかも...?

ステージデプロイ後に同じようにリクエストを送信してみます。

% curl https://qlrzcu9z0i.execute-api.ap-northeast-1.amazonaws.com/hoge
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>504 ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
CloudFront attempted to establish a connection with the origin, but either the attempt failed or the origin closed the connection.
We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
<BR clear="all">
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: zGZoh4_7A7HyIT-SYHK7WAuuhrIq2VVuTemj0sHcPb1UGIUvt70J-g==
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>

ダメでした。なんか API Gateway ではなくて前段の CloudFront がエラーをレスポンスしていますね。
エッジエンドポイントタイプの場合は API Gateway マネージドな CloudFront ディストリビューションが前段に配置されるイメージなのですが、そこのレスポンスタイムアウトがデフォルトの 30 秒から変更されていないようです。

CloudFront はオリジンに対するレスポンスタイムアウトの概念があり、デフォルトは 30 秒となっています。
次の記事が参考となりますが、デフォルトは 30 秒であり、ユーザーマネージドの場合は 1 ~ 60 秒で調整が可能でさらに上限緩和申請で 60 秒以上も可能とのこと。

推測ですが、おそらく上記と同じな気がします。
エッジ配信したい場合は独自で CloudFront を作成して API Gateway(REST)をオリジンにする形になりそうですね。

上限緩和なしのアカウントだと

これは確認するまでも無いですが、そもそも従来の挙動も確認しておきましょう。
上限緩和を行っていないアカウントで 40 秒の Lambda 関数に対して REST API を構成してみます。

Lambda 関数自体は次のように実行可能です。

タイムアウトがデフォルトの 29 秒になってしまいますね、やはり。

実行するとタイムアウトを示すレスポンスが取得されました。これが従来の動作ですね。

% curl https://0i614oh8qk.execute-api.ap-northeast-1.amazonaws.com/hoge
{"message": "Endpoint request timed out"}

さいごに

本日は Amazon API Gateway の統合タイムアウトを 29 秒より長く設定出来るようになったので、申請から設定までやってみました。

ついに上限緩和出来るようになったか。最高ですね。
アナウンスにユースケースが紹介されていましたが、生成 AI を活用するユースケースだとバックエンドのレスポンス生成に 29 秒以上必要とするケースが増えてきたみたいですね。

「10 MB の最大ペイロードサイズ制限」も出来ればお願いします、どうか。
S3 で配信出来ない時もあるんですよね。