Tomorrow Will Be A Better Day

Published

- 5 min read

✝LeapMotionで、厨二病っぽくEC2の起動召喚を行う✝

img of ✝LeapMotionで、厨二病っぽくEC2の起動召喚を行う✝

gumiアドベントカレンダー12日目です。 本日はちょっと息抜き系の内容です。

1.背景的なもの

ソーシャルゲームのサーバー運用を長らく行っていると、「Xさんは、念じるだけでサーバーを起動できる」とか、「Yさんは、一呼吸でサーバーを数十台起動できる」などの都市伝説が社内に蔓延し始めます。

日々インフラを運用する中で、TerraformやAnsibleなどでサーバーを準備するだけでは、このような社内の期待に応えられていないという葛藤を抱えていました。
社内もVR/AR時代を迎えている現状なので、

  • もっとクールに
  • もっとエレガントに
  • もっとスタイリッシュに

サーバーを準備できないかと考えていたところ、家の中で眠っていたこいつを思い出しました。 leapmotion.png

そろそろ存在を忘れられていそうなLeapMotionです。
LeapMotionのSDKとして、PythonやJavaなどが準備されているので、 「AWS SDKと組み合わせれば、AWS操作できるんじゃね?」と思ったので、実験がてらやってみました。

2.検証結果

2-1.召喚(起動)

このような感じで、EC2の召喚(起動)に成功しました。
ec2_summon.GIF

ファイル容量の関係ですごく見づらいですが、stopped->pendingへの状態遷移がわかるかと。

2-2.破壊(停止)

停止はこのような感じです。
数十台停止する際に、自席で「滅びよ…」とか喋り始めると、なかなかに雰囲気が出そうな気がします。
ec2_destroy.GIF

こちらは、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を操作する時代がくるかも?