読者です 読者をやめる 読者になる 読者になる

EC2インスタンス起動時にRoute53のリソースレコードを更新する

EC2は完全従量制でインスタンスを起動していないときには、EBSを除きほぼ課金が発生しないため、検証用など必要なときだけすぐにサーバを準備できるので非常に便利です。ただ、必要なときしか使わないインスタンスに、Elastic IPアドレス(固定IP)を割り当てるとインスタンスが稼動していないときにも課金されてしまいます($0.01/hなので、1日のうち10時間しか使わないとすると、だいたい0.01×14h×30×85円=357円)。
Elastic IPを使わないとIPアドレスインスタンスの起動のたびに変更されてしまうので、必要なときだけ起動するという使い方だと不便です。これを改善するため、インスタンスの起動時にDNSサーバのレコードを更新して、登録しているホスト名でインスタンスにアクセスするという方法があると思います。DNSはBINDでもいいですが、せっかくなのでRoute53を使います。
コマンドラインからRoute53を操作する
このエントリでインストールしたCli53というRoute53を操作するスクリプトを使ってRoute53のAレコード更新します。登録するゾーンはあらかじめ作成しておきます。以下のコマンドは、example.comというゾーンのAレコードに自身のPublic IPを登録します。このコマンドをインスタンスの起動時に実行するようにしておきます。

curl -s http://169.254.169.254/latest/meta-data/public-ipv4 | xargs -i cli53.py rrcreate example.com foo A {} --ttl 600 --replace

CNAMEとしてPublic DNSのホスト名を登録する場合にはこうなります。

curl -s http://169.254.169.254/latest/meta-data/public-hostname | xargs -i cli53.py rrcreate example.com foo CNAME {} --ttl 600 --replace

Public DNSのホスト名は、AWSのDNSサーバに登録されるホスト名で、東京リージョンのインスタンスであれば、ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.comとなります(XXXの部分はIPアドレス)。
Public DNSのホスト名はEC2インスタンスで名前解決するとPrivate IPアドレスに解決されるので、EC2インスタンス間であれば内部ネットワークのみで通信が完結します。Public IPアドレスを使うと、tracerouteで確認した限りは内部ネットワークのみでは完結しないように見えます(同一セキュリティグループでの通信にもならない)。