EC2のpython API boto を使ってみる

EC2にはさまざまな言語でAPIが提供されている,python用のバインディングとして,botoというものがある.botoはEC2だけでなくAWS全般へのインターフェイスを提供している.これをつかって,EC2のインスタンスがrunningになるまでの時間を計ってみた.

botoの使い方

ライブラリはzipで提供されている.unzipするとディレクトリができる.この中にsetup.pyがあるので,これを実行してインストールしても良いし,このディレクトリにPYTHONPATHを通すだけでもよい.

実行

残念ながらドキュメントはあんまり整備されていないのだが,ソースがあるのでなんとでもなる.ここにbotoをつかってEC2を起動するサンプルがある.

import boto

ec2_conn = boto.connect_ec2(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
images = ec2_conn.get_all_images(image_ids=[IMAGE_ID])

reservation = images[0].run(min_count=1,max_count=1, key_name=KEY_NAME)
print reservation.instances[0]

こんな感じ.instance の状態はinstance.stateで得られる.instance.update()を行うとポーリングを行う.

ということで,instanceがpendingからrunningになるまでの時間を
計ってみた.

import boto
import time

AWS_ACCESS_KEY_ID=XXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXX
IMAGE_ID="ami-2b5fba42"
KEYNAME="gsg-keypair"

def waitFor(i, func):
    while True:
        i.update()
        print 'state = ', i.state
        if func(i):
            break
        time.sleep(5.0)


def main():
    ec2_conn = boto.connect_ec2(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
    images = ec2_conn.get_all_images(image_ids=[IMAGE_ID])
    print images[0]
    reservation = images[0].run(min_count=1,max_count=1, key_name=KEY_NAME)
    print reservation
    
    initial_time  =  time.time()
    instance =  reservation.instances[0]

    waitFor(instance, lambda i: i.state != 'pending')
    started = time.time()
    print instance, "is running, took ", started - initial_time, "sec"

    instance.stop()
    waitFor(instance, lambda i: i.state == 'terminated')

if __name__ == "__main__":
    main()

これを実行すると,下のような出力が得られた.インターバル5秒でポーリングしているので,精度はその程度なのだけど,大体45秒-50秒ぐらいでrunningになるようだ.もちろん,runningはOSのブートが開始したことを意味するだけなので,実際に使えるようになるにはさらにOSのブート時間がかかる.

Image:ami-2b5fba42
Reservation:r-5935bf30
Instance:i-ae412ac7
state =  pending
...
state =  pending
state =  running
Instance:i-ae412ac7 is running, took  47.9908208847 sec
state =  shutting-down
...
state =  shutting-down
state =  terminated