EC2 インスタンス起動時に Route 53 管理の DNS レコードを更新
目次
環境
- Amazon Linux AMI 2013.09.2 - ami-0d13700c (64-bit)
背景
開発用 EC2 インスタンスは使わないときは止めておきたいものです。Elastic IP は「EC2 インスタンに associate していない」ときに課金されます($ 0.01 / hour)。
ゴール
そこで、実現したいことは以下のようになります。
「EC2 インスタンス起動後、自動的に割り当てられる Public IP アドレスにて (Route 53 管理の) DNS レコードを更新」
実装
自分自身の Public IP アドレスを調べるときは以下のコマンドを EC2 インスタンスにて実行します。
curl -s http://169.254.169.254/latest/meta-data/public-ipv4
このコマンドにて得られる Public IP アドレスを使って Route 53 Management Console にて DNS レコードを手動更新してもよいですが、毎回やるとなると面倒です。
自動化のために以下のツールを使用します。
cli53 のインストール
# pip でインストールしますので入っていない場合は以下のコマンドでインストールします。 $ sudo easy_install pip $ sudo pip install cli53
easy_install が入っていない場合は以下のコマンドでインストールします。
$ sudo yum install python-setuptools
Access Key ID と Secret Access Key の設定
~/.boto に以下を記述して設定します。
[Credentials] aws_access_key_id = <your access key> aws_secret_access_key = <your secret key>
cli53 による A レコードの追加 (更新)
ここでは、自分自身の Public IP アドレスにて、A レコード「www.example.com」を追加 (更新) してみたいと思います(TTL 60 秒)。
curl -s http://169.254.169.254/latest/meta-data/public-ipv4 | xargs -i cli53 rrcreate example.com www A {} --ttl 60 --replace # 以下のようなレスポンスが返ってきたら成功です INFO Success INFO ChangeInfo: INFO Status: PENDING INFO SubmittedAt: 2014-03-12T08:21:12.807Z INFO Id: /change/CJPYMHE6RZSVT
確認
以下のコマンドで、Route 53 まわりの状況を確認できます。
$ cli53 list
起動時の自動実行
/etc/rc.d/rc.local に追記して、起動時に自動実行させます。
# Credentials export AWS_ACCESS_KEY_ID=<your access key> export AWS_SECRET_ACCESS_KEY=<your secret key> # (Regist) or Update DNS A record (in Route 53) of www.example.com curl -s http://169.254.169.254/latest/meta-data/public-ipv4 | xargs -i cli53 rrcreate example.com www A {} --ttl 60 --replace
Credentials を /etc/rc.d/rc.local に書いてしまっているので、一般ユーザーからも読めてしまい、イケてる実装とは言い難いですが、ゴールを達成することはできます。
【追記】起動時の自動実行につきまして (ほんのちょっぴりセキュアに)
任意のユーザーを作成し、以下のシェルスクリプトを crontab に登録しておけば、他の一般ユーザーから Credentials の値を読まれることはありません。
ユーザー
- work
シェルスクリプト
- update_DNS_A_record.sh
- chmod 700 update_DNS_A_record.sh
- update_DNS_A_record.sh
#!/bin/sh # Credentials export AWS_ACCESS_KEY_ID=<your access key> export AWS_SECRET_ACCESS_KEY=<your secret key> # (Regist) or Update DNS A record (in Route 53) of www.example.com curl -s http://169.254.169.254/latest/meta-data/public-ipv4 | xargs -i cli53 rrcreate example.com www A {} --ttl 60 --replace
- crontab
@reboot /home/work/update_DNS_A_record.sh