我正在进行的项目要求我们使用自己的子域名屏蔽 AWS EC2 主机名。
例如:
ec2-176-34-163-40.eu-west-1.compute.amazonaws.com 将映射到 gf53ef.domain.com
和
ec2-123-31-124-60.eu-west-1.compute.amazonaws.com 将映射到 sdfrh5.domain.com
总会有一个可用的列表来存储域之间的关系。
此列表一直在变化。这意味着在一分钟内我们可能会启动 100 多个新的 ec2 实例,而下一分钟所有实例都可能终止。
我想知道如何设置我们的 Ubuntu 服务器来处理这种情况。
谢谢
答案1
我在 openstack 云上做了类似的事情,例如 DNS 名称更新(可能不像您的要求那样动态;-),基本上我们有一个named
接受动态更新的绑定实例。
我使用 webmin 使用 RNDC 配置远程控制,以及基本的绑定配置。
然后生成一个用于远程访问的密钥,并将其分发给你的控制节点;
dnssec-keygen -a hmac-md5 -b 128 -n HOST remote-key
区域文件最终如下所示;
zone "mydomain.com" {
type master;
file "master/mydomain.com";
allow-update { key "remote-key"; };
};
allow-update
提供许可更新主区域,allow-notify
从区域是等效的。
然后您可以执行类似的操作(nsupdate
从 bind-utils)来更新来自客户端的记录,我还没有测试过 CNAME 更新,但它应该看起来像这样;
cat <<EOF | nsupdate -d -k "$KEY"
server ns1.mynameserver.com
zone domain.com
update delete gf53ef.domain.com.
update add gf53ef.domain.com. IN CNAME ec2-176-34-163-40.eu-west-1.compute.amazonaws.com.
send
EOF
(您可能需要仔细检查 CNAME 示例的格式……)
这似乎是的配置参考文档named
;
http://www.zytrax.com/books/dns/ch7/xfer.html
可以从这些教程中获得示例;
http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-bind-rndc.html
http://dag.wieers.com/howto/bits/bind-ddns.php
http://linux.yyz.us/nsupdate/
http://www.semicomplete.com/articles/dynamic-dns-with-dhcp/
答案2
感谢@CS3
目前我们的解决方案是 Route53。
以下是我们的设置方法(PHP)。我们使用了这个库:http://www.orderingdisorder.com/aws/route-53/
private function getDomain() {
$sub = "e-".substr(md5($this->instance->dnsName), 2, 4);
$domain = $sub.".domain.com";
$dnsRecords = $this->route53->listResourceRecordSets('/hostedzone/123');
$exists = false;
foreach($dnsRecords["ResourceRecordSets"] as $dnsRecord) {
if($dnsRecord["Name"] == $domain."."
AND $dnsRecord["Type"] == "CNAME") {
$exists = true;
break;
}
}
if(!$exists) {
$change = $this->route53->prepareChange('CREATE', $domain.".", 'CNAME', 300, $this->instance->dnsName);
$this->route53->changeResourceRecordSets('/hostedzone/123', $change);
}
return $domain;
}
private function removeDomain() {
$change = $this->route53->prepareChange('DELETE', $this->domain.".", 'CNAME', 300, $this->instance->dnsName);
$this->route53->changeResourceRecordSets('/hostedzone/123', $change);
$this->domain = null;
}