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