AWSのAPI Gatewayを触っていて、若干混乱してきたので、簡単ではあるけれどまとめる
API Gateway が対応しているAPIのタイプとしては下記の4種類 ・HTTP API ・WebScoket API ・REST API ・REST API (プライベート)
GCPで提供しているAPI GatewayプロダクトであるApigeeでは、WebScoketに対しての対応が正直いまいちなので、そういう意味ではWebScoketを試してみたいが、WebScoketクライアント用意したりするのも面倒なので、ここでは通常のREST APIを題材とする
まずは、APIの集合体に対しての名前付けとプロトコルの選択をする。 REST APIを選択したはずなのに、WebScoketが選択肢として残っているのは意味があるのだろうかと疑問を感じるが、気にしない。 ちなみにエンドポイントタイプのデフォルトは”リージョン”。エッジ最適化を選択すると、CloudFrontが用いられる形のグローバル利用を想定したAPIになる。
ここでは、GithubAPIを例にして作ってみることにする
初期状態ではAPIのRootが存在するだけ。ここからリソースやメソッドを追加していく。まずはGistのAPIを作ってみようと思うので、リソースの追加でGist。メソッドとしてGetを追加してみる。
GETメソッドを追加すると上記のセットアップ画面に。 「統合タイプ」という日本語がどうなのか?という気がするが、呼び出しとして何を利用するのかを選択することができる。 多くのAPI GatewayチュートリアルではLambdaを呼び出すつくりになっている。 既存のAPIをEC2や別途提供しており、それを呼び出す形であればHTTPになる。
試しに、GithubAPIを直接呼び出してみる ・統合タイプを「HTTP」 ・HTTPメソッドを「GET」 ・エンドポイントURLを「https://api.github.com/gists」 にする
メソッドを作成するとこのような画面になる
ブロックが大きく分けて4つ。
メソッドリクエスト クライアントから見た時のこのAPIの呼び出し仕様の定義 統合リクエスト 統合先(最終的な呼び先、ターゲット)をどう呼ぶのか 統合レスポンス 統合先からのレスポンスをどう処理するかを定義。 基本的にはそのままだと思う メソッドレスポンス クライアントに返すレスポンスの定義
“テスト”をクリックし、実際にメソッドを走らせてみると、レスポンスとしてGithub.comから結果を受け取れていることが確認できる。
これでメソッドとしては作ることができたのだが、本家のAPI ではいくつかのQueryParameterを受け取ることができる。せっかくなのでこれも実装する
「メソッドリクエスト」にて「URLクエリ文字列パラメータ」を追加する。本来はどれも任意のパラメータだが、試しにpageとper_pageを必須にしてみる
見ると、統合リクエスト側にも自動的に追加されていた
クエリパラメータを指定せずにテストをしてみると、エラーに・・・ならない。 よく見ると、メソッドリクエストに黄色△マークが出ている。
結論からいうと、デフォルトでは値の検証機能はなぜかOFFになっていて、明示的に指定する必要があった。 「設定」欄にある「リクエストの検証」を選択する
それにしても、UIが鉛筆マークがついているとはいえ、何が設定値なのかの判別が難しすぎる。非常にわかりづらいと思うのは私だけであろうか。
これで実行すると、期待通り400エラーとなってくれ、パラメータを指定することで結果が正しい形で取得出来ていることが確認できる。
次にsinceパラメータを試してみる。 ちょっと意地悪で、日付書式不足を設定してみると
書式のバリデータに引っかかったようで、レスポンス本文にエラーが出ている。 ただ、ステータスコードは200となってしまっている。 ログを見ているとわかるのだが、実際のところGithubからは422が返却されている。
これは、API Gatewayの設定で「メソッドレスポンス」と「統合レスポンス」を正しく設定していないことに起因する。 デフォルトでは、すべてのレスポンスがステータスコード200で返却するようになっているのだ。
とりあえず、ありえそうなメソッドレスポンスを定義して
統合から何が返ってきたときにどのメソッドレスポンスを関連付けるかを設定します
そもそも、デフォルトが200というのがおかしいのであって、統合から200が返ってきたときだけ200を返却し、定義にない返却値の場合は500にしておいた。 デフォルトのマッピングは、項目でいうと「HTTPステータスの正規表現」を空にするとよい
これで、クエリパラメータの書式エラーは500となった。
未定義のステータスコードがデフォルトになってしまうというのはどうなんだろう? そのまま返してくれればいいのになってことで、デフォルトをなくしてみると
結局500エラーで、しかもInternal Server Errorときたものだ。
ままならぬ。 本当はバージョン管理周りをまとめたかったのだが、そこまで行きつかなかったので次回に。。