はじめに
ローカルで動かしているサーバーやボットなどでHTTPリクエストをインターネット経由で受け取りたい場合、通常だと固定IPアドレスの取得やファイアウォールの設定など少々手間がかかります。Webhook Relayはその名の通り、Webhookを代わりに受け取ってローカル内のサーバやその他のインターネット上のWebhookのエンドポイントにHTTPリクエストをリレー(転送)してくれるサービスです。この記事では、Webhook Relayの使い方を簡単にまとめます。
Webhook Relayについて
Webhook Relayの公式サイトは以下になります。
Relay and proxy all your webhooks to public and internal destinations – – Web Relay
Expose applications running on your local web server, on any network with an Internet connection without public IP, adding DNS records or opening ports Web Relay
Webhook Relayは月額課金の有料サービスですが、無料プランも用意されています。無料プラン(転送が月に150回まで)で十分試せるので一度使ってみると良いかもしれません。
なお、Webhook Relayでは、コマンドラインツール、Dockerのコンテナ、Node-red用のノードなどが用意されています。この記事ではコマンドラインツールを使います。
前提と環境
この記事では、Ubuntu18.04で試しました。なお、Webhook RelayはWindows、macOSでも使用可能です。
- OS : Ubuntu18.04
Webhook Relayのアカウントとアクセストークンを作成する
Webhook Relayのサインアップページからアカウントを作成します。
サインアップすると以下のようにダッシュボードが表示されます。アクセストークンを作成するために左サイドメニューにあある「Access tokens」をクリックします。
ここでは作成済のアクセストークンが表示されますが、初回の場合は当然ながら何も作成されていません。「CREATE TOKEN+」をクリックします。
以下のように新しく作成されたアクセストークンのキーとシークレット文字列が表示されるのでメモしておきます。
また、上記に記載されているコマンドを後ほど実行します。以上でアカウントとアクセストークンの作成が完了です。
なお、以降の手順に移る前に、Webhook Relayから届いているメール内のリンクをクリックして、メールアドレスの確認作業を完了させておいてください。この作業が完了していないと後ほどエラーとなります。
バケットを作成する
Webhook Relayでは、片方向のWebhookを転送するためにバケットというものを作成する必要があります。以降の手続きでどういうものか分かると思いますのでとりあえずバケットを作成します。
左サイドメニューにある「Buckets」をクリックすると、以下のようにバケットの一覧ページが表示されます。ここで「CREATE BUCKET +」をクリックします。
なお、ここで以下のように表示される場合はメールアドレスの確認ができていないので、Webhook Relayから届いているメール内のリンクをクリックしてメールアドレスの確認を完了させてください。
バケットを作成すると以下のようにバケットのダッシュボードが表示されます。ここで「Default public endpoint」がWebhookのエンドポイントになります。すなわち、このエンドポイントに対して例えばHTTP POSTリクエストを送信すると、それをローカル内のサーバーやインターネット上に公開されている別のサービスのWebhookのエンドポイントに転送することができます。
Webhook RelayのエンドポイントをInputと呼んでおり、転送先をOutputとしています。無料プランではInputもOutputも1つしか使用できませんが、有料プランならばそれぞれ追加することができます。
なお、上記画像内の「Default public endpoint」の横にある歯車マークをクリックすると以下のようにそのエンドポイントの設定ダイアログが開きます。ここでHTTPレスポンスのステータスコードや内容を設定できます。
エンドポイントの認証方法を設定する
デフォルトではWebhook Relayのエンドポイントは認証などはなく誰からのHTTPリクエストでも受け付けます。Webhook Relayでは、エンドポイントの認証方法としてベーシック認証とトークン認証も設定できます。
認証方法を変更するには、以下のように「BUCKET NAME & AUTHENTICATION」をクリックします。
ドロップダウンメニューから「basic」(ベーシック認証)、「token」(トークン認証)を選択できます。ベーシック認証ならばユーザ名とパスワード、トークン認証ならばトークンをそれぞれ指定し、「SAVE」をクリックして完了です。
Outputを設定する
Webhook Relayが受け取ったHTTPリクエストをローカル環境に転送したい場合は、以下のように「Output」部分で「internal network」にチェックを入れておきます。インターネット上のエンドポイントの場合はチェックを外します。「Output destination」には転送先となるローカルのサーバアドレス、インターネット上の他のエンドポイントに転送する場合はそのエンドポイントのURLを入力します。
なお、ローカル内のサーバに転送したい場合などはとりあえず「Output destination」を空にしておいても大丈夫です。
Webhook Relayのコマンドラインツールをインストールする
Linux(64bit)の場合は以下でWebhook Relayのコマンドラインツールをダウンロードできます。WindowsやmacOS、32bit版のLinux等の場合のダウンロード、インストール方法はこちらの公式ドキュメントに記載されています。
# Linux x86-64 (64-bit)
$ sudo wget -O /usr/local/bin/relay https://storage.googleapis.com/webhookrelay/downloads/relay-linux-amd64
ダウンロードしたファイルに以下で実行権限を付与します。
$ sudo chmod +wx /usr/local/bin/relay
以下のようにrelay
コマンドでバージョンを表示できればインストールが完了です。
$ relay -v
WebhookRelay version 1.19.0, build c35e1aa9
続いて以下のコマンドで各自のWebhook Relatのアカウントにログインします。
$ relay login -k <トークンのキー> -s <トークンのシークレット>
以下が実際の実行例です。
$ relay login -k aehounfe08-2k308-293k-oele-208j083j208 -s SkIu39aKA8
Clearing existing credentials...
Not logged in to my.webhookrelay.com:443
Not logged in to my.webhookrelay.com:8080
Not logged in to tnl.webrelay.io
Saving new credentials to /home/username/.webhookrelay/config.json
success
以降でコマンドラインツールの使い方を説明します。
Webhook Relayに届いたHTTPリクエストをローカルで動作するHTTPサーバに転送する
まず最初の例として、Webhook Relayで受け取ったHTTPリクエスト(前節で出てきた「Default public endpoint」に届いたHTTPリクエスト)をローカル内で動作するサーバに転送してみます。これを実現するには以下のコマンドを使用します。以下はWebhook Relayのエージェントを起動して、Webhook Relayのエンドポイントに届いたHTTPリクエストに応じて動作させるためのコマンドです。
$ relay forward --bucket バケット名 転送先
実際の使用例は以下です。
$ relay forward --bucket myFirstBucket http://localhost:8000
上記を実行すると、以下のように表示されて待機状態になります。
$ relay forward --bucket myFirstBucket http://localhost:8000
Forwarding:
https://my.webhookrelay.com/v1/webhooks/aehounfe08-2k308-293k-oele-208j083j208 -> http://localhost:8000
Starting webhook relay agent...
2019-12-16 15:41:50.401 INFO using standard transport...
2019-12-16 15:41:51.440 INFO webhook relay ready... {"host": "my.webhookrelay.com:8080", "buckets": ["aehounfe08-2k308-293k-oele-208j083j208"]}
Webhook Relayのエンドポイント(前節で出てきた「Default public endpoint」)にHTTPリクエストが届くと、そのHTTPリクエストがhttp://localhost:8000
に転送されます。ただし、http://localhost:8000
では届いたHTTPリクエストを処理できるように何かしら実装しているとします。ローカルのHTTPサーバではなく、例えばWebhook RelayのエンドポイントにHTTPリクエストが届いたことをトリガにシェルスクリプトを実行したい場合は後述します。
Webhookをトリガにしてシェルスクリプトを実行する
Webhook Relayから転送されてきたHTTPリクエストをトリガにして任意のシェルスクリプトを実行することも可能です。以下のようなコマンドになります。
$ relay forward --bucket バケット名 --relayer exec --command bash スクリプト名
以下が使用例です。実行すると待機状態になります。
$ relay forward --bucket myFirstBucket --relayer exec --command bash touch.sh
Executing command on webhooks:
https://my.webhookrelay.com/v1/webhooks/aehounfe08-2k308-293k-oele-208j083j208 -> bash touch.sh
[i] Please ensure that your buckets have at least one internal output destination, otherwise this agent will not receive webhooks.
Starting webhook relay agent...
2019-12-16 15:57:04.364 INFO using standard transport...
2019-12-16 15:57:05.315 INFO webhook relay ready... {"host": "my.webhookrelay.com:8080", "buckets": ["aehounfe08-2k308-293k-oele-208j083j208"]}
なお、上記のtouch.sh
の中身は適当に以下のようにしました。touch
コマンドでタイムスタンプをファイル名とした空のファイルを作成するだけのシェルスクリプトになります。
~/touch.sh#!/bin/bash
touch `date +%Y%m%d%H%M`
待機状態のところで、「Default public endpoint」にPOSTリクエストを送信してみます。すると以下のように端末に表示され、ディレクトリにタイムスタンプがファイル名になっている空のファイルが作成されます。
2019-12-16 15:57:26.224 INFO command executed {"command": "bash", "args": ["touch.sh"]}
なお、HTTPリクエストの送信にはInsomnia等を使うと簡単です。
APIサーバの開発時にブラウザやコマンドを使って毎回動作確認したりデバッグしたりするのは大変だと思います。そこで便利なのがAPIサーバにHTTPリクエストを送ってそのレスポンス内容を確認できるAPIクライントです。この記事では、機能も充実していて、UIも綺麗なInsomniaの簡単な使い方をまとめます。
また、シェルスクリプトでなくても以下のようにPythonなどのスクリプトも実行できるようです。
$ relay forward --bucket バケット名 --relayer exec --command python スクリプト名
まとめ
Webhookをローカルやその他の外部サービスに転送できるWebhook Relayについてまとめました。Webhook Relayを使うことで自由に使えるエンドポイントを用意でき、ローカル内で動作するサーバーやボットなどに外部からトリガすることができます。スマートホームや色々な自動化に利用できそうです。なお、Webhook Relayはできることが多く、この記事に書いたような片方向の転送ではなく双方向の転送も可能です。また、エンドポイントに届いたHTTPリクエストのフィルタ機能などもあります。詳しくは以下の公式ドキュメントを見てみてください。
Webhook Forwarding — Web Relay
Forward webhooks to localhost during development, testing or in production – Web Relay
SPONSORED LINK