プレイヤーズ・ハイ

 雑多な日記

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 レコードを手動更新してもよいですが、毎回やるとなると面倒です。

自動化のために以下のツールを使用します。

barnybug/cli53・GitHub

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
#!/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