SORACOM Air における "Chaos Ken.T"対策

[SORACOM Advent Calendar](http://qiita.com/advent-calendar/2015/soracom) 12/9分です。[ソラコム](https://soracom.jp/)の [Ken Tamagawa](https://twitter.com/kentamagawa)です。

突然ですが、Chaos Monkey(ケイオスモンキー)を皆さんご存知でしょうか？Publickeyさんの記事がわかりやすいです。
[サービス障害を起こさないために、障害を起こし続ける。逆転の発想のツールChaos Monkeyを、Netflixがオープンソースで公開](http://www.publickey1.jp/blog/12/chaos_monkeynetflix.html)
>Chaos MonkeyはAmazonクラウド上で使うツール。Amazonクラウド上のインスタンスをランダムに落としまくることで、サービスに対して仮想的な障害を引き起こしてくれます。NetflixはこのChaos Monkeyを実環境で使うことで、本物の障害が起きたとしてもサービスが継続できることをテストし続けてきました。

![Chaos Monkeyイメージ](https://tctechcrunch2011.files.wordpress.com/2012/07/chaosmonkey.jpeg?w=672)
素敵なツールですよね。**狂った猿のようにサーバーを壊しまくるツール。** そんな狂った猿がいても、システム全体としては問題がないように、障害対策を自動化していくわけです。壊されても自動復帰するシステム。システムの鏡です。

今回の記事は、じつは、**最近、私自身がChaos Monkey的だ**と気づいてしまったので、その反省の意を込めて、**Chaos Ken.T”(ケイオスケンティー)への対策を狂った私自ら実施しよう、という趣旨**です。

#背景
弊社、株式会社ソラコムはSORACOM AirをはじめとするIoTプラットフォームを提供しておりますが、もちろん、ドッグフーディング（Dogfooding）ということで、チームメンバー自ら、SORACOM AirのSIMを、**docomoさんやSIMフリーの電話やタブレットに挿して自分のケータイとして使っています**。つまり、ソラコムに入ると、**AWSのみならず、SORACOMも使い放題**なんです(笑 特にエンジニアの人にとっては最高の福（自粛

それはさておき、私は立場上、色々な場所で講演しますが、その際によくリアルにSORACOM Airデモをお見せします。チームメンバーが使っているSIMを登録しているSORACOMの会社アカウントを使って、回線をしたり、**速度クラスを変えたりするのです。特に、**速度クラスの変更は、SORACOM Airの目玉機能**であるので、よく実施します。

「はい、s1.fastから、s1.minimumに変わりました！なんと速度がリアルタイムに2Mbpsから32kbpsに変わるわけです！」
[![デモ動画](http://img.youtube.com/vi/u_4PeS9qpP4/0.jpg)](http://www.youtube.com/watch?v=u_4PeS9qpP4)


デモ的には非常にわかりやすく、おーー、という感じになるのですが、私もついつい興奮してしまって、**速度を遅いものにしたままそのまま忘れることが多々ありますw** そうすると、一番上のSIMの速度が遅いままになる、その人にとっては**とんだお仕置き**になってしまうという事象が頻繁におきています。懺悔します。

ということで、"Chaos Ken.T”対策ですが、一言でいうと、
**「狂ったCEOのKen.Tがときどき、速度を遅くしやがるから、速度がおそくされたときにも、速度を元の速度に戻すようにしておきたい」**ということになります。

SORACOMでやるには色々なやり方があります。さっと思いつくだけでも以下のオプションが考えられます。

1. グループ名を変えて、狂ったKen.Tを牽制する
2. 狂ったKen.Tが暴れても、デバイス側で自ら戻す
3. 狂ったKen.Tが荒れたら、イベントハンドラで元に戻す
4. 狂ったKen.Tを無視して、SORACOMのAPIを使って定期的に速度を戻す

この他にも考えられますが、とりいそぎこの4つについて考えてみましょう。

## グループ名を変えて、狂ったKen.Tを牽制する

SORACOMには[グループ](https://dev.soracom.io/jp/start/beam/)という機能があり、各SIMをそこに簡単に所属させることができます。この機能を使って、「重要データ転送中」などすれば、狂ったCEOへの牽制になるわけです。
![image](https://qiita-image-store.s3.amazonaws.com/0/6069/5cd4e4ad-263e-0379-854e-aba8c776bd4e.png)


## 狂ったKen.Tが暴れても、デバイス側で自ら戻す

速度をおとされた場合でも、遅いなと思ったらデバイス側で簡単にもどせれば問題ないわけです。これは、最近発表されたSORACOM Airのメタデータ機能を使うと良いでしょう。

[SORACOM Air メタデータサービスのご紹介](https://blog.soracom.jp/blog/2015/11/27/air-metadata/)
>一言で言うならば、Air 経由で特殊な URL に HTTP アクセスする事で、認証なしで SIM(Subscriber) の情報を取得したり、API実行を行える、という機能です
![image](https://qiita-image-store.s3.amazonaws.com/0/6069/11de147e-14d2-bce5-3f55-e782c5736a5f.png)

このブログ記事にあるように、デバイス側から、メタデータ機能を使うことで、自分が遅くされたと思っても、すぐに速度を戻すことができます。ただ、32kbpsにされたときは、このスクリプトを呼ぶのに時間がかかるので、キャッシュしておかないと厳しいでしょう。誰かえらい人がアプリを作ってくれると最高です。
![image](https://qiita-image-store.s3.amazonaws.com/0/6069/d414dafd-5843-59ad-9445-9889c9cf5d31.png)


## 狂ったKen.Tが荒れたら、イベントハンドラで元に戻す

SORACOMのプラットフォームでは非常に便利なイベントハンドラ機能が提供されています。イベントハンドラは、ソラコムで発生したイベントに基づいて処理を行う仕組みです。

[イベントハンドラ機能紹介]
(https://dev.soracom.io/jp/docs/event_handler/)
[イベントハンドラ紹介スライド (by c9katayama)]
(http://www.slideshare.net/SORACOM/soracom-dev-conf-0-lt)
>SORACOM Airの「監視」機能は、内部的にはイベントハンドラー機能を利用して実現されています。 イベントハンドラー機能を使用すると、特定のSIM・特定のグループ・特定のタグ・全SIMに対してデータ転送容量の閾値を元に、メールでの通知・速度クラスの変更・AWS Lambdaファンクションの実行をする事が出来ます。 コンソールの「監視」設定よりも複雑な処理を行いたい場合には、イベントハンドラーのAPIを使用して設定を行う必要があります。

例えば、SubscriberSpeedClassAttributeRule (SIMの速度クラスが変更されたらアクションを実行するルール)を用いれば、速度クラスが変更されるたびに、すぐにクラスを指定しておいたものに戻してしまう、という設定が可能です。狂ったCEOは、速度クラスを変更しても、そのすぐ後にすぐに戻ってしまっていることに気づくでしょう(デモの意味ないかもw

##狂ったKen.Tを無視して、SORACOMのAPIを使って定期的に速度を戻す

SORACOMはプログラマブルな通信プラットフォームですので、[APIが提供されており](https://dev.soracom.io/jp/docs/api/)、プログラムでコントロールできます。いくらCEOが狂っていてばんばん速度を変えるといっても、定期的に速度を戻してあげれば問題ありません。定期的にAPIをたたくにあたって、やはりここはみんな大好きAWS Lamdaでしょうか。

[【AWS発表】AWS Lambdaのアップデート – Python, VPC, 実行時間の延長, スケジュールなど
](http://aws.typepad.com/aws_japan/2015/10/aws-lambda-update-python-vpc-increased-function-duration-scheduling-and-more.html)

最近、AWS Lambdaのスケジュール機能が発表されているので、これを用いて定期的にSORACOM APIをたたいて速度を戻すのが吉でしょう。

#最後に
弊社では、1の方法はすでに実施しています。しかし、それでも狂ったKen.Tはたまに変更したまま忘れてしまうので、2を併用しつつ、3, 4を適宜実装しようかと思います。なんにせよ、人間というものは誰にせよときに狂ってしまうものなので、APIで自動化が大事。

玉川 ([Ken Tamagawa](https://twitter.com/kentamagawa))