SendGridのイベントデータをIBM Cloudantに保存する

この投稿は、[Softlayer夏のブログコンテスト](http://softlayer.connpass.com/event/18370/)向けの記事です。
<a href="http://softlayer-bluemix-summit.jp" target="_blank"><img src="http://softlayer-bluemix-summit.jp/wp-content/uploads/2015/07/half_banner_234x60.jpg" alt="SoftLayer Bluemix summit2015" /></a>
宿題やったよ！！

クラウドメール配信サービス[SendGrid](https://sendgrid.kke.co.jp/)を使って少し大きな規模のメールを配信するシステムを運用し始めると、Webポータル上のACTIVITY機能だけでは管理しきれなくなってきます。ACTIVITYでは過去1週間分のイベントデータしか閲覧できず、検索機能も最低限のものしか用意されていません。イベントデータには、メールの送信、バウンス、開封、クリック、配信停止、迷惑メール報告など、メール配信に関わる重要なデータばかりです。
元々、ACTIVITY機能はイベントデータの簡易閲覧ツールなので、本格的に運用で活用する場合はEvent Webhook機能を使ってユーザ自身がイベントデータを保存する必要があります。Event Webhook機能とは、あらかじめ指定したURLにイベントデータをJSON形式でPOSTする機能です。POSTを受けるWebアプリケーションを構築する必要がありますが、最近ではデータをストアするのに便利なサービスが色々あります。
今回はSoftlayer上に構築したfluentdを経由して、[IBM Cloudant](http://www-01.ibm.com/software/jp/cmp/cds.html)というデータベースサービス（中身はCouchDB）にイベントデータを保存する方法をまとめます。

# 準備
次のサービスのアカウントを持っていることを前提条件で話を進めます。

* [Bluemix](http://www.ibm.com/cloud-computing/jp/ja/bluemix/?S_CMP=MWIC0518JP_K_GOOGLE_APJP_NWTW-20150518&S_TACT=C428016W&iio=cmwi&jm=-&cmp=c4280&ct=c428016w&cr=google&cm=k&csot=-&ccy=jp&cpb=-&cd=2015-05-18&ck=ibm_bluemix&cs=broadmatch&csr=apjp_nwtw-20150518&mkwid=svOJpjYcB-dc_71682116722_432ie637348)
* [Softlayer](http://www.ibm.com/cloud-computing/jp/ja/softlayer.html)
* SendGrid（SoftlayerやBluemixからアカウント作成できますが、[日本向けの代理店](https://sendgrid.kke.co.jp/)もあるみたいです）

# システム構成
次のような構成で設定します。
[SendGrid]---->[Fluentd(Softlayer)]---->[IBM Cloudant]

* SendGrid→FluentdはEvent Webhookによる通知
* Fluentd→IBM Cloudantはfluent-plugin-couchで保存

# セットアップ
## IBM Cloudantの準備
IBM Cloudantでは特にセットアップは必要ありません。ここで必要なのは、アクセス先のホスト名と認証情報のみです。BluemixのダッシュボードでIBM Cloudantへのアクセス情報を確認します。

![cloudant4.png](https://qiita-image-store.s3.amazonaws.com/0/48939/a6413b15-8c56-1826-f3cc-cf49ababf7a1.png)

## Fluentdのセットアップ
Softlayer上にfluentdをセットアップします。今回はCentOS7.0-64bit Minimal for VSIの最も低スペックなもので構築しました。sshでマシンにログインして、それぞれ必要なものをインストールします。

```text
# yum install gcc openssl-devel zlib-devel
# wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz
# tar zxvf ruby-2.2.3.tar.gz
# cd ruby-2.2.3
# ./configure
# make
# make install
# gem install fluentd --no-ri --no-rdoc
# fluent-gem install fluent-plugin-couch
```

ホームディレクトリに戻って、fluentdの設定ファイルのひな形を作成して、設定ファイルを編集します。

```text
# cd
# fluentd --setup ./fluent
# vi ./fluent/fluent.conf
```

設定ファイル（fluent.conf）の末尾に次の設定を追記します。`<HOST>`、`<USERNAME>`と`<PASSWORD>`部分は、先ほどIBM Cloudantのダッシュボードで確認した認証情報に置き換えます。

```text
<match couch.**>
    type couch
    database sendgrid
    host <HOST>
    port 443
    protocol https
    user <USERNAME>
    password <PASSWORD>
    flush_interval 5s
</match>
```

設定ファイルの編集が終わったらfluentdを起動します。設定が正しければ、IBM Cloudant側に`sendgrid`という名前のデータベースが自動的に作成されます。自動的に作成されない場合、fluentdの設定に問題があるので確認しましょう。この状態でfluentdはポート番号8888で待ち受けています。

```text
# fluentd -c ./fluent/fluent.conf -vv
```

![cloudant6.png](https://qiita-image-store.s3.amazonaws.com/0/48939/5ef70464-28af-e2db-027e-2e82a41e1b1c.png)



## SendGridのEvent Notificationのセットアップ
SendGridのEvent Notification設定画面で「HTTP POST URL」にPOST先のURLを設定します。URLのホストはSoftlayer上に作成したマシンのIPアドレスを指定します。また、POSTしたいイベントを「SELECT ACTIONS」でで選択します。特に理由がなければ「All」で全部POSTします。

```text
http://xxx.xxx.xxx.xxx:8888/couch.doc
```

設定を保存したら「Test Your Integration」ボタンを選択して、サンプルイベントを送信します。

![cloudant8.png](https://qiita-image-store.s3.amazonaws.com/0/48939/dd38c549-005c-bf66-2f85-61e6583c3428.png)


IBM Cloudantでデータベースを確認するとドキュメントが追加されていることが確認できます。後はデータを煮るなり焼くなり思いのままです。

![cloudant9.png](https://qiita-image-store.s3.amazonaws.com/0/48939/5478f272-f6f9-6297-8ac6-818576173151.png)


# 余談
今回、Softlayer、Bluemix、Cloudantいずれも初めて触ってみました。Softlayerはアカウント作成時にマシンも作成するようで、登録したら「今からオーダー確認してできたら連絡するぜ」的メッセージが表示されました。ドライバーとケーブル片手にラック組んでる姿を想像するとアツいですね！いや、実際どうやって準備しているのか知りませんが。