開発

[ngrok] 外部サービスのwebhookをローカルのAPIにして開発・検証を行う

外部サービスを使用した開発時に、「webhook」によるコールバックを使用したシステムがあります。
「webhook」とは外部サービスで何かの処理が行われた場合に、サービス側が設定されたエンドポイントにアクセスすることです。
それによって外部サービスと自分のサーバーに置いてあるプログラムと連携をすることができます。
例えばLINE APIを使用した開発では、LINE側で何か処理が行われた場合にLINE側から自分のサーバーにアクセスして様々な情報を取得することができます。

しかし、開発時はローカルでサーバーを構築して実装を進めるためwebhookのエンドポイントに「localhost」を設定することはできません。
そこで「gnrok」を使用して開発を行います。
「gnrok」とはローカルで開発しているAPIを外部に公開するためのサービスとなります。
これを利用してwebhookをローカルで開発しているAPIに向けてもらうようになります。

環境

  • Mac Intel Ventura 13.1
  • ngrok 3.2.1

「ngrok」のインストールと設定

まずは「ngrok」のサイトにアクセスして「Sign up for free」でアカウントを作成します。

https://ngrok.com/

アカウント登録に必要なものは「名前」「メールアドレス」「パスワード」となります。
また「GitHub」や「Google」アカウントでログインすることもできます。

アカウント作成すると「ngrok」のダッシュボード画面に遷移しますのでダウンロードしましょう。

ngrokのダウンロード

ファイルを解凍すると「ngrok」がありますので、どこからでも「ngrok」コマンドが実行できるようにインストールします。

$ mv {ngrokが置いてあるパス} /usr/local/bin

実際に「ngrok」コマンドを実行してインストールされているか確認します。

$ ngrok -h

以下のように「ngrok」の情報が表示されていればインストール完了です。

NAME:
  ngrok - tunnel local ports to public URLs and inspect traffic

USAGE:
  ngrok [command] [flags]

DESCRIPTION: 
  ngrok exposes local networked services behinds NATs and firewalls to the
  public internet over a secure tunnel. Share local websites, build/test
  webhook consumers and self-host personal services.
  Detailed help for each command is available with 'ngrok help <command>'.
  Open http://localhost:4040 for ngrok's web interface to inspect traffic.

Author:
  ngrok - <support@ngrok.com>

TERMS OF SERVICE: https://ngrok.com/tos

EXAMPLES: 
  ngrok http 80                           # secure public URL for port 80 web server
  ngrok http --domain baz.ngrok.dev 8080  # port 8080 available at baz.ngrok.dev
  ngrok http foo.dev:80                   # tunnel to host:port instead of localhost
  ngrok http https://localhost            # expose a local https server
  ngrok tcp 22                            # tunnel arbitrary TCP traffic to port 22
  ngrok tls --domain=foo.com 443          # TLS traffic for foo.com to port 443
  ngrok start foo bar baz                 # start tunnels from the configuration file

COMMANDS:
  api                            use ngrok agent as an api client
  completion                     generates shell completion code for bash or zsh
  config                         update or migrate ngrok's configuration file
  credits                        prints author and licensing information
  diagnose                       diagnose connection issues
  help                           Help about any command
  http                           start an HTTP tunnel
  service                        run and control an ngrok service on a target operating system
  start                          start tunnels by name from the configuration file
  tcp                            start a TCP tunnel
  tls                            start a TLS tunnel
  tunnel                         start a tunnel for use with a tunnel-group backend
  update                         update ngrok to the latest version
  version                        print the version string

OPTIONS:
      --config strings   path to config files; they are merged if multiple
  -h, --help             help for ngrok
  -v, --version          version for ngrok

なお以下のサイトにアクセスすると、「brew」を使ったインストールコマンドを入手することが出来ます。

https://ngrok.com/download

インストールが完了すると、認証トークンを設定します。
トークンは以下の場所に記載してます。

トークン設定

以下のコマンドでPCにトークンを登録して使えるようにします。

$ ngrok config add-authtoken {トークン}

認証トークンを設定すると以下のメッセージが表示されます。

Authtoken saved to configuration file: {設定ファイルのパス}

ローカルの「Docker」環境を公開してデバッグする

まずは以前の記事を元に「PhpStorm」を起動して「Docker」でデバッグ出来るようにしてください。

「Docker」が起動してローカルでAPIの受付が出来るようになったら、以下のコマンドで「ngrok」を通じてローカルのサーバーと接続できます。

$ ngrok http {docker側のwebサーバーのポート番号}

接続に成功すると以下のように表示されるので「Forwarding」のURLにアクセスすることで、ローカルのWebサーバーに接続できます。

Session Status                online                                                                                                                  
Account                       Account Name (Plan: Free)                                                                                   
Version                       3.2.1                                                                                                                   
Region                        Japan (jp)                                                                                                              
Latency                       -                                                                                                                       
Web Interface                 http://127.0.0.1:4040                                                                                                   
Forwarding                    https://XXXX-XXX-XXX-XX-XXX.jp.ngrok.io -> http://localhost:9080                                                        
                                                                                                                                                      
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                             
                              0       0       0.00    0.00    0.00    0.00     

「ngrok」を終了する場合はキーボードの「Ctrl + C」を同時押しします。
もし「ngrok」を終了せずにターミナルを閉じた場合はポートが接続された状態のままとなりますのでOSを再起動してください。

また「PhpStorm」側も設定を変更する必要があります。
Settings…」→「Servers」を選択して、「ngrok」用のサーバーを追加します。

Serverの追加

また「PHP Remote Debug」のサーバーの設定を追加したものに変更する必要があります。

「PHP Remote Debug」の設定

これで「ngrok」で公開されたAPIにアクセスすると「PhpStorm」でデバッグすることが可能となります。
決算システム等の外部サービスのwebhookのURLを公開されたAPIにして開発・検証がやりやすくなったかと思います。