続 カッコの付け方

AWSを始めとしたクラウドコンピューティング全般と、唯一神emacsにおける()の付け方についてだらだら書きます

AWS Route53 Private DNS へ自動登録してみる

既に色々なところでネタにされているので、そこそこおもしろいことやります。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ロールも忘れずに

f:id:iga-ninja:20141223144830p:plain

NameタグとDomainタグを足します。

f:id:iga-ninja:20141223144829p:plain

起動させて、しばらくすると

f:id:iga-ninja:20141223144831p:plain

ちゃんと動きました!ちなみにPrivate DNSとは書いたものの、別にPublicでもいけます。(ニーズがあるかはわかりませんが)