この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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 などで切り替えれば(参照元ホストのインスタンスをリブートするなどで)対応できますね。