AWS Route53 PrivateDNS

  • 2019.11.15
  • AWS
AWS Route53 PrivateDNS

はじめに

Route53を使ってPrivateDNSを構築してみます。すでにVPCとサブネットは作成済みの状態から実施します。

Route53 ホストゾーン作成

次のコマンドでRoute53のプライベートホストゾーンを作成します。caller-referenceは一意となる文字列を入力します。日付にすることが多いようです。

$ aws route53 create-hosted-zone --name waku.local --caller-reference 2019-11-14T16:53 --hosted-zone-config Comment=,PrivateZone=true --vpc VPCRegion=ap-northeast-1,VPCId=$vpc_id
{
    "Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z09552783JC3STY3MCO8F",
    "HostedZone": {
        "Id": "/hostedzone/Z09552783JC3STY3MCO8F",
        "Name": "waku.local.",
        "CallerReference": "2019-11-14T16:53",
        "Config": {
            "PrivateZone": true
        },
        "ResourceRecordSetCount": 2
    },
    "ChangeInfo": {
        "Id": "/change/C18T7ENJWI4UXB",
        "Status": "PENDING",
        "SubmittedAt": "2019-11-14T07:59:47.833Z"
    },
    "VPC": {
        "VPCRegion": "ap-northeast-1",
        "VPCId": "vpc-04e72e6413b624d29"
    }
}

DHCPオプションセットの作成

次のコマンドでDHCPオプションセットを作成します。

オプションについて簡単に説明します。domain-name は、EC2インスタンスの名前のサフィックスに関係してきます。デフォルトではEC2インスタンスの名前は東京リージョンの場合はip-privateip.ap-northeast-1.compute.internal といった名前になります。このap-northeast-1.compute.internalがサフィックスです。DNSにAレコードを設定した場合は、waku.localというサィックスをつけたいので、ここで指定してやります。このように複数指定する場合はスペース区切りでしていしてやります。

また、domain-name-serversは文字列で AmazonProvidedDNS を指定します。AmazonProvidedDNSは Amazon DNSサーバーでインターネットゲートウェイを介して通信する必要があるインスタンスに対してDNSが有効となるようです。

$ aws ec2 create-dhcp-options --dhcp-configurations "Key=domain-name-servers,Values=AmazonProvidedDNS" "Key=domain-name,Values=ap-northeast-1.compute.internal waku.local"
{
    "DhcpOptions": {
        "DhcpConfigurations": [
            {
                "Key": "domain-name",
                "Values": [
                    {
                        "Value": "ap-northeast-1.compute.internal waku.local"
                    }
                ]
            },
            {
                "Key": "domain-name-servers",
                "Values": [
                    {
                        "Value": "AmazonProvidedDNS"
                    }
                ]
            }
        ],
        "DhcpOptionsId": "dopt-06972234e3774588d"
    }
}
$ aws ec2 create-tags --resources dopt-06972234e3774588d --tag Key=Name,Value=dhcp_wakulocal

VPCの設定

最初にVPCのEnableDnsSupportとEnableDnsHostnamesが true になっていることを確認しておきます。trueになっていない場合は設定しておきます。

$ aws ec2 describe-vpc-attribute --attribute enableDnsSupport --vpc-id $vpc_id
{
    "VpcId": "vpc-04e72e6413b624d29",
    "EnableDnsSupport": {
        "Value": true
    }
}
$ aws ec2 describe-vpc-attribute --attribute enableDnsHostnames --vpc-id $vpc_id
{
    "VpcId": "vpc-04e72e6413b624d29",
    "EnableDnsHostnames": {
        "Value": true
    }
}

先ほど作成したDHCPオプションセットをVPCに割り当てます。

$ aws ec2 associate-dhcp-options --dhcp-options-id dopt-06972234e3774588d --vpc-id $vpc_id

EC2インスタンスの作成

テスト用に2つEC2インスタンスを作成します。

EC2インスタンス作成用JSONファイルです。

{
    "ImageId": "ami-0064e711cbc7a825e",
    "InstanceType": "t2.micro",
    "KeyName": "myawskey-tokyo",
    "MaxCount": 1,
    "SecurityGroupIds": [
        "sg-04b4e7642a8fc6efe"
    ],
    "SubnetId": "subnet-0b99e52d17314979d"
}

次のコマンドを2回実行し2つのEC2インスタンスを作成します。この時に作成されたEC2インスタンスのPrivateIpAddressを控えておきます。

$ aws ec2 run-instances --cli-input-json file://ec2-amazonlinux.json
(出力略)
$ aws ec2 run-instances --cli-input-json file://ec2-amazonlinux.json
(出力略)

DNSレコードセットの追加

次のようなJSONファイルを作成します。ここで、先ほど控えておいたPrivateIpAddressを使用します。それぞれins01.waku.localとins02.waku.localに割り当てます。

{
    "Comment": "waku.local ec2 instances ",
    "Changes": [{
        "Action": "CREATE",
        "ResourceRecordSet": {
            "Name": "ins01.waku.local.",
            "Type": "A",
            "TTL": 300,
            "ResourceRecords": [{ "Value": "10.1.0.107"}]
	}},
		{
		    "Action": "CREATE",
		    "ResourceRecordSet": {
			"Name": "ins02.waku.local.",
			"Type": "A",
			"TTL": 300,
			"ResourceRecords": [{ "Value": "10.1.0.231"}]
		    }
		}
	       ]
}

追加するHostedZoneIdを確認し、DNSレコードを追加します。

$ aws route53 list-hosted-zones
{
    "HostedZones": [
        {
            "Id": "/hostedzone/Z09552783JC3STY3MCO8F",
            "Name": "waku.local.",
            "CallerReference": "2019-11-14T16:53",
            "Config": {
                "PrivateZone": true
            },
            "ResourceRecordSetCount": 2
        }
    ]
}

$ aws route53 change-resource-record-sets --hosted-zone-id /hostedzone/Z09552783JC3STY3MCO8F --change-batch file://dns-record4.json
{
    "ChangeInfo": {
        "Id": "/change/C9B0VI9Z64NSK",
        "Status": "PENDING",
        "SubmittedAt": "2019-11-14T08:39:43.021Z",
        "Comment": "waku.local ec2 instances "
    }
}

動作確認

ins01.waku.localにsshでログインし動作確認をしてみます。

まずはresolv.confのsearchにwaku.localが対象となっていることを確認します。

$ ssh -i $key ec2-user@ec2-hoge.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-hoge.ap-northeast-1.compute.amazonaws.com (hoge)' can't be established.
ECDSA key fingerprint is SHA256:9sWWb3hgZVmQ9rNehoge.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-hoge.ap-northeast-1.compute.amazonaws.com,hoge' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
13 package(s) needed for security, out of 26 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-1-0-107 ~]$ cat /etc/resolv.conf 
; generated by /usr/sbin/dhclient-script
search ap-northeast-1.compute.internal waku.local
options timeout:2 attempts:5
nameserver 10.1.0.2

ちゃんと追加されていますね。

それではins02に対して名前解決できるかnslookupしてみます。

$ nslookup ins02
Server:		10.1.0.2
Address:	10.1.0.2#53

Non-authoritative answer:
Name:	ins02.waku.local
Address: 10.1.0.182

正常に名前解決できました。