gumiアドベントカレンダー12日目です。
本日はちょっと息抜き系の内容です。
1.背景的なもの
ソーシャルゲームのサーバー運用を長らく行っていると、「Xさんは、念じるだけでサーバーを起動できる」とか、「Yさんは、一呼吸でサーバーを数十台起動できる」などの都市伝説が社内に蔓延し始めます。
日々インフラを運用する中で、TerraformやAnsibleなどでサーバーを準備するだけでは、このような社内の期待に応えられていないという葛藤を抱えていました。
社内もVR/AR時代を迎えている現状なので、
もっとクールに
もっとエレガントに
もっとスタイリッシュに
サーバーを準備できないかと考えていたところ、家の中で眠っていたこいつを思い出しました。
そろそろ存在を忘れられていそうなLeapMotionです。
LeapMotionのSDKとして、PythonやJavaなどが準備されているので、
「AWS SDKと組み合わせれば、AWS操作できるんじゃね?」と思ったので、実験がてらやってみました。
2.検証結果
2-1.召喚(起動)
このような感じで、EC2の召喚(起動)に成功しました。
ファイル容量の関係ですごく見づらいですが、stopped->pendingへの状態遷移がわかるかと。
2-2.破壊(停止)
停止はこのような感じです。
数十台停止する際に、自席で「滅びよ…」とか喋り始めると、なかなかに雰囲気が出そうな気がします。
こちらは、running->stoppingへの状態遷移がわかるかと。
3.環境準備
3-1.virtualenv環境設定
non-AppleなPythonでLeapMotionを動かす方法でもあるように、MacデフォルトのPython以外を使うと、なかなかにハマることがあるので、virtualenvを作成する際に、Macデフォルトのpythonを指定してあげる$ mkvirtualenv -p /usr/bin/python leap
3-2.SDKダウンロード
LeapMotionのSDKダウンロードサイトから、Mac用のtgzをダウンロードする。
3-3.SDKインストール
LeapPython.soとlibLeap.dylibをvirtualenv環境下に配置する。$ cp LeapPython.so libLeap.dylib ~/.virtualenvs/leap/lib/python2.7/site-packages
3-4.boto3インストール
AWS操作用に、boto3をインストールする。$ pip install boto3
4.サンプルコード
LeapMotionのドキュメントを見ながら、以下のようなスクリプトを準備しました。
#!/usr/bin/env python # coding: utf8 import sys import Leap import boto3 # Variable INSTANCE_ID = "i-xxxxxxxx" ACCESS_KEY = "XXXXXXXXXXXXXXXXXXXX" SECRET_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" REGION = "us-west-2" def session_init(): try: session = boto3.Session( aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, region_name=REGION) return session except Exception, e: print(e) pass def ec2_summon(): try: session = session_init() ec2 = session.resource('ec2') instance = ec2.Instance(INSTANCE_ID) instance.start() instance.wait_until_running() except Exception, e: print(e) pass def ec2_destroy(): try: session = session_init() ec2 = session.resource('ec2') instance = ec2.Instance(INSTANCE_ID) instance.stop() instance.wait_until_stopped() except Exception, e: print(e) pass class summon_listener(Leap.Listener): def on_connect(self, controller): print "Connected" def on_frame(self, controller): frame = controller.frame() for gesture in frame.gestures(): if gesture.type is Leap.Gesture.TYPE_CIRCLE: circle = Leap.CircleGesture(gesture) # Circle Radius Adjust # 小さすぎるサークルでEC2をStartしないように調整 if circle.radius > 50: print "EC2 Summon!!" ec2_summon() if gesture.type is Leap.Gesture.TYPE_SWIPE: swipe = Leap.SwipeGesture(gesture) # Swipe Direction Adjust # 片方向へスワイプしたときにEC2をStop if swipe.direction[0] > 0: print "EC2 Destroy!!" ec2_destroy() def main(): listener = summon_listener() controller = Leap.Controller() controller.add_listener(listener) # Gesture Enable # ジェスチャー有効化 controller.enable_gesture(Leap.Gesture.TYPE_CIRCLE) controller.enable_gesture(Leap.Gesture.TYPE_SWIPE) print "Press Enter to quit..." try: sys.stdin.readline() except KeyboardInterrupt: pass finally: controller.remove_listener(listener) if __name__ == "__main__": main()
LeapMotionで認識できるアクションはいくつかあるのですが、
EC2の召喚には、一番厨二っぽいアクションでEC2を操作できそうなCircleGestureを、
EC2の破壊には、一番厨二っぽいアクションでEC2をなぎ払えそうなSwipeGestureを採用しました。
5.まとめ
それなりのスタイリッシュさで、EC2を操作することができました。
LeapMotionの最新版SDKでは、Oculusとかと連携できるようなので、
近い将来キーボードやマウスなどを使わずにAWSを操作する時代がくるかも?