AWS活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は「Amazon API Gateway」と「Amazon S3」を利用して、レスポンスを動的かつ簡単に変更できるAPIモックを作る方法を紹介します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
「Amazon Web Services」(AWS)活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は「Amazon API Gateway」(以下、API Gateway)と「Amazon Simple Storage Service」(以下、S3)を利用して、レスポンスを動的かつ簡単に変更できるAPIモックを作る方法を紹介します。
API Gatewayとはシステムが提供するAPIの管理を容易にするAWSのサービスです。
主な役割としてはクライアントから受け取ったリクエストを「Amazon Elastic Container Service」(ECS)や「AWS Lambda」といったバックエンドのサービスにルーティングし、レスポンスをクライアントに返却します。
また、リクエストのバースト設定や形式チェックなど、従来のWebサーバでは構築に大きな労力がかかる作業も、マネジメントコンソールやSwagger形式で簡単に行えます。
API Gatewayには標準でモック機能が用意されています。
「統合タイプ」で「Mock」を選択すると、レスポンスのマッピングテンプレートで固定値を設定できます。Velocity Template Language(VTL)のスクリプトによって、ある程度動的に変更させることもできます。
ただし、変更ごとにAPI Gatewayのデプロイが必要です。VTLに明るくない場合は容易に設定ができません。同一APIに複数の設定を行うと競合する場合があります。
これらの要件を加味しても問題がない場合は標準のモック機能も便利なので利用をお勧めします。
今回は複数人で開発、テストできるように、あるいは、VTLに明るくない場合でも簡単に構築、設定変更ができるように、S3を利用したAPIモックを構築します。
構築手順は次の通りです。
構成はシンプルです。下図のようにAPI GatewayとS3を連携させ、レスポンスのボディー情報をS3に配置します。
S3にテストデータを配置することでAPI Gatewayを再デプロイしなくてもS3のテストデータを更新したり、ファイルを増やすだけで簡単にテストデータを更新できたりします。ファイル単位に読み出すので、同一のテストデータを更新する必要がなく、チーム開発でもスムーズにテストや開発ができます。
今回は、下記の対向システムとAPIがある想定で、設定します。
API GatewayがS3からテストデータを取得するのに必要なIAMロールを作成します。
「AWSマネジメントコンソール」にログインし、IAMダッシュボードから「ロール」→「ロールの作成」とクリック。遷移した画面で、下図のように選択して「次へ」を押します。
今回必要なポリシーはS3からの読み出しのみなので、IAMで提供されている「AmazonS3ReadOnlyAccess」ポリシーを利用します。検索ボックスに「AmazonS3ReadOnlyAccess」と入力し、検索結果のポリシーを選択後に「次へ」を押します。
ロール名に任意の名前を入力します。今回は「APIMockS3ReadSample」という名前で登録します。
ロールが作成されました。
このままだとAPI Gatewayが信頼されていないので、カスタマイズします。ロールの一覧から先ほど作成したロール名→「信頼関係」→「信頼ポリシーを編集」をクリックします。下図のように編集し、「ポリシーを更新」を押します。
テストデータを配置するS3のバケットを作成します。S3のダッシュボードから「バケット」→「バケットの作成」とクリックして遷移した画面で、バケット名を入力します。今回は「api-mock-sample-test-data」というバケット名を設定します。バケット名以外は何も変更せずに「バケットを作成」を押します。
これでバケットが作成されました。
このままバケットの直下にテストデータを配置し、構築を進めることも可能ですが、APIが増えてきた場合に煩雑になってしまうので、対向システム、APIごとのパスを用意します。
バケット一覧で作成したバケット名を選択し「フォルダの作成」を押します。表示された画面でフォルダ名に「systemA」と入力し、「フォルダの作成」を押します。
これでフォルダの作成ができました。
同様の手順で下図の階層になるようにフォルダを作成します。
systemA └ userinfo systemB └ shoplist
フォルダの作成が完了したら取得するテストデータを配置します。今回、テストデータはJSON形式で下記のようにします。このデータがS3から読み出されてAPIのレスポンスボディーとなります。
{ "id": "000001", "name": "user1", "age": "20" }
{ "id": "000002", "name": "user2" }
{ "shoplist": [ { "id": "001", "name": "shop1", "category": "Food" }, { "id": "002", "name": "shop2", "category": "Fashon" }, { "id": "003", "name": "shop3", "category": "music" } ] }
それぞれのjsonテキストファイルを作成し、下図の通りにS3にアップロードします。
systemA └ userinfo └ 000001.json └ 000002.json systemB └ shoplist └ shoplist.json
アップロードできたらS3バケットの作成は完了です。
API Gatewayを構築します。なお今回はサンプルなので、料金プランやAPIキーを設定しません。API Gatewayのエンドポイントを知っていれば誰でもアクセス可能になってしまうので、必要に応じて各自で設定してください。
まずAPI Gatewayダッシュボードを開き「API」をクリック後に「REST API」の「構築」を押します。
開いた画面で下図のように設定します。API名、説明については任意の値を設定します。今回のAPI名は「APIMockSample」とします。設定できたら「APIの作成」を押します。
API Gatewayの大枠が作成されました。
次に、対向システムのリソース、メソッドを作成していきます。今回は下図のAPI構成でMockを構築します。
mock └ systemA └ userinfo GETメソッド └ systemB └ shoplist GETメソッド
「アクション」→「リソースの作成」をクリックし、下図の通りに設定して「リソースの作成」を押します。
「/mock」リソースが作成されました。
/mockリソースが選択されている状態でsystemAのリソースを作成します。「アクション」→「リソースの作成」をクリックし、下図の通りに設定して「リソースの作成」を押します。
/mockリソースの子リソースとして「/systema」リソースが作成されました。
同様の手順で下図の構成になるようにリソースを作成します。
mock └ systemA └ userinfo └ systemB └ shoplist
作成後は下図のようになります。
・systemAのuserinfoのGETメソッド
userinfoのGETメソッドを作成します。userinfoのGETメソッドはクエリパラメーターにidを付与し、クエリパラメーターと一致するテストデータをS3から取得するように設定してみます。
/userinfoリソースを選択し、「アクション」→「メソッドの作成」をクリックしてセレクトボックスに「GET」を設定後、チェックマークを押します。
開いた画面で下図のように設定し、「保存」を押します。
ARNは、IAMダッシュボード→「ロール」→上記で作成したロール名で取得可能です。
GETメソッドの作成が完了しました。
リクエストパラメーターで「id」を受け取れるように設定します。「メソッドリクエスト」→「URL クエリ文字列パラメーター」→「クエリ文字列の追加」をクリックし、下図のように設定してチェックマークをクリックします。
S3のデータ取得時にリクエストクエリパラメーターの「id」をパス上書きで設定した「【作成したS3バケット名】/systemA/userinfo/{id}.json」の{id}に設定できるように統合リクエストを設定します。
メソッドの実行に戻り、「統合リクエスト」→「URL パスパラメーター」→「パスの追加」をクリックし、下図のように設定してチェックマークをクリックします。
マッピング元には「method.request.querystring.id」を設定してリクエストのクエリ文字列「id」を指定します。設定を変更することでヘッダなどをマッピング元に設定することも可能です。
以上でuserinfoの設定ができたので、S3から値が取得できるかどうかをテストします。「メソッドの実行」に戻り、「テスト」を押します。「クエリ文字列」に「id=000001」と入力して「テスト」を押すとS3に配置している「api-mock-sample-test-data/systemA/userinfo/000001.json」の内容がレスポンスボディーとして返却されたら成功です。
「クエリ文字列」に「id=000002」と入力した場合、「api-mock-sample-test-data/systemA/userinfo/000002.json」の内容がレスポンスボディーとして返却されます。
・systemBのshoplistのGETメソッド
systemBのshoplistのGETメソッドを作成します。こちらはS3に配置されているファイルをそのまま取得するように設定します。userinfoと同様に/shoplistリソースを選択し、「アクション」→「メソッドの作成」をクリックしてセレクトボックスに「GET」を設定後、チェックマークを押します。
開いた画面で下図のように設定し、「保存」を押します。
userinfoとの違いはパス上書きのみです。S3のファイル名をそのまま設定します。
保存したらテストします。テスト画面を開いたら、設定を変更せずにそのまま「テスト」を押します。「api-mock-sample-test-data/systemB/shoplist/shoplist.json」の内容がレスポンスボディーとして返却されたら成功です。
各メソッドの準備が完了したので、API Gatewayをデプロイします。「アクション」→「デプロイ」をクリックし、任意のステージ名、説明を設定して「デプロイ」を押します。
次のような画面が表示されたら完成です。
APIとして公開されたので、curlコマンドでテストします。userinfoの000001のユーザーから取得してみます。URLはデプロイしたステージに表示されている「URLの呼び出し」+リソースパス+クエリパラメーターです。
curlコマンドを実行し、「000001.json」の値を取得できていることを確認できました。
クエリパラメーターをid=000002に変更すると「000002.json」の値が取得できます。
shoplistも実行し、「shoplist.json」の値が取得できていることを確認します。
今回は、API GatewayとS3を利用して、レスポンスを動的かつ簡単に変更できるAPIモックの設定方法を紹介しました。
APIとS3を利用したモックはチーム開発の際に発生しがちな競合問題を解決できます。また今回は紹介しなかったのですが、統合レスポンスの設定を変更することでエラーパターンのテストも簡単にできます。静的レスポンスの設定なので、モック以外にも活用方法はさまざまです。
皆さんのテスト、開発が少しでもスムーズになれば幸いです。
株式会社システムシェアード システム開発事業部所属
最高の貢献を最高の仲間と届けることをミッションに普段はWebアプリケーションの開発を実施。API基盤開発、「AWS IoT Core」を利用した基盤構築とIoT機器から収集したデータを利用した機械学習によるレコメンドシステム開発、VM環境からAWS環境へのリプレースやAWS環境上で実施する性能試験など先端技術を用いた開発に従事。
Copyright © ITmedia, Inc. All Rights Reserved.