やりたいこと
- API Gateway + Lambdaの構成で、200以外のHTTPステータスコードを返却する。
LambdaってHTTPステータス返せないし、どうするんだろうってことでやってみました。
うまくいったやり方
以下の2つを定義すればOKです。
- 「Method Response」で返したいHTTPステータスコードを定義する。[^1]
- 「Integration Response」でHTTPステータスコードを返す条件を定義する。
実際の手順
-
「Method Execution」の「Method Response」で「Add Response」をクリック。
-
「Integration Response」の「Add integration response」を開く。
-
「Lambda Error Regex」にこのステータスコードを返却する条件となる正規表現を入力。
「Lambda Error Regex」の項目はLambdaからthrowされたExceptionのmessageの内容を参照しています。
なのでLambdaからExceptionをthrowするときにmessageに何か目印を埋め込む必要があります。
僕の場合はExceptionのwrapperを作成して、messageの先頭にステータスコードを入れるようにしました。
こんな感じでmessageの先頭にステータスコードをくっつけています。
private HttpStatusCode httpStatusCode;
public ApiGatewayException(Throwable t, HttpStatusCode httpStatusCode, String message) {
super(t);
this.message = message;
this.httpStatusCode = httpStatusCode;
}
@Override
public String getMessage() {
return httpStatusCode.getCode() + ": " + this.message;
}
これでstageにデプロイしてAPIを叩くと設定したステータスコードが返ってきます。
ちなみにエラーは以下の形で帰ってくるので、Modelを作成し、「Integration Response」の「Mapping Templates」でマッピングすれば任意のフォーマットで返すことも可能です。
{
"errorMessage":"[メッセージ]",
"errorType":"[Exceptionの型]",
"stackTrace":[StackTrace文字列の配列]
}