Amazon EC2 でドメイン名からローカル IP アドレスを特定するには
EC2 上で複数のインスタンスを連携してサービスを構築する場合、参照先のIPアドレスを特定したいことが多々あります。
固定の IP アドレスを持つには、Elastic IP を使えばよいですが、なるべくドメイン名によってその辺の制御を行いたくなります。
AWS のネットワークは NAT のような状況なので、クラウド内で閉じたネットワークアクセスにはローカル IP 宛でアクセスしたいものです。
Elastic IP はグローバル IP を固定するものであり、ローカル IP はインスタンスの再起動などで変わってしまいます。
これ自体は、EC2 インスタンスの Public DNS から逆引きすることで、クラウド内では DNS がローカル IP アドレスを自動で返してくれます。
以上の仕組みを利用して、ドメイン名からローカル IP を次の手順で導けます。
- ドメイン名から正引きしてグローバル IP アドレスを取得する。
- グローバル IP アドレスを逆引きして EC2 の Public DNSを取得する。
- Public DNSを正引きして EC2 のローカル IP を取得する。
getent コマンドを使ってスクリプトにしてみました。
get_local_ip_from_fqdn
#!/bin/bash # # Get Local IP from FQDN # ######################### FQDN=$1 echo $FQDN GLOBALIP=`getent hosts $FQDN | awk '{ print $1 }'` echo $GLOBALIP EC2FQDN=`getent hosts $GLOBALIP | awk '{ print $2 }'` echo $EC2FQDN LOCALIP=`getent hosts $EC2FQDN | awk '{ print $1 }'` echo $LOCALIP
実行結果
$ ./get_local_ip_from_fqdn dev.classmethod.jp dev.classmethod.jp 175.41.XXX.XXX ec2-175-41-XXX-XXX.ap-northeast-1.compute.amazonaws.com 10.152.XXX.XXX
サービスに対してドメイン名が固定であれば、そこから現在動いているホストのローカル IP アドレスを取得して、設定ファイルにセットすることができます。
例えば、あるホストが参照先になる場合、そのホストにドメイン名を割り当てておけば、参照元のホスト内で設定を毎回書き換えなくても、Route 53 などで切り替えれば(参照元ホストのインスタンスをリブートするなどで)対応できますね。