Amazon EC2 でドメイン名からローカル IP アドレスを特定するには

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

EC2 上で複数のインスタンスを連携してサービスを構築する場合、参照先のIPアドレスを特定したいことが多々あります。
固定の IP アドレスを持つには、Elastic IP を使えばよいですが、なるべくドメイン名によってその辺の制御を行いたくなります。 AWS のネットワークは NAT のような状況なので、クラウド内で閉じたネットワークアクセスにはローカル IP 宛でアクセスしたいものです。

Elastic IP はグローバル IP を固定するものであり、ローカル IP はインスタンスの再起動などで変わってしまいます。
これ自体は、EC2 インスタンスの Public DNS から逆引きすることで、クラウド内では DNS がローカル IP アドレスを自動で返してくれます。

以上の仕組みを利用して、ドメイン名からローカル IP を次の手順で導けます。

  1. ドメイン名から正引きしてグローバル IP アドレスを取得する。
  2. グローバル IP アドレスを逆引きして EC2 の Public DNSを取得する。
  3. 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 などで切り替えれば(参照元ホストのインスタンスをリブートするなどで)対応できますね。