API Gateway リクエストをモデル(VTL)でバリデーションチェック

四角ズボン
2024-12-09
2024-12-09

AWS の API Gateway のリクエストをモデルを使ってバリデーションチェックしてみました。

今回は以下のフローを想定しています。

  1. API Gateway に「リクエストA」を送信
  2. 1のレスポンスに含まれるAPI GatewayのリクエストIDを保持
  3. API Gatewayに「リクエストB」を送信(この時、2で保持したリクエストIDをリクエスト本文にセット)
  4. 3のパラメータのバリデーションチェック

API Gatewayは基本的なリクエスト検証を行ってくれます。

  • 受信リクエストの URI、クエリ文字列、ヘッダーに必要なリクエストパラメータが含まれており、空白ではない。
  • 該当するリクエストペイロードが、メソッドの設定済みの JSON スキーマリクエストに準拠している。

今回は上記以外に、リクエスト本文に含まれるリクエストIDのフォーマットをチェックしたいです。
リクエストIDは「英数字8文字-英数字4文字-英数字4文字-英数字4文字-英数字12文字」で構成されているので、このパターンにマッチしない場合はエラーとしてはじきます。
そこで使用したのがモデルです。

モデルではVTL(Apache Velocity Template Language)を使用できますので、VTLの正規表現を用いて、パターンチェックを行いました。
VTLについては本家サイトのリファレンスが参考になります。
https://velocity.apache.org/engine/2.0/vtl-reference.html

▼モデルの記載内容

{
    "type": "object",
    "required": ["request_id"],
    "properties": {
        "request_id": {
            "type": "string",
            "pattern": "\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}"
        }
    }
}

正規表現以外にも、列挙型(enum)を使用すると列挙型に指定した値のみが有効になります。

{
    "type": "object",
    "required": ["request_id"],
    "properties": {
        "request_id": {
            "type": "string",
            "enum": [ "000", "111", "222" ]
        }
    }
}

1点、注意が必要なのが、リクエストメソッドです。
モデルはリクエスト本文でしか使用できないため、基本的にPOSTメソッドリクエストでしか使用できません。

モデルに従わないリクエストが来た時に、API Gateway の時点でエラーを返せるので、
バックエンドのエラー処理が不要になる分、バックエンドの負荷も軽減することができそうです。