既に色々なところでネタにされているので、そこそこおもしろいことやります。AWSのRoute53がPrivateDNSとしても利用可能となりました。VPC内だけで通用するホスト名をドメイン管理できるということです。また、アサインするVPCも複数選べるようなので、AWSの中では有効に使えます。
用途は色々考えられますが、インスタンス起動時に、EC2のタグを拾い、勝手に登録するまでやってみました。結構面倒ですが、手順と考え方を
まず、EC2が起動したタイミングでDNS登録したいので、cloud-initで行きます。route53にアクセスするので、IAMロールが必要です。但しroute53へのフルアクセスだと不味いので、arnをprivateのHost_zoneだけに絞ります。aws cliだけでもいけるとは思いますが、上記のEC2タグの取得やら、そもそもRoute53へのUPSERT(INSERT & UPDATEの混ざった造語)をやるのは結構面倒なので、pythonで書きます。
まずは、PrivateのHosted_Zoneを作ります。ここは省略します。
次に、 PrivateのHosted_Zoneへの権限と、EC2へのフルアクセスを持つIAMロールを作製します。JSONを貼っておきます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1415262371000", "Effect": "Allow", "Action": [ "ec2:*" ], "Resource": [ "*" ] }, { "Sid": "Stmt1415262384000", "Effect": "Allow", "Action": [ "route53:*" ], "Resource": [ "arn:aws:route53:::hostedzone/[your_hosted_zone_id]" ] } ] }
スクリプトは下記です。Nameタグ + "." + DomainタグをFQDNとして、CNAMEレコードを足します。値は、もともとのPrivate-IPに付いている、ドメイン名です。なお、同じNameタグのものが複数あった場合は、新しいもので上書きです。この辺りは上手く調整して下さい。また、Domain名からHosted_Zone_IDを探したいのですが、(IAMを緩くしない限り)どうやってもそれは出来なかったので、ハードコードです。
#!/bin/env python # -*- coding: utf-8 -*- import boto.utils import boto.route53 import boto.ec2 meta = boto.utils.get_instance_identity() instanceId = meta['document']['instanceId'] region = meta['document']['region'] meta = boto.utils.get_instance_metadata() localname = meta['local-hostname'] ec2 = boto.ec2.connect_to_region(region) list_instances = ec2.get_only_instances(instanceId) instance = list_instances[0] ins_tag = instance.tags fqdn = ins_tag['Name'] + '.' + ins_tag['Domain'] route53 = boto.route53.connect_to_region(region) rrs = boto.route53.record.ResourceRecordSets(route53, 'YOUR_HOSTED_ZONE_ID') change = rrs.add_change('UPSERT', fqdn, 'CNAME') change.add_value(localname) rrs.commit()
後は仕込みです。スクリプトはS3からダウンロードとしました。
User Dataに仕込みます。IAMロールも忘れずに
NameタグとDomainタグを足します。
起動させて、しばらくすると
ちゃんと動きました!ちなみにPrivate DNSとは書いたものの、別にPublicでもいけます。(ニーズがあるかはわかりませんが)