AWS API GatewayとLambda 関数 URL(とChatGPT)

AWS Lambdaにデプロイした関数を外部からHTTPリクエストでトリガーしたいときどうすればいいのか、ChatGPTに聞いてみた。

API Gatewayを使うのがいいらしい

AWSの公式ドキュメントにもAPI Gatewayを使用してLambdaのエンドポイントを得る方法が書かれている。

docs.aws.amazon.com

Lambdaの使い方について書かれたインターネットの記事にもAPI Gatewayを使ってエンドポイントを発行する方法を紹介しているものが多くある。しかし、実はこの方法は必ずしもベストプラクティスとは限らない。そのことについてのメモのようなもの。

Lambdaのタイムアウトについて

AWS Lambdaではデプロイした関数にタイムアウトを設定することができ、これは最大で15分まで拡張できる。 しかし、API Gatewayの方にもタイムアウト時間の設定があり、こちらの最大値は29秒である。

つまり、15分以内に処理が終わる関数であればLambda上で実行できるはずなのに、API Gatewayが30秒時点でタイムアウトを返してしまうため時間をフルに使えないといった現象が起こる。 この現象についてChatGPTに質問すると、AWS Step Functionsを使ってLambda関数を非同期に実行し、クライアントが定期的に問い合わせをしながら完了を待つという構成を提案される。 GhatGPTではなくGoogleで検索しても同様の方法を紹介した記事が複数Hitする。 しかし、API Gatewayタイムアウト制限を回避するためだけにこんなに煩雑なことをしないといけないとは面倒だ。

Lambda関数URLについて

実はLambda関数URLという機能を使えばLambdaから直接エンドポイントを発行できるため、そもそもAPI Gatewayを通すことなくLambda関数を外部からトリガーすることができる。 よって、Step Functionsなどを用いた複雑な構成を用いずとも15分をフルに使うことができる。 認証周りの設定などAPI Gatewayに劣る部分もあるが、こちらで充分な場合も多い。

ではなぜChatGPTがAPI Gatewayを用いた方法を提案してくるかというと、単純にLambda関数URLが2022年4月にリリースされた新しい機能だからである。 GPT-4は2021年9月までのデータを用いて学習しているため、ChatGPTはLambda関数URLの存在をそもそも知らず、古い情報に基づいて当時のベストプラクティスを提案してきていたということになる。 しかしこれはこれで正しい方法ではあるので、教えてもらったとおりに検索するとたくさんの記事(これらの多くは古い記事)がHitする。

古い情報には気をつけよう

普段ChatGPTに何かを質問するときにはハルシネーションを見抜くことに多くの注意を払っているため、教えられたことが事実であると確認できれば安心してしまい、その時点で情報を鵜呑みにしてしまう傾向にある気がした。 質問したことが不変の事実であれば問題ないが、エンジニアリングに関することなど時間とともに変化する可能性のあることを質問するときには注意しないといけないなと思った(小並感)