451 Unavailable For Legal Reasons

とあるゲームエンジニアのブログです

ISUCON6予選問題の実装やベンチマーカーが公開されたので.NET Core実装追加してみた

ISUCON6予選問題の実装やベンチマーカーが公開されましたね。

isucon.net

ということでフォークして.NET Coreの参照実装を追加しました。

GitHub - kiyoaki/isucon6-qualify: Add .NET Core support

追加しただけで動作確認はこれから。 Microsoftは運営・協賛に入ってるのになぜ.NET Coreの参照実装を用意してくれなかったのか。

C#縛りでLT大会 & Meetup@bitFlyerで話してきた

イベントページ

forkwell.connpass.com

資料

www.slideshare.net

振り返り

懇親会にテキーラ差し入れで持って行ったらベロンベロンになりました。懇親会と2次会で何を話したか忘れましたが、楽しかったのはなんとなく覚えています。今後、懇親会にテキーラ差し入れ流行らせようと思っております。

Japan Azure User Group (JAZUG) 6周年で話してきた

イベントページ

jazug.connpass.com

資料

www.slideshare.net

Twitter

togetter.com

振り返り

朝まで飲んでちょっとだけ寝てから登壇したところ、めちゃくちゃテンションが低くなる現象が発生しましたが、PaaS組み合わせて使って楽になろうという話をしてきました。

おばかIoTのイケメンだけ撃てる銃とか、The DAOの事件の話とか面白かったです。

obakapp.doorkeeper.jp

btcnews.jp

LINE Bot APIはServer whitelistを無くした方が良いと思う

Azure FunctionとWebJobで、Azure Storage Queueを介して、LINE Bot APIのメッセージの収集と送信を行うサンプルを作成しました。

github.com

LINE Bot APIへリクエストするにはServer whitelistにIPアドレスを設定する必要があります。*1

おそらく同一MIDを使ったDDoS攻撃への対策だと思いますが、このwhitelistのせいでグローバルIPアドレスを固定できないPaaSが使えなくなってしまいます。 *2

DDoS攻撃への対策についてはwhitelistではなく、一定時間内に一定数を超える複数のIPアドレスから、同一MIDが正しいChannel IDとChannel Secretでリクエストしてきた場合、ブラックリストへ登録してリクエストを一定時間遮断するような実装にするのが良いと思います。*3

例えば下記のような方法があります。

  1. Redisに、MIDをKeyに含めて、下記のようなHashを一定時間のExpireでSetしておく。
  2. isBlockedをチェックしtrueなら遮断
  3. リクエスト元IPアドレスがipAddressと異なる場合、新たなIPアドレスをipAddressをSetしてaddressChangedCountをIncrement
  4. addressChangedCountが一定数を超えたらisBlockedをtrueにしてExpireを延長しておく
{
  "ipAddress": "192.168.1.1",
  "addressChangedCount": 0,
  "isBlocked": false
}

現状、whitelistチェックのためにデータストアへアクセスしているならば、処理コストをあまり増やさずにBOT開発者の利便性を向上させることができると思います。

ちなみにサンプルで作成した構成は下記の通りで

  1. Azure Functionでメッセージを収集しAzure Storage Queueへストア
  2. Azure WebJobでAzure Storage Queueをデキューして返信メッセージを生成しSending messages APIへPOST

この構成だと返信ジョブが失敗した場合に、一定回数のリトライも、リトライに失敗した場合のデータの保存もWebJob SDKが面倒見てくれます。*4

PaaSだと面白いBOTを思いついたら手軽に試せてスケールもしやすいので、LINE Bot APIの開発者の方にはServer whitelistの撤廃を検討頂けるとありがたいです。*5

*1:Callback URLをリクエストしてもらうのはServer whitelistの設定不要

*2:「Azure Web AppsはグローバルIPアドレスを固定にすることは可能ですか?」とMicrosoftに問い合わせてみたところ「まだその機能がありません。将来的にも組み込まれるかどうかもわからないようです。」とのこと

*3:弊社のゲームではBOT検出&遮断アルゴリズムの1つにリクエスト元IPアドレスを使ったものを実装している

*4:queueのアイテム名に「-poison」を付けて別queueに保存される

*5:トライアル版だからServer whitelistがあっただけだったなら杞憂

LINQ to BigQueryを使ってSankey Diagram(サンキーダイアグラム)を作成しよう

LINQ to BigQueryとは?

BigQueryをLINQで扱えるようにするためのライブラリです。

github.com

どうやってBigQueryにデータを入れるの?

Sankey Diagramに必要な形式のデータを作成してBigQueryへ保存するためのOwinMiddleware

gist.github.com *1

StartActionに宣言したRequest.Pathへアクセスされるとログ採取スタート。 LoggingSpanに宣言した期間離脱するとキャッシュが無くなって採取おわり。 期間内にアクセスするとIndexを増やしながらFromPathとToPathをBigQueryへログ出力していく。

BigQueryに入れたデータをどうやって可視化するの?

LINQ to BigQueryのLINQ登場

gist.github.com *2

スキャン対象となるデータ量を抑えるために、BigQueryのテーブル名にはyyyyMMを付与しています。

Viewから呼び出し

gist.github.com *3

サンプルコードではutil.getJSONがAPI呼び出しをしていますが、その奥にあるのはjQueryのajaxメソッドです。

jQueryのajaxメソッドを呼び出すようにサンプルコードを修正しました。

完成!

f:id:master-0717:20160224215832p:plain

色々とAPIのパスが見えているので画像はぼやけさせていますが、Sankey Diagram(サンキーダイアグラム)感は、感じて頂けるのではないでしょうか。

改善

今回のサンプルコードでは、OwinContextにログインユーザーのIDしか入っていないパターンだったので、期間とステップ数でしか対象者を絞れませんでした。他にもユーザーの属性(例えばゲームならレベルとか)をBigQueryへ保存し閲覧する時に絞り込めれば、目的に合わせて分析できてなお良いのではないでしょうか。