ISUCON6予選問題の実装やベンチマーカーが公開されましたね。
ということでフォークして.NET Coreの参照実装を追加しました。
GitHub - kiyoaki/isucon6-qualify: Add .NET Core support
追加しただけで動作確認はこれから。 Microsoftは運営・協賛に入ってるのになぜ.NET Coreの参照実装を用意してくれなかったのか。
ISUCON6予選問題の実装やベンチマーカーが公開されましたね。
ということでフォークして.NET Coreの参照実装を追加しました。
GitHub - kiyoaki/isucon6-qualify: Add .NET Core support
追加しただけで動作確認はこれから。 Microsoftは運営・協賛に入ってるのになぜ.NET Coreの参照実装を用意してくれなかったのか。
www.slideshare.net
懇親会にテキーラ差し入れで持って行ったらベロンベロンになりました。懇親会と2次会で何を話したか忘れましたが、楽しかったのはなんとなく覚えています。今後、懇親会にテキーラ差し入れ流行らせようと思っております。
www.slideshare.net
朝まで飲んでちょっとだけ寝てから登壇したところ、めちゃくちゃテンションが低くなる現象が発生しましたが、PaaS組み合わせて使って楽になろうという話をしてきました。
おばかIoTのイケメンだけ撃てる銃とか、The DAOの事件の話とか面白かったです。
Azure FunctionとWebJobで、Azure Storage Queueを介して、LINE Bot APIのメッセージの収集と送信を行うサンプルを作成しました。
LINE Bot APIへリクエストするにはServer whitelistにIPアドレスを設定する必要があります。*1
おそらく同一MIDを使ったDDoS攻撃への対策だと思いますが、このwhitelistのせいでグローバルIPアドレスを固定できないPaaSが使えなくなってしまいます。 *2
DDoS攻撃への対策についてはwhitelistではなく、一定時間内に一定数を超える複数のIPアドレスから、同一MIDが正しいChannel IDとChannel Secretでリクエストしてきた場合、ブラックリストへ登録してリクエストを一定時間遮断するような実装にするのが良いと思います。*3
例えば下記のような方法があります。
{ "ipAddress": "192.168.1.1", "addressChangedCount": 0, "isBlocked": false }
現状、whitelistチェックのためにデータストアへアクセスしているならば、処理コストをあまり増やさずにBOT開発者の利便性を向上させることができると思います。
ちなみにサンプルで作成した構成は下記の通りで
この構成だと返信ジョブが失敗した場合に、一定回数のリトライも、リトライに失敗した場合のデータの保存も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があっただけだったなら杞憂
BigQueryをLINQで扱えるようにするためのライブラリです。
StartActionに宣言したRequest.Pathへアクセスされるとログ採取スタート。 LoggingSpanに宣言した期間離脱するとキャッシュが無くなって採取おわり。 期間内にアクセスするとIndexを増やしながらFromPathとToPathをBigQueryへログ出力していく。
スキャン対象となるデータ量を抑えるために、BigQueryのテーブル名にはyyyyMMを付与しています。
サンプルコードではutil.getJSONがAPI呼び出しをしていますが、その奥にあるのはjQueryのajaxメソッドです。
jQueryのajaxメソッドを呼び出すようにサンプルコードを修正しました。
色々とAPIのパスが見えているので画像はぼやけさせていますが、Sankey Diagram(サンキーダイアグラム)感は、感じて頂けるのではないでしょうか。
今回のサンプルコードでは、OwinContextにログインユーザーのIDしか入っていないパターンだったので、期間とステップ数でしか対象者を絞れませんでした。他にもユーザーの属性(例えばゲームならレベルとか)をBigQueryへ保存し閲覧する時に絞り込めれば、目的に合わせて分析できてなお良いのではないでしょうか。
*1: 公開用に改変しているのでこのままでは動作しません、他のサンプルコードも同様。 GitHub - neuecc/CloudStructures: Redis Client based on StackExchange.Redis. をカスタマイズして GitHub - cloud9-plus/CloudStructures: Redis Client based on StackExchange.Redis. 使ってます。
*2:GitHub - filipw/AspNetWebApi-OutputCache: ASP.NET Web API CacheOutput - library to allow you to cache the output of ApiControllers を使ってます。