AWS の API Gateway のリクエストをモデルを使ってバリデーションチェックしてみました。
今回は以下のフローを想定しています。
- API Gateway に「リクエストA」を送信
- 1のレスポンスに含まれるAPI GatewayのリクエストIDを保持
- API Gatewayに「リクエストB」を送信(この時、2で保持したリクエストIDをリクエスト本文にセット)
- 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}"
}
}
}
"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" ]
}
}
}
"type": "object",
"required": ["request_id"],
"properties": {
"request_id": {
"type": "string",
"enum": [ "000", "111", "222" ]
}
}
}
1点、注意が必要なのが、リクエストメソッドです。
モデルはリクエスト本文でしか使用できないため、基本的にPOSTメソッドリクエストでしか使用できません。
モデルに従わないリクエストが来た時に、API Gateway の時点でエラーを返せるので、
バックエンドのエラー処理が不要になる分、バックエンドの負荷も軽減することができそうです。