2014/06/19
Amazon AWS 上でホスト情報を取得する
Amazon AWS で ELB + AutoScaling を利用している場合など、
IP アドレスが頻繁に変わってしまうので、
グローバルIP、プライベートIP を取得して一覧表示するスクリプト。
ホスト名は Name タグの Value に格納されている必要がある。
aws コマンドは EC2 インスタンスで Amazon Linux を起動した場合は
標準でインストールされている筈。
EC2 インスタンスに適切な role が設定されていれば aws はそのまま動作するが、
role が設定されていない場合でも設定する事で利用可能になる。
引数でホスト名 (Name タグで指定された値) が指定された場合、 デフォルトではグローバル IP のみを出力するが -p オプションでプライベートIP のみを表示する。
1#!/bin/sh 2 3# リージョン 4region="--region ap-northeast-1" 5# 出力はテキスト形式 6output="--output text" 7# 出力項目を指定 (ホスト名(=タグ)、インスタンスID、パブリックIP、プライベートIP 8base="--query Reservations[*].Instances[*]." 9# Name タグの値表示 10name="Tags[?Key==\`Name\`].Value," 11# インスタンスID、パブリックIP、プライベートIP 12default="${name}InstanceId,PublicIpAddress,PrivateIpAddress" 13# フィルタ指定 (running 状態のみ出力) 14filter="--filter Name=instance-state-name,Values=running" 15 16# aws コマンド 17aws="/usr/bin/aws ec2 describe-instances ${region} ${output}" 18 19# メイン関数 20function doit() 21{ 22 23 local _filter _query 24 25 if [ -n "${1}" ] 26 then 27 _filter="${filter} Name=tag:Name,Values=${1}" 28 _query=${base}[${3}${2}] 29 else 30 _filter=${filter} 31 _query=${base}[${default}] 32 fi 33 34 ${aws} ${_filter} ${_query} 35 36} 37 38# オプション解析 39if opt=`getopt p $*` 40then 41 set -- ${opt} 42 while [ -n "${1}" ] 43 do 44 case "${1}" in 45 -p ) 46 target=PrivateIpAddress;; 47 -- ) 48 shift 49 break;; 50 esac 51 shift 52 done 53else 54 echo "Usage: ${0##*/} [-p][host [... host]" 1>&2 55 exit 255 56fi 57 58if [ $# -eq 1 ] 59then 60 doit ${1} ${target:-PublicIpAddress} 61elif [ $# -gt 0 ] 62then 63 for i in $* 64 do 65 doit ${i} ${target:-PublicIpAddress} ${name} 66 done | awk '{ if(NR % 2) ip = $0; else printf "%s %s\n", $0, ip }' 67else 68 doit | awk '{ if(NR % 2) ip = $0; else printf "%s %s\n", $1, ip }' 69fi