こんにちは、河野です。
今年はへび年でした。なので、Pythonをやりましょうといった話が年始に話題になっていたりしました。
http://anond.hatelabo.jp/20130101082333
はてブも現時点で934もありますね。
ちなみに、この記事の中では、2系と3系どっちにするか?というところが歯切れが悪かったのですが、ウェブアプリケーションを前提とすると、主要なウェブフレームワークはすでに3系に対応していますし、3系で良いと思います。
私は前職でPythonを使ってECを構築したりしてたんですが、転職後ほとんど触る機会がなかったし、今回はbotoで遊んでみようと思います。ぎりぎり今年中にPython触っとこうという感じです。
botoとは?
botoはAWSを操作するためのライブラリです。
aws-cliでも使用されていて、AWSではPython版のSDKとして紹介されています。
AWS SDK for Python | アマゾン ウェブ サービス(AWS 日本語)
botoのインストール
botoは、PyPIの情報を見た感じでは3系にはまだちゃんと対応してないようです。(aws-cliはpython3に対応しているのですが、どうやらbotoの開発版を使っているようです)
私の環境はcentosなので、まずは、pythonのパッケージ管理ツールであるpipをyumで入て、pip経由でbotoをインストールします。
ついでに対話的に操作しやすくなる、ipythonも入れておきます。
1 2 3 |
$ sudo yum install python-pip $ sudo pip install boto $ sudo pip install ipython |
簡単ですね。
実際に使ってみる
早速ipythonを起動して、botoを触ってみましょう。
1 |
$ ipython |
起動するとコンソールにpythonのコードが入力できるようになります。
とりあえず動作確認ということで、EC2のリージョン一覧を表示してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
In [1]: import boto.ec2 In [2]: for region in boto.ec2.regions(): ...: print(region.name) ...: ap-southeast-1 ap-southeast-2 us-west-2 us-east-1 us-gov-west-1 us-west-1 cn-north-1 sa-east-1 ap-northeast-1 eu-west-1 In [3]: exit |
ちゃんとリージョンの名称が表示されましたね。
botoの認証について
ここから先の操作は認証が必要になるので、IAMで認証情報を取得しておきます。
必要になるのは、AccessKeyIDとSecretAccessKeyです。
botoの認証方法については以下に詳細が書いてあります。
Boto Config — boto v2.21.1
今回は環境変数を使用します。
1 2 3 |
$ export AWS_ACCESS_KEY_ID= $ export AWS_SECRET_ACCESS_KEY= $ ipython |
EC2インスタンス一覧の取得・起動・停止
では、EC2のインスタンス一覧を取得し、特定のインスタンスの起動と停止を行ってみます。
インスタンス一覧の取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
In [1]: from boto import ec2 In [2]: ec2conn = ec2.connect_to_region("ap-northeast-1") In [3]: instances = [i for r in ec2conn.get_all_instances() for i in r.instances] In [4]: print(instances) [Instance:i-11111111, Instance:i-22222222, Instance:i-33333333, Instance:i-44444444, Instance:i-55555555, Instance:i-66666666] In [5]: for instance in instances: ...: print("id: {0}, state: {1}, private_ip: {2}".format(instance.id, instance.state, instance.private_ip_address)) ...: id: i-11111111, state: stopped, private_ip: 172.31.17.31 id: i-22222222, state: stopped, private_ip: 172.31.31.130 id: i-33333333, state: stopped, private_ip: 172.31.26.255 id: i-44444444, state: stopped, private_ip: 172.31.25.106 id: i-55555555, state: stopped, private_ip: 172.31.20.209 id: i-66666666, state: stopped, private_ip: 172.31.28.231 |
boto.ec2.connect_to_reginoでリージョンに接続します。boto.ec2.connection.EC2Connectionのオブジェクトが返ってきます。
このec2connに対して、get_all_instancesを呼び出すと、インスタンスの一覧が取得できそうですが、boto.ec2.instance.Reservationのリストが返ってきます。
Reservationはinstancesというプロパティでboto.ec2.instance.Instanceのリストを持っています。
なので、2重ループでEC2インスタンスのリストを生成しています。
最後に、取得したインスタンスのリストからインスタンスIDと起動の状態、プライベートアドレスを表示してみました。
インスタンスの起動
インスタンスを起動してみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
In [7]: instance = instances[0] In [8]: instance.state Out[8]: u'stopped' In [9]: instance.start() In [10]: instance.state Out[10]: u'pending' In [11]: instance.update() Out[11]: u'running' |
インスタンスの起動も簡単ですね。stateで起動の状態が確認できますが、updateを実行しないと情報が更新されません。
インスタンスの停止
1 2 3 4 5 6 7 8 9 10 |
In [13]: instance.state Out[13]: u'running' In [14]: instance.stop() In [15]: instance.state Out[15]: u'stopping' In [17]: instance.update() Out[17]: u'stopped' |
インスタンスの停止も簡単ですね。
まとめ
今回やったようなことであれば、aws-cliを使った方が手っ取り早いと思うのですが、自動化したりとか、細かな制御を行ったりする場合に使えるのかなと思います。
また、EC2インスタンスの起動・停止について言えば、コールバックなどを渡せなくて、自分でupdateしないといけないので、自動化したりする場合には、もう少し工夫が必要そうですね。