0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Timeoutのテストに利用できる簡単な遅延APIをdockerを使って作成しよう

Last updated at Posted at 2023-04-02

遅延APIが欲しい

最近 504 timeout エラーで悩まされ、開発やデバックに利用できるAPIが欲しくなった。
(例えば、サーバレスAPI(APIゲートウェイ と AWS Lambdaで構成) から処理時間の長い別のAPIを呼ぶ場合など。ちなみにAPI GatewayのTimeoutは29秒がデフォルトでMax値なので、これ以上時間のかかるAPIはこの構成では作っちゃダメです。)

そこで、遅延する時間とレスポンス(http status codeとbody)を簡単に変更できるAPIが欲しくなった。

結果、ローカルで遅延を起こせるAPIサーバーを立てて、ngrokを使ってインターネット経由で呼べるような仕組みを作った。
簡単に作成できますし、他に困っている人もいると思うので紹介します。

利用方法

当時作成したAPIサーバーは python flaskで作成したが、ここでは、rubyのsinatraを紹介します。(個人的にはこっちの方が直感的に色々設定しやすい)
利用方法は、Source code (git)をダウンロードし、docker-composeで起動するだけ。

ローカル起動

# api start
$ docker-compose up

インターネットからアクセス

ローカルではなく、クラウド環境など運用中のサーバーで確認したい場合は、ngrokを使うと便利です。
ローカルで起動したサーバーをインターネットからアクセスできます。

# ローカルの3000ポートをインターネットに公開
$ ngrok http 3000
画面出力
# ...(中略)
Forwarding                    https://fc70-119-173-192-139.jp.ngrok.io -> http://localhost:3000
# 上の「Forwarding」に記載されているurlを使ってローカルのAPIサーバーにrequest
$ curl https://fc70-119-173-192-139.jp.ngrok.io/api/delay
# {"status":200,"delayed_sec":1,"inputs":{},"usage":"/api/timeout?sec=1&status=200"}

その他

APIの設定

GET リクエストとqueryから遅延する時間、返すhttp status codeを決めていますが、お好みに合わせて簡単に修正可能です。
POSTリクエストへの変更や headerの追加も直感的にできます。
文法はsinatraのdocを参照してください。

app.rb
# 遅延API
get '/api/delay' do
  # inputs
  delay_sec = params["sec"]&.to_i || 1
  res_status = params["status"]&.to_i || 200

  # headers
  content_type 'application/json'
  headers "Access-Control-Allow-Origin" => "https://yusungkim.com"

  # delay
  sleep delay_sec

  # response http status
  status res_status

  # response body
  {
    "status" => res_status,
    "delayed_sec" => delay_sec,
    "inputs" => params,
    "usage" => "/api/timeout?sec=1&status=200"
  }.to_json
end
APIの応答例
# /api/delay?sec=2&status=504
{
  "status": 504,
  "delayed_sec": 2,
  "inputs": {
    "sec": "2",
    "status": "504"
  },
  "usage": "/api/delay?sec=1&status=200"
}

ポート番号の変更

ローカルで利用するときにポート番号を他のにしたい場合は、docker-compose.ymlを変更してくだい。
例えばポート3001を使いたい場合は、下記のように変更してください。

docker-compose.yml
# ...中略
services:
  app:
    build:
      context: .
    ports:
#      - 3000:3000  # original
      - 3001:3000   # 3001を利用したい場合
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?