AWSでインスタンスIDからそのインスタンスのIPアドレスを調べる

いまvagrant, was, chefあたりを使いつつサーバのセットアップをしてるのですが、その中でEIPを振ってないインスタンスに対してknife走らせるにはどうすればいいか検討している中で試したのでめも。EIPのないインスタンスはstop/startするとIPが変わってしまうので、そこをよしなにしたい。

EC2 API Tools (SDKs and Programming Toolkits for AWS) を使うと簡単にできる。

まずは、以下を参考にaccess key, secret keyを取得しておく。
EC2 API ToolsでアクセスキーIDとシークレットアクセスキーを使う – サーバーワークスエンジニアブログ

あとは、EC2 API Toolsを落としてきて、pathなどを通す。(環境はCentOS6.4)

# 必要なpackageをinstall
$ sudo yum install unzip java-1.6.0-openjdk
$ mkdir ~/src && cd ~/src
$ wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip
$ mkdir ~/bin
$ unzip ec2-api-tools.zip
$ ln -s ~/src/ec2-api-tools-1.6.7.3 ~/bin/ec2-api-tools

# pathを通したり
$ cat > ~/.awsrc
export JAVA_HOME=/etc/alternatives/jre
export EC2_HOME=$HOME/bin/ec2-api-tools
export AWS_ACCESS_KEY=YOUR_ACCESS_KEY
export AWS_SECRET_KEY=YOUR_SECRET_KEY
export EC2_URL=https://ec2.ap-northeast-1.amazonaws.com
export PATH=$PATH:$JAVA_HOME/bin:$EC2_HOME/bin
$ echo 'source ~/.awsrc' >> ~/.bashrc
$ source ~/.bashrc

最後に.bashrcから読むようにしているけど、vagrant-awsがdefaultで環境変数からaccess/secret keyを使うようになっていたりするので、複数AWSアカウントを運用したりする場合は.bashrcでは読まずに別ファイルに分けて、使うときに適宜sourceする感じがよさそう。

あとはこんな感じで、instance idからIPがわかるので、それ使ってknifeするなりする。そこラップするknife-solo-aws的なものあったら便利っぽいかなと妄想しつつ。

$ ec2-describe-instances {instance_id} | grep NICASSOCIATION | awk '{print $2}'

$ cat bin/get_ip_from_ec2_instance_id.sh
#!/bin/sh
ec2-describe-instances $1 | grep NICASSOCIATION | awk '{print $2}'
$ ./bin/get_ip_from_ec2_instance_id.sh {instance_id}

実装ちゃんと読んでないけどvagrant-awsでも.vagrant以下にinstance idを保持していて、似たようなことやってるんだと思う。だからinstanceをstop/startしてIPが変わっても同じインスタンスsshすることができる。

とここまでやってみたけど、手元の環境から複数台にknife/deployするのは、ネットワーク環境が悪いときとかにこわいので、同じVPC内にadminサーバを立ててそこからやるのがいいんじゃないかって話にまとまった。
vagrant-aws使ってみた話は後で書く。