データレイクのおじさん

Noteもやってます:https://note.com/yukinkoyuki

AWS Subnet内で利用されていないIPを取得する(Pick up dynamically unused Private Ip Address from subnet on AWS )

普通に家で書いて、普通に実務で使ってるもの。

EC2のインスタンスに対して、空いているprivate IP をセカンダリIPとして設定したかったので、空いているIPを動的に取得してその値を用いる必要があった。

コードは以下。

list all private in CIDR

今回は、ドカスカ立ち上がるEMRの中で空いているものを見つけるというもの

少しだけコード紹介

こちらは、EMRがマスターノードかそうでないか?を判定している。 今回は、ワーカーノードには必要のない処理だったのでこの処理を入れている。

isMaster=$(cat /emr/instance-controller/lib/info/instance.json | jq .isMaster)

if ! "${isMaster}" ; then
  echo "slave server"
  exit 0
fi

ここで現在使っている、IPの一覧を取得してip.txtに保存

# consumed ip addres by others including self
aws ec2 describe-network-interfaces  | jq  -r .[][] | grep "PrivateIpAddress" | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | cut -d':' -f 2 | tr -d \" | tr -d , | tr -d " " | sort | uniq > /tmp/ip.txt

対象のCIDRを取得して

cidr=$(ip r | awk '{print $ 1}' | grep '/')

CIDR内におけるブロードキャストIPを利用しているIPとして追加

ipcalc -b $cidr | cut -d'=' -f 2 >>  /tmp/ip.txt

AWSにおいては、最初の4つと、ブロードキャストを除いて、一番後ろのIPは予約されているので、そちらも利用一覧に追加する

nmap -sL $cidr | awk '/Nmap scan report/{print $NF}' | tr -d '()' | sort -V |  head -n 4 >>  /tmp/ip.txt
nmap -sL $cidr | awk '/Nmap scan report/{print $NF}' | tr -d '()' | sort -V |  tail -n 1 >>  /tmp/ip.txt

CIDRにてとりうるIPの全て

# list adresses
nmap -sL $cidr | awk '/Nmap scan report/{print $NF}' | tr -d "()" > /tmp/ip_range.txt

あとはip_range.txtにあって、ip.txt似ないものを探している。

while 
¥¥¥¥

gist連携やってみたかった