自分専用のWebhookエンドポイントを作成してローカルにも転送してくれるWebhook Relayの使い方

公開日:2019/12/16 更新日:2019/12/16
自分専用のWebhookエンドポイントを作成してローカルにも転送してくれるWebhook Relayの使い方のサムネイル

Webhook Relayは、Webhookを代わりに受け取ってローカル内のサーバやその他のインターネット上のWebhookのエンドポイントにHTTPリクエストをリレー(転送)してくれるサービスです。この記事では、Webhook Relayの使い方を簡単にまとめます。

はじめに

ローカルで動かしているサーバーやボットなどでHTTPリクエストをインターネット経由で受け取りたい場合、通常だと固定IPアドレスの取得やファイアウォールの設定など少々手間がかかります。Webhook Relayはその名の通り、Webhookを代わりに受け取ってローカル内のサーバやその他のインターネット上のWebhookのエンドポイントにHTTPリクエストをリレー(転送)してくれるサービスです。この記事では、Webhook Relayの使い方を簡単にまとめます。

Webhook Relayについて

Webhook Relayの公式サイトは以下になります。

webhookrelay.com

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のサインアップページからアカウントを作成します。

signup-webhook-relay.png

サインアップすると以下のようにダッシュボードが表示されます。アクセストークンを作成するために左サイドメニューにあある「Access tokens」をクリックします。

dashboard-side-access-token.png

ここでは作成済のアクセストークンが表示されますが、初回の場合は当然ながら何も作成されていません。「CREATE TOKEN+」をクリックします。

create-access-token.png

以下のように新しく作成されたアクセストークンのキーとシークレット文字列が表示されるのでメモしておきます。

your-access-token.png

また、上記に記載されているコマンドを後ほど実行します。以上でアカウントとアクセストークンの作成が完了です。 なお、以降の手順に移る前に、Webhook Relayから届いているメール内のリンクをクリックして、メールアドレスの確認作業を完了させておいてください。この作業が完了していないと後ほどエラーとなります。

バケットを作成する

Webhook Relayでは、片方向のWebhookを転送するためにバケットというものを作成する必要があります。以降の手続きでどういうものか分かると思いますのでとりあえずバケットを作成します。 左サイドメニューにある「Buckets」をクリックすると、以下のようにバケットの一覧ページが表示されます。ここで「CREATE BUCKET +」をクリックします。

create-buckets.png

バケット名を入力し、「SUBMIT」をクリックします。

set-bucket-name-example.png

なお、ここで以下のように表示される場合はメールアドレスの確認ができていないので、Webhook Relayから届いているメール内のリンクをクリックしてメールアドレスの確認を完了させてください。

email-not-yet-valid.png

バケットを作成すると以下のようにバケットのダッシュボードが表示されます。ここで「Default public endpoint」がWebhookのエンドポイントになります。すなわち、このエンドポイントに対して例えばHTTP POSTリクエストを送信すると、それをローカル内のサーバーやインターネット上に公開されている別のサービスのWebhookのエンドポイントに転送することができます。

your-endpoint.png

Webhook RelayのエンドポイントをInputと呼んでおり、転送先をOutputとしています。無料プランではInputもOutputも1つしか使用できませんが、有料プランならばそれぞれ追加することができます。  なお、上記画像内の「Default public endpoint」の横にある歯車マークをクリックすると以下のようにそのエンドポイントの設定ダイアログが開きます。ここでHTTPレスポンスのステータスコードや内容を設定できます。

endpoint-settings.png

エンドポイントの認証方法を設定する

デフォルトではWebhook Relayのエンドポイントは認証などはなく誰からのHTTPリクエストでも受け付けます。Webhook Relayでは、エンドポイントの認証方法としてベーシック認証とトークン認証も設定できます。 認証方法を変更するには、以下のように「BUCKET NAME & AUTHENTICATION」をクリックします。

bucket-auth-setup.png

ドロップダウンメニューから「basic」(ベーシック認証)、「token」(トークン認証)を選択できます。ベーシック認証ならばユーザ名とパスワード、トークン認証ならばトークンをそれぞれ指定し、「SAVE」をクリックして完了です。

settings-auth-bucket.png

Outputを設定する

Webhook Relayが受け取ったHTTPリクエストをローカル環境に転送したい場合は、以下のように「Output」部分で「internal network」にチェックを入れておきます。インターネット上のエンドポイントの場合はチェックを外します。「Output destination」には転送先となるローカルのサーバアドレス、インターネット上の他のエンドポイントに転送する場合はそのエンドポイントのURLを入力します。

settings-output.png

なお、ローカル内のサーバに転送したい場合などはとりあえず「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等を使うと簡単です。

www.virment.com

APIサーバの開発時にブラウザやコマンドを使って毎回動作確認したりデバッグしたりするのは大変だと思います。そこで便利なのがAPIサーバにHTTPリクエストを送ってそのレスポンス内容を確認できるAPIクライントです。この記事では、機能も充実していて、UIも綺麗なInsomniaの簡単な使い方をまとめます。

また、シェルスクリプトでなくても以下のようにPythonなどのスクリプトも実行できるようです。

$ relay forward --bucket バケット名 --relayer exec --command python スクリプト名

まとめ

Webhookをローカルやその他の外部サービスに転送できるWebhook Relayについてまとめました。Webhook Relayを使うことで自由に使えるエンドポイントを用意でき、ローカル内で動作するサーバーやボットなどに外部からトリガすることができます。スマートホームや色々な自動化に利用できそうです。なお、Webhook Relayはできることが多く、この記事に書いたような片方向の転送ではなく双方向の転送も可能です。また、エンドポイントに届いたHTTPリクエストのフィルタ機能などもあります。詳しくは以下の公式ドキュメントを見てみてください。

webhookrelay.com

Forward webhooks to localhost during development, testing or in production - Web Relay

関連記事