Cloudflare Tunnelを使ってローカルでもWebhookをデバッグする

先月にかいたブログでは、APIのデバッグで便利なMockoonやmitmproxyを紹介しました。

今回はそれに関連してCloudflare Tunnelを紹介します。Cloudflare Tunnelとは、ローカルのTCP/UDPポートをインターネットに公開するためのツールです。

例えば、いつ支払われるか分からないコンビニ決済や、確認に時間のかかる本人認証などのAPIを使う場合、WebhookやコールバックURLを設定してAPIサーバーからの通知を受け取ることが多いです。しかし、ローカルで開発していると、外部サーバーから手元のPCにアクセスできずデバッグができません。そこで、Cloudflare Tunnelを使ってローカルの環境にアクセスできるURLを作成するのが便利です。

TL;DR

  • Cloudflare Tunnel を使うとローカルの開発サーバーを簡単にインターネットに公開できる
  • 無料(ドメインは別)で、高機能
  • 外部からアクセスできるURLが作れるといろいろな場面で便利
    • WebhookやコールバックURLのデバッグ
    • ローカルでもHTTPSが必要なとき
    • スマホなど実機での動作確認したいとき

Cloudflareでドメインを購入します

いきなりですが、好きなURLを使うためにはドメインが必要です。

ドメインがなくてもCloudflare Tunnelは使えますが、無料版のngrokと同じようにランダムなURLしか生成できません。
トンネルを起動し直す度にURLが変わってしまうので、開発するときに不便です。
Cloudflareで管理しているドメインがあれば、好きなサブドメインをトンネルに割り当てることができます。

ネームサーバーがCloudflareなら外部で購入したドメインでも問題ないと思います(未確認)が、個人的にはCloudflareで買うのがおすすめです。

Cloudflare Tunnel を使う

まず cloudflared CLI をインストールします。Windowsならwingetが、MacOSならbrewが使えるようです。私の WSL 2 (Ubuntu) 環境では、次のようにインストールしました。

Downloads – Cloudflare Zero Trust docs

wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo apt install ./cloudflared-linux-amd64.deb
rm cloudflared-linux-amd64.deb

ちょっと分かりづらい場所ですが、この公式ドキュメントに書いてあるこの手順に従って作業すればOKです。

Create a locally-managed tunnel – Cloudflare Zero Trust docs

まずは Cloudflare にログインします。ブラウザが開くので、Cloudflare アカウントでログインしてドメインを選択します。

cloudflared tunnel login

その後、トンネルを作成します。ここでは “my-dev-tunnel” という名前にしています。

cloudflared tunnel create my-dev-tunnel

作成したトンネルのUUIDをコピペしておきます。作ったトンネルは Cloudflare のダッシュボードからも確認できます。また ~/.cloudflared/.json にファイルが作れます。

似たファイルに ~/.cloudflared/config.yml を作成して、次の内容で保存します。

url: http://localhost:8080
tunnel: <Tunnel-UUID>
credentials-file: /home/hoge/.cloudflared/<Tunnel-UUID>.json

そして、コマンドでDNSも設定します。

cloudflared tunnel route dns my-dev-tunnel my-app.example.com

準備が整ったので、トンネルを起動します。

cloudflared tunnel run my-dev-tunnel

これで https://my-app.example.com で、ローカル環境の http://localhost:8080 にアクセスできるようになります。

応用

基本的には開発時のデバッグ用途が多いですが、サーバー上のデーモンとして起動することもでき、本番環境でも利用可能です。

Cloudflareを使うことで、インターネットからアクセスできないプライベートサブネットにあるサーバーを公開することもできます。

私は実際に本番運用したことはないのですが、ドキュメントを眺めると負荷分散やフェイルオーバーについての記載もあります。AWSでALBなどを構成するとEC2インスタンス以外のコストがかかってしまいがちなので、Cloudflare Tunnelをリバースプロキシのように運用する方法有効かもしれません。

最後に

丁寧な導入方法や実用例などは “Cloudflare Tunnel” で調べるといろいろ出てくると思うので、ここではあまり触れません。Cloudflareはトンネルに限らずいろいろ便利なので、ドメインをお持ちの方はぜひ試してみてください