【AWS】API Gatewayでカスタムなステータスコードを返す方法

ふと、API Gatewayで指定したステータスコード(404とか500とか)を返したいと思い、色々な記事を見ていたのですが、どうにも上手く行かない。

例えば、Lambdaで404のステータスコードを返す関数を作成し、API Gatewayでアタッチしたとします。

```js
exports.handler = async (event, context, callback) => {
    const myErrorObj = {
        errorType : "Page not found",
        httpStatus : 404,
    }
    return callback(JSON.stringify(myErrorObj));
    // リクエストをしても200が返ってくる
};
```

これで404のステータスを渡せるんじゃないの？と思う方も多いと思います。

ただ、これを実際にリクエストすると、200のステータスコードが返ってきます。

なんとも不気味ですね。

しかも厄介。

恐らくこの辺の設定は全て自分で行わなければいけないらしいです。

なので、API Gatewayで設定を行って、カスタムなステータスコードを返せるようにしましょう！

# はじめに

先ほども書いたのですが、エラーのレスポンスは以下のようにして返します。

```js
    const myErrorObj = {
        errorType : "Page not found",
        httpStatus : 404,
    }
    return callback(JSON.stringify(myErrorObj));
```

ただ、今はどうやらこの形式は推奨されていないようです。

公式ドキュメントのリンクを載せますので、気になる方はこちらのドキュメントに従って作成して下さい。

・[API Gateway で Lambda エラーを処理する](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/handle-errors-in-lambda-integration.html)

また、API GatewayとLambda関数の紐づけ方法は、下記の記事でご紹介しているので、Lambda関数へのアタッチ方法が分からない方はこちらをご覧ください。

[【AWS初心者でも分かりやすい】Lambdaで作成した関数をAPI Gatewayでアタッチする方法
](https://qiita.com/akki-memo/items/3c960ecae50eb9ad0faa)

今回、こちらの説明は致しませんのでご了承ください。

# API Gatewayの設定

そしたら、カスタムなステータスコードを受け取るために、API Gatewayで設定を行っていきます。

まず、API Gatewayの[コンソール画面](https://ap-northeast-1.console.aws.amazon.com/apigateway/main/apis?region=ap-northeast-1)を開いてください。

## メソッドレスポンス

次に使用するAPIの設定画面に行きます。

このようなパスが表示されていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/da2cd183-bc1a-8222-f202-ae1a6a0ab320.png)

そしたらカスタムなステータスコードを返したいパス、およびメソッドを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/c1444fd8-9800-a08c-23c3-7e55dbe5b019.png)

メソッドレスポンスの設定画面へ行き、下の画像のようにステータスコードとヘッダーを追加してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/8ab04fa9-a631-d121-fc2e-e15bd475c876.png)

ステータスはご自身の用途に合わせて変えて下さい。今回は404とします。

ヘッダーは``Access-Control-Allow-Origin``を入力。

これだけでは、カスタムなステータスコードは返せないのでご注意ください。

メソッドレスポンスの設定は以上になります。

## 総合レスポンス

次に、先ほど作成したメソッドレスポンスがしっかりと反応するように、総合レスポンスで設定を行っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/9b5da009-0874-6093-88b4-7158a8fb8dd5.png)

総合レスポンスの設定画面へ。

そしたら、まずは下の画像のように**Lambdaエラーの正規表現**に、``.*"httpStatus" *: *404.*``を追加。ステータスコードの``404``は、ご自身の用途に合わせ適時変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/c3732ca6-345a-5d93-2a02-23daf8d609b8.png)

これは、冒頭で説明したエラーオブジェクトのKey(``httpStatus``)を基準に判断を行っています。また、Valueが404のときにステータスコード404を返すようにしています。

次は、ヘッダーの設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/3e69d2f7-cfdb-142e-2b17-22a4dff6c805.png)

特定のドメインとしか通信を行いたくない場合は、そのURLをご入力ください。

最後にマッピングテンプレートの設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/b0e4f164-1136-ad02-4f23-74b287630764.png)

このように``Content-type``に``application/json``と設定。

テンプレートは以下をコピペ。

```
#set($errorObj = $util.parseJson($input.path('$.errorMessage')))
{
    "message" : "$errorObj.errorType",
    "statusCode": 404
}
```

あとは保存を忘れずに。

## テスト

メソッドの設定画面から、画像の上の方にあるテストをししてみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/8b5c8f07-10a4-f234-06bc-30cd0c12f68c.png)

指定したステータスコードが返ってくればOKです！

APIのデプロイも忘れずに！！！

このようにしてカスタムなステータスコードを返すことができます！

意外と時間が掛かったので、次からは時間を掛けずにやります。。。

以上、「【AWS】API Gatewayでカスタムなステータスコードを返す方法」でした！

Thank you for reading