PythonでAWS(EC2)操作

最近は仕事の9割がAWS(Amazon Web Service)環境となっていて、毎日のようにインスタンスを立ち上げてchefでサーバの構築をしています。
数が少ないうちはWEBのManagement Consoleでぽちぽちやっていたんですが、いい加減面倒。なにが面倒ってサーバによってはデータ領域をEBSにしたりSecurityGroupを作ったり。
さらに作業を面倒にしているのが複数のAWSアカウント。プロジェクトによってAWSアカウントを分けていたりして、その度にサインアウトしてサインインして、もう!という感じでした。

環境変数を変えながらec2-api-toolで頑張ってました

僕の作業環境はMacなので、最初のうちは(というか今でも)それぞれのアカウントの認証情報を環境変数に設定するshell scriptを用意して、ec2-api-toolsを使って操作していました。
例えば以下のように。

$ #account-01の認証情報(aws_access_key_idとか)が書いてあるファイルをsourceで読み込む
$ source account-01.rc
$ ec2-describe-instances
   .
   .
   .

SecurityGroupを確認したり設定したりする時はこれが便利。
しかし、Instanceを起動したりEBSを作ったりはこれではまだまだ手間がかかるのでスクリプトで一発で作れるようにしてみました。

botoを使ってpythonでインスタンス起動

スクリプトでやるメリットは

  • インスタンス起動時にcloud-initでホスト名を設定するためにuser_dataを設定する
  • インスタンス起動と同時にtag:Nameにホスト名を設定する
  • インスタンスのホスト名から判断して適切なSecurityGroupを設定する
  • インスタンスのホスト名から判断してEBSが必要な場合はEBSを作って、EBSのTag:Nameに名前を付けて、インスタンスにAttachする

と、こんなところです。
将来的にはchefへの登録もこの流れにのせられるかなと思っています。

実はスクリプトでのインスタンス起動は前からbash+ec2-api-toolでやってたのですが、その時は単独アカウントと1種類のサーバのみだったので、管理アカウントが増えた今回はpythonで作り直すことにしました。

なぜpythonかって?そりゃ好きだからです。
これまではサーバ管理用スクリプトはbashでムリがあるものはperlでやっていたのですが、正直perlにはあまり良い思い出が無く、1年ぐらい前にpythonを使い始めて、それ以降はこの手のスクリプトはpythonで作るようになっています。

まずは上記を実装すべくPython用のEC2のSDKであるbotoを使って作ってみました。
コード全てを載せるのもアレなので、ハマったところやドヤ顔できる部分を抜粋します。

複数アカウントの認証関連情報はiniで管理

今回の目的の一つである複数アカウント対応は、iniファイルを使って認証関連情報を管理することにしました。
僕にpythonを勧めてくれた後輩君に「pythonで設定ファイルなら何が良い?xml?ini?」と聞いたら「ini」と即答。iniはConfigParserで一発で使えるとのこと。確かにラクチンでした。

例えば以下のようなiniファイルを用意します。

$ cat hoge.ini
[account-01]
aws_access_key_id=xxxxxxxxxxxxxxxxxxxxxxx
aws_secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
account_id=xxxxxxxxxxx

[account-02]
aws_access_key_id=xxxxxxxxxxxxxxxxxxxxxxx
aws_secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
account_id=xxxxxxxxxxx

これをpythonで使うにはこうします。

import ConfigParser

# オブジェクト作成
ini = ConfigParser.SafeConfigParser()

# ini読み込み
ini.read("/path/to/hoge.ini")

# account-01のaws_access_key_idを取り出す
aws_access_key_id = ini.get("account-01","aws_access_key_id")

簡単です。

こんな感じで各アカウントの情報をiniにまとめて引数でそれぞれの情報をセットするようにしました。

botoの基本的な使い方

botoのドキュメントはこちら。http://docs.pythonboto.org/
今回はこの中のEC2を使ってインスタンスの起動をしています。

ec2 APIに接続します。

import boto.ec2
region = "ap-northeast-1"
auth = {
  "aws_access_key_id":ini.get('account-01', 'aws_access_key_id'),
  "aws_secret_access_key": ini.get('account-02',aws_secret_access_key')
}

# region指定でec2に接続
conn = boto.ec2.connect_to_region(region, **auth)

っと、ここまで書いて疲れちゃいましたので続きはまた今度。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です