AWSのサービスで最初に思い浮かべるのは何でしょうか。
やはりEC2ではないかと思います。
今回はbotoによるEC2インスタンスにの操作について解説します。
事前に Key pair やセキュリティグループを作成しておきましょう。
>>> import boto
>>> from boto.ec2.regioninfo import RegionInfo
まずはモジュールのインポートです。
>>> AWS_ACCCESS_KEY = 'your access key'
>>> AWS_SECRET_KEY = 'your secret key id'
おなじみのアクセスキー、シークレットキーを用意します。
>>> REGION_ENDPOINT = 'ec2.ap-northeast-1.amazonaws.com'
ここで Endpoint を指定しています。下記のURLから使用するリージョンのエンドポイントを参照します。
http://docs.amazonwebservices.com/general/latest/gr/rande.html
今回は日本リージョンを使用します。
>>> region = RegionInfo(endpoint=REGION_ENDPOINT)
>>> ec2 = boto.connect_ec2(AWS_ACCCESS_KEY, AWS_SECRET_KEY,region=region)
Retion オブジェクトを作成し、access key, secret key, region を指定し ec2 へ接続します。
リージョンを指定して ec2 へ接続する場合、boto.ec2.connect_to_region() も使用できますが、他のサービスでは類似のメソッドが無いので、共通の方法を使用します。
>>> resv = ec2.run_instances(image_id='ami-2819aa29',key_name='your key',security_groups=['your sg name'],instance_type='t1.micro')
AMI を amazon linux(x64)、インスタンスタイプを ti.micro、キーペア、セキュリティグループのリストを指定します。
resv は Reservation オブジェクトです。これはインスタンス作成毎に生成され、同時に作成したインスタンスのコレクションです。
>>> i = resv.instances[0]
>>> i.add_tag(key='Name', value='test-boto')
Reservation からinstanceを取得し、Nameタグを設定しています。
常にインスタンスを必要としないのであれば、必要な場合のみインスタンスを起動し、それ以外では停止させてランニングコストを抑えます。
・インスタンスの開始
>>> i.start()
・インスタンスの停止
>>> i.stop()
・インスタンス情報の再取得(返り値はインスタンスのstate文字列)
>>> i.update()
u'running'
i.state でも取得できそうですが、これは最新の状態を表していません。update() にて常に最新の状態を取得する方が良いですね。時々インスタンスの起動・停止に失敗することがあるので、update()による状態取得は自動処理では必要になります。
・public dns の取得
>>> i.public_dns_name
u'ec2-xxx-xxx-xx-xx.ap-northeast-1.compute.amazonaws.com'
elastic IP を利用していない場合、インスタンス起動毎に外部DNS名(とIPアドレス)が変化するため、このプロパティから取得します。
・Tagの取得
>>> i.tags.get('Name')
u'test-boto'
インスタンスを特定する一つの方法として、特定のタグに一意の値を設定しておき、それを参照します。
またReservationはインスタンス作成毎に生成されるため、インスタンスを都度作成していると、別々のReservation作成され個々の instance オブジェクトの取得が面倒になりがちです。
下記のように内包表記を使用すれば、全てのinstanceオブジェクトのリストを取得できます。
>>> [i for r in ec2.get_all_instances() for i in r.instances]
タグの Name の部分一致で取得するなら下記のようになるでしょう。
>>> [i for r in ec2.get_all_instances() for i in r.instances if 'test' in i.tags.get('Name')]
上記は Name に test を含むインスタンスのリストを取得します。
get_all_instances()にfilter条件を設定してリストを絞れるようですが、タグの部分一致と完全一致を使い分けるなどの柔軟性で内包表記をよく使います。
次回はbotoからS3を操作する方法について紹介します。