何も気にせずAWS Lambda + API GatewayでAPIを作成していたところ、
「タイムアウト発生時でもstatus code 200返ってきちゃうんすけど」
ということで慌てて対応。
その前にタイムアウトについて
API Gatewayが発生させるタイムアウトと、Lambdaが発生させるタイムアウトの2種類が存在します。
前者は自動的に504(Gateway Timeout)を返してくれるので問題ありません(Swaggerの定義ファイル上に記載すべきか迷いますが、、、ちなみに2016/9/27時点では、管理コンソールからのこのタイムアウトを発生させると504が発生したかどうか、結果が見えないのでデプロイしたURLからお試しください)。
さて、では後者は?
AWS Lambdaのタイムアウト対応
これは、API Gatewayの統合レスポンスに定義しておく必要があります。
エラーメッセージに対する正規表現で記載できるので、
.*Task timed out after.*
みたいな記載でメソッドレスポンスに定義したステータスコードと紐付ければうまく動きます。
ただ、ソースコード上からも「これは500で返したい」的な要望はあるので、その場合、私は例外メッセージの接頭辞に「INTERNAL SERVER ERROR」と付与する例外クラスを作って、統合リクエストの正規表現には
INT.*|.*Task timed out after.*
と記載したりしています。
正しいやり方なのかよくわかりませんが(オイ)、取りあえず上手く動いています!