Help us understand the problem. What is going on with this article?

コンテナから外へのHTTPリクエストをキャプチャしたい!

はじめに

はじめて触るアプリケーションの開発の担当になったときや、アプリケーションの調査やデバックをしたいときに、アプリケーションから呼び出しているAPIリクエストの内容やそのレスポンス内容を確認したいときがあったりします。
あとは、レスポンス内容を少し変えてアプリケーションの挙動の確認をしてみたかりもしたかったり。

前者は特定のログで見れるようにしてる場合もあるかもですが、必ずしもそうなっているとは限らないし、後者の特定のレスポンス時の挙動確認は、データかコードをいじらないとできなかったりするから結構大変だったりします。

そんなことが、アプリの変更(ほとんど)なしでできるツール、http-request-capture を作ってみました。

どんなツールなの?

対象のアプリケーションがローカルのDockerで動いていることが前提になります。
Webアプリのコンテナの横にhttp-request-captureのコンテナを起動させるだけで、Webアプリから呼び出されるHTTP APIのリクエスト/レスポンスをキャプチャでき、さらには、レスポンス内容を編集して、同じリクエストが来た場合に編集したレスポンスを返すように設定することもできます。

基本的にはWebアプリのコード編集がなくてもHTTP APIのキャプチャができますが、HTTPSのAPIを呼び出している場合は、証明書エラーを無視するような設定をアプリ側に入れる必要があります。

また、特別なプロキシを経由するようなリクエストの場合もキャプチャすることが可能です。

何ができるの?

サンプルとして、レポジトリのREADMEに、Wordpressのリクエストをキャプチャする例を載せてあるので、是非手元で動かしてみてください。

ここでは、READMEと同じ内容を日本語でも書いておきます。どんなことができるのかのイメージがつくと思います。

Wordpressのリクエストをキャプチャしてみる

ここでは、Wordpressの公式イメージをローカルで動かしてみて、コンテナから出ているAPIのリクエストをキャプチャし、さらにレスポンス内容を少し編集してアプリの挙動にどんな違いがでるか見てみたいと思います。

1. Wordpressコンテナのセットアップ

git clone https://github.com/s-shirayama/http-request-capture.git
docker-compose -f example/docker-compose.yaml up -d
  1. http://localhost:8000/ を開く
  2. 適当な値でWordpressの初期設定を行う
  3. 設定したID/PWでADMIN画面にログインする

2. HTTP APIのリクエストのキャプチャ

2-1. http-request-captureコンテナを起動

CONTAINER_NAME=example_wordpress_1 \
NETWORK_NAME= \
docker-compose up -d

2-2. http-request-capture UI画面を開く

http://localhost:18080/

image.png

2-3. Check request/response

image.png

  • "show response body"をクリックすると、レスポンスの中身も見ることができます。

image.png

2-4. レスポンスを修正してみる。

  • "add" をクリックして、モックレスポンスの登録をする。
  • "update" をクリックして、レスポンスの修正モードに入る。
  • "responseBody"のJSONのinfo.resultsを修正してみる。

image.png

Before

image.png

After

image.png

3. HTTPS APIのリクエストやプロキシ経由のリクエストをキャプチャしてみる。

http-request-captureが、大体どんな感じで動くのかのイメージができたかと思いますので、続きはレポジトリのREADMEのWordpressのリクエストをキャプチャする例を参照ください。

どうやって動いているの?

最後に、http-request-captureがどうやってリクエストをキャプチャしているのかを説明します。
こんな感じで、コンテナからでるリクエストを、

image.png

iptablesでhttp-request-captureに対して、ルーティングされるようにしています。このやり方は、Istioで外向けのリクエストをサイドカーのEnvoyにルーティングしているやり方を真似ています。

image.png

http-request-captureでは、透過プロキシ(elazarl/goproxy)をGolangで動かして、リクエストとレスポンスをキャプチャしています。そのキャプチャした内容をadminのUIを通してブラウザで見ることができるって感じです。さらには、UIから特定のリクエストに対してのレスポンスの編集ができたりします。この辺はWiremockというモックツールを参考にしています。

この辺の挙動もWordpressのリクエストをキャプチャする例で手元で確認できるので、是非見てみてください。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away