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使ってみた話は後で書く。