LoginSignup
5
4

More than 5 years have passed since last update.

botoでインスタンス名に任意のプレフィックスを持つEC2インスタンスの情報を取得する

Last updated at Posted at 2014-04-19

botoって??

AWSを操作するPython用のSDKのことだそうな。(Python以外のSDKにもコードネームほしい

準備

インストール

pipコマンドで入れるのが楽そうです

$ sudo yum install python-pip
$ sudo pip install boto

認証情報(AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEY)の設定

コードにベタ書きはしたくないので設定ファイルに定義する。
どうやら、「/etc/boto.cfg」、「~/.boto」の順に探すみたいで、今回はユーザ毎にしておきたいので、~/.botoに以下のフォーマットに従って定義する

[Credentials]
aws_access_key_id = <your access key>
aws_secret_access_key = <your secret key>

番外:これでハマりました。。。

ドキュメントには見当たらなかったのですが、botoの実装みると、環境変数に"AWS_CREDENTIAL_FILE"が定義されているか確認して、定義されていればそちらの設定を優先するロジックになっています。

当初botoのimportでConfigPaserクラスでエラーが出て「え???」となってしまったのですが、
AWS_CREDENTIAL_FILEに設定されていたファイルのヘッダー(1行目)に、「==========」という文字列が含まれていることが原因でした。あまり同じエラーで悩む人はいないと思いますが、参考までに。(そもそもなぜにそんなヘッダーになっていたのか謎。。

実装してみる

import boto
import boto.ec2
from boto.ec2.connection import EC2Connection
from boto.ec2.regioninfo import RegionInfo
import re

def get_ec2_instances(region_end_point, re_pt):
    region = RegionInfo(endpoint = region_end_point)
    ec2_connection = boto.ec2.connection.EC2Connection(region = region)

    result = []
    instances = [i for r in ec2_connection.get_all_instances() for i in r.instances]
    for i in instances:
        if re_pt.match(i.tags['Name']):
            result.append(i)

    return result

if __name__ == "__main__":
    re_pt = re.compile('production')
    ec2_instance_list = get_ec2_instances('ec2.ap-northeast-1.amazonaws.com', re_pt)

    print(ec2_instance_list)

これで東京リージョンから"production"というプレフィックスをインスタンス名とするEC2のインスタンス情報を取得できました。

所感など

  • Python始めて書いたけど、慣れてくると気持ちいいかもしれない。
  • インデントが強制されることで、フォーマットが統一できるのはいいですね。(ツールやルールでの強制は破れてしまう可能性があるしめんどうなので。。)
  • もっとスマートな書き方があればどなたか教えてください。
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4