- 2014-09-05 (金) 13:56
- AWS
Route 53 に EC2 インスタンスの Public DNS を CNAME で登録して、それを EC2 インスタンス間での通信でも利用するという話です。
1. 前提
- EC2-Classic 環境
- EC2 インスタンスの接続情報(FQDN なり IP なり)は、AWS のメンテナンスによる再起動などで変更される。
- アプリケーションやミドルウェアで、別インスタンスに接続している場合、AWS から割り当てられる Public DNS や IP を設定ファイルなどに記述していると、変更の度に修正が必要になる。
- DNSサーバを立てようとしたが、そこまで変更の頻度は多くない(日常的にインスタンス数が増減するわけではない)ので、正直わざわざ立てるほどでも無い。また、DNS サーバの面倒も見たくない。
2. やりたいこと
- Route 53 で各ホストの接続情報を管理すれば、一元管理できるし、修正も一箇所で済む。
- DNS サーバの面倒を見る必要が無いし、自分で運用するより安心。(Route53 は、SLA 100%)
- EC2 インスタンスごとに FQDN を割り当てて、CNAME として EC2 インスタンスの Public DNS を設定する。
- Public DNS を設定するのは、同じ FQDN で、AWS 外部からはグローバル IP、内部ではプライベート IP を返せるようにするため。
- 外部からのアクセスは、Security Group で制限する。
3. 設定
3-1. Route 53 で、サブドメインを作る
まず、EC2 インスタンス用のサブドメインを作成します。これは FQDN の管理の都合上だけなので、すでに存在してるドメインに、CNAME レコードを追加しても問題無いです。
ここでは、example.com を保持しているとして、サブドメインとして aws.example.com を作成します。EC2 インスタンスは、web1.aws.example.com や db-master.aws.example.com などにします。
まず、Route 53 の画面で、「Create Hosted Zone」をクリックして、新しいゾーンを作成します。Domain Name
には今回作成するサブドメインを記述します。
ゾーンを作成すると、Delegation Set
が割り当てられます。これは後で、委譲先として設定するのでコピーしておきます。
aws.example.com をサブドメインとして設定します。ここでは、example.com ドメインを Route 53 で管理している想定なので、それ以外の場合は、それぞれ適時設定して下さい。
すでにある exaple.com ゾーンを開いて、「Create Record Set」をクリックして、新しいレコードセットを作成します。画面右側のフォームで、「Name
に aws
を、Type
に NS - Name server
を入力します。Value
には、先ほどコピーしておいた aws.example.com ゾーンの Delegation Set
の内容をペーストします。
これで aws.example.com の設定ができました。
3-2. Route 53 で、EC2 インスタンスの FQDN を設定する
あとは、作成した aws.example.com に、レコードセットを追加して、EC2 インスタンスの Public DNS を CNAME として登録していくだけです。
ここでは、Web サーバとして使っている EC2 インスタンスの Public DNS を、web1.aws.example.com に割り当てます。
まず、EC2 の Public DNS を確認します。Management Console では下記のように表示されているので、これをコピーしておきます。
次に、Route 53 で、aws.example.com ゾーンを選択して、「Create Record Set」をクリックします。フォームには、以下のように、Name
に web1
、Type
に CANE - Canonical name
、Value
に先ほどコピーした EC2 インスタンスの Public DNS を設定します。
これで設定は完了です。
3-3. 動作確認
設定した FQDN が引けるかどうか確認します。(実際は、実在の FQDN で実行してますが、ここでは例示のため、exmaple.com ドメインとしています。)
まず、EC2 インスタンス内で引いてみます。こちらでは、10.0.yyy.yyy というローカル IP が引けました。
[ec2-user@ip-10-xxx-xxx-xxx]$ dig web1.aws.example.com ;; ANSWER SECTION: web1.aws.example.com. 300 IN CNAME ec2-54-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com. ec2-54-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com. 60 IN A 10.0.yyy.yyy
次に、AWS の外部で引いてみます。54.yyy.yyy.yyy というグローバル IP が引けました。
$ dig web1.aws.example.com (snip) ;; ANSWER SECTION: web1.aws.example.com. 300 IN CNAME ec2-54-xxx-xxx-x.ap-northeast-1.compute.amazonaws.com. ec2-54-xxx-xxx-x.ap-northeast-1.compute.amazonaws.com. 604800 IN A 54.yyy.yyy.yyy
どちらも正常に動作していることが確認できました。
4. 利用
アプリケーションやミドルウェアなどで、EC2 インスタンスへ接続する場合は、今回設定した web1.aws.example.com
を設定します。AWS 内部であれば、ローカル IP が引けるので、内部ネットワークで接続できます。
動作確認などで、外部から接続する場合も同じく web1.aws.example.com へ接続します。AWS 外部であれば、グローバル IP が引けるので、該当インスタンスへ接続することができます。
5. Public DNS が変更した場合
EC2 インスタンスの再起動などで、Public DNS が変更になった場合は、Route 53 にて、web1.aws.example.com の Value
を新しいインスタンスの Public DNS に設定するだけです。
さいごに
Route 53 で、EC2 インスタンスの Public DNS を設定する方法を見てきました。
ここでは、EC2 インスタンスの話を書いていますが、RDS や ElastiCache などのエンドポイントも同じように Route 53 で FQDN を割り当てておくと、もしエンドポイントが変更になった際も変更箇所が限定されているので楽です。
ただ、Route 53 に登録するということは、当然ながら、誰もが Public DNS を知ることができるという点は留意しておく必要があります。(もちろん、FQDN も知る必要がありますが)個人的には、Security Group で接続制限をかけていれば問題は無いと思いますが、これまずいんじゃない?というのがあれば、教えて下さい m(_ _)m