[AWS] Lambda + API Gatewayでサーバレスを始める ２

[その１](http://qiita.com/naoki_koreeda/items/c2a32198c86e8d9a5bb6)に引き続き、自分で決めたステータスコードを返却する設定を行います。

単純に Lambda からのコールバックを API Gateway で受け取ってレスポンス返すと、ステータスコードは200しか返ってきません。

```js
callback(null, {"error": "404"}); // 200 {"error": "404"}

callback("404"); // 200 {"errorMessage": "404"}
```

これを解決するには、 Lambda のコールバックの変更と、 API Gateway の設定が必要です。

* Lambda のコールバックでエラーを特定の形式で返す
* API Gateway で受け取ったエラー内容を正規表現でハンドリング
* API Gateway で設定したステータスコードに割り振って返却

# Lambda のコールバック
クエリパラメータから「name」が取得できなければ400エラーを返すようにしてみます。
ちなみにcallbackの第一引数は文字列である必要があるため、JSON.stringify()で文字列にして返します。
**（2019/02/05 追記）**
*コメントをいただきました。標準的にはErrorオブジェクトを返すみたいです。*
*JSON.stringify()でカスタムエラーを返す方法もあるみたいですが、ここに書いているやり方は公式と形式が違うようです。*
*いつか書き直すかもしれませんが、それまではコメントでいただいているリンク先をご確認ください。*

```js
'use strict';

const createErrorResponse = (status, message) => {
    return {
        "status": status,
        "message": message
    };
};

exports.handler = (event, context, callback) => {
    // パスパラメータからnameを取得
    let name = event.name;
    if (!name) {
        // 取得できなければエラーにする
        const response = createErrorResponse(400, 'Bad Request.');
        callback(JSON.stringify(response));
        return;
    }
    callback(null, {"name": name});
};
```

# API Gateway の設定
#### メソッドレスポンスの設定
メソッドレスポンスに使用するステータスコードを設定します。
<img width="980" alt="スクリーンショット 2017-07-04 10.59.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/ab2abcea-2176-c4be-d8e7-e14623ee3bd2.png">

レスポンスの追加 > 400 と入力 > チェックマークボタンで確定
<img width="979" alt="スクリーンショット 2017-07-04 11.01.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/14374800-4fe1-1ccb-6b2d-d0430f3a4a16.png">

他にも使用するステータスコード（404とか500とか）があればここで設定しておきます。

#### 統合レスポンスの設定
次に統合レスポンスでマッピングの設定をします。
<img width="971" alt="スクリーンショット 2017-07-04 11.06.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/0f48a798-5b18-6e15-2309-b92695f9461a.png">

「統合レスポンスの追加」をクリック。
以下のように入力し、保存します。

* Lambda エラーの正規表現 ： .\*"status" *: *400.\*
* メソッドレスポンスのステータス ： 400
* コンテンツの処理 ： パススルー

<img width="978" alt="スクリーンショット 2017-07-04 11.11.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/fc74269e-f216-38fc-9e0c-33f27c658549.png">

本文マッピングテンプレートを追加します。
マッピングテンプレートの追加をクリックし、「application/json」と入力してチェックマーククリックで確定。
<img width="982" alt="スクリーンショット 2017-07-04 11.20.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/fe8d2b8e-d86b-de0c-ad84-65f2d0861613.png">

マッピング入力欄が表示されるので、以下のように記述して保存。
<img width="982" alt="スクリーンショット 2017-07-04 11.22.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/e68167bf-e2fe-deae-3051-4a08ab5950bb.png">

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

# 確認
テストを実行し、期待しているステータスコードが返ってくるか確認してください。
<img width="981" alt="スクリーンショット 2017-07-04 11.13.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/b8f8ddfd-1ed2-4e4e-dce6-bab76cf368fd.png">

<img width="968" alt="スクリーンショット 2017-07-04 11.27.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/97a20968-55a2-af5d-d82e-7ff595ac20e8.png">



# CORS の設定
CORSの設定が必要な場合、レスポンスヘッダにも設定します。

#### メソッドレスポンスの設定
<img width="980" alt="スクリーンショット 2017-07-04 10.59.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/5039bed5-0726-1730-32b9-388dcc38d084.png">

以下のように、レスポンスヘッダーを追加します。
ヘッダーの追加 > 「Access-Control-Allow-Origin」を入力 > チェックマーククリックで保存
<img width="980" alt="スクリーンショット 2017-07-04 11.32.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/fa1a8eaa-2cb0-da34-7b1c-a48fba4ca52b.png">

#### 統合レスポンスの設定
<img width="971" alt="スクリーンショット 2017-07-04 11.06.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/8814ad70-ee4d-9402-dc73-2f50e0afae3f.png">

ヘッダーのマッピングに、上記で設定したレスポンスヘッダーが追加されているので、「マッピングの値」を入力し、チェックマーククリックで保存
（ここでは「'*'」を入力しています。）
<img width="982" alt="スクリーンショット 2017-07-04 11.36.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/92538/186204bc-4751-5311-d66d-b1c86b6c3852.png">

設定が完了したら、APIのデプロイを忘れずに実行してください。