Sinatraとngrokを使ってWebhookのテストを楽にする方法

Sinatraとngrokを使ってWebhookのテストを楽にする方法

この記事は Simple Webhook Testing Using Sinatra and ngrok の抄訳です。

Webhookはアプリケーションとサービスを密に連携させるのに有効な方法です。でも、デバッグしようと思うと、ちょっと面倒に感じることもあります。APIマニュアル新規会員登録が必要)ではWebhookのデバッグ方法をご紹介していますが、簡単に構築できて使いやすいWebhookのテスト環境にはどういったものがあるでしょうか?今回は、ngrokを利用してSinatraアプリケーションでWebhookを受ける方法をご紹介します。この組み合わせはかなり強力です。

node.jsを利用するのであれば、こちらのWebhookのテストに関する記事が参考になるでしょう。

はじめに

前提条件としてRubyとRubyGemsの環境が必要になります。Rubyについてあまり詳しくない場合、rbenvで環境構築するのがオススメです。

まず、新しいフォルダを作成してgem install sinatraコマンドを実行してSinatraをインストールします。インストールできたら、次に簡単なSinatraアプリを作っていきます。

webhook.rbという名前のファイルを作成します。今回は、Webhookの一例としてSendGridのEvent Webhook機能を使ってみます。

Event WebhookはボディにJSONを含みます。JSONの内容をテキストファイルに出力するコードをwebhook.rbに記述します:

require 'sinatra'
require 'json'

post '/event' do
 status 204 #successful request with no body content


 request.body.rewind
 request_payload = JSON.parse(request.body.read)
 puts request_payload


 #append the payload to a file
 File.open("events.txt", "a") do |f|
   f.puts(request_payload)
 end
end

たったこれだけで、Sinatraは/event URLに対するPOSTリクエストを受け付けて、関連するコードを実行してくれます。

Sinatraを実行してアプリケーションをインターネットに公開する

ruby webhook.rb コマンドを実行してアプリを起動すると、SinatraはWEBrick Webサーバを起動して待ち受けポートを表示します。標準の待ち受けポートは4567です。

次に、ここで実行したインスタンスをインターネット上に公開します。ここでngrokが登場します。ngrok(version 2.0)をインストールして新しいターミナルを起動してください。ngrok http 4567コマンドを実行してngrok URLを確認してください。このngrok URLにブラウザでアクセスするとSinatra標準の「Sinatra doesn’t know this ditty.」ページを確認することができるはずです。

ngrok画面

SendGridのEvent Notification Appにngrok URLを設定します。Sinatraアプリ上で定義した/eventをURLに追加するのを忘れないようにしましょう。

Event Notification設定画面

最後にEvent Notification App内の「Test Your Integration」ボタンを選択するか、Mail APIリファレンスのAPI Workshop(Try Itボタンのこと)を使ってテストします。

さいごに

SendGridからイベントが発行されると、受信したHTTPリクエストの内容がngrokを実行しているターミナルに表示されます。また、Sinatraアプリを実行しているターミナルでも同じリクエストを確認できます。

ngrok

Sinatraアプリと同じフォルダ内に、以下のようなevents.txtファイルが生成されます。

{
 "email"=>"john.doe@sendgrid.com",
 "sg_event_id"=>"VzcPxPv7SdWvUugt-xKymw",
 "sg_message_id"=>"142d9f3f351.7618.254f56.filter-147.22649.52A663508.0",
 "timestamp"=>1386636112, "smtp-id"=>"<142d9f3f351.7618.254f56@sendgrid.com>",
 "event"=>"processed",
 "category"=>["category1", "category2", "category3"],
 "id"=>"001",
 "purchase"=>"PO1452297845",
 "uid"=>"123456"
}

以上で完了です。イベントの内容を確認するとともに、これを応用して様々なアプリケーションを開発することができます。是非お試しください!

参考記事