ccl*_*eve 42 dns amazon-ec2 amazon-route53
我们使用Route 53 DNS指向EC2实例.有没有办法让Route 53直接指向实例,而不是Elastic IP或CNAME?
我有多种原因:
我不想刻录IP.
CNAME是不可靠的,因为如果实例关闭并重新启动,则全名ec2-XXXX.compute-1.amazonaws.com将会更改.
在将来,我需要以编程方式启动实例并使用子域解决它们,我认为使用弹性IP或CNAME没有简单的方法.
什么是最好的方法?
kix*_*orz 16
我为这个问题编写了自己的解决方案,因为我对这里介绍的其他方法不满意.使用Amazon CLI工具很不错,但是它们比使用其他Amazon API库(例如Ruby)的直接API调用更慢.
这是我的AWS Route53 DNS实例更新 Gist 的链接.它包含IAM策略和Ruby脚本.您应该在IAM面板中创建一个新用户,使用附加的策略(包含您的区域ID)更新它,并在Ruby脚本中设置凭据和参数.第一个参数是托管区域中实例的主机名别名.实例的私有主机名是别名<hostname>.<domain>,实例的公共主机名是别名<hostname>-public.<domain>
更新:这是指向实例启动时注册主机名的AWS Route53 DNS实例更新init.d脚本的链接.如果想以类似的方式使用AWS Route53 DNS负载平衡,这是另一个.
小智 5
如果您坚持使用route53,则可以创建一个脚本,以便每次重新启动时更新该实例的CNAME记录.
看到这个 - > http://cantina.co/automated-dns-for-aws-instances-using-route-53/(披露,我没有创建这个,虽然我用它作为类似情况的跳跃点)
更好的是,因为您提到能够以编程方式启动实例,这种方法应该指导您实现这一目标.
另见 - > http://docs.pythonboto.org/en/latest/index.html
如果您至少将部分 dns 托管在 Route53 中,那么结合使用 Cloudwatch、Route53 和 Lambda 也是一种选择。这样做的好处是您不需要在实例本身上运行任何应用程序。
要使用这种方法,您需要配置 Cloudwatch 规则以在 EC2 实例的状态更改为正在运行时触发 Lambda 函数。然后,Lambda 函数可以检索实例的公共 ip 地址并更新 Route53 中的 dns 记录。
Lambda 可能看起来像这样(使用 Node.js 运行时):
var AWS = require('aws-sdk');
var ZONE_ID = 'Z1L432432423';
var RECORD_NAME = 'testaws.domain.tld';
var INSTANCE_ID = 'i-423423ccqq';
exports.handler = (event, context, callback) => {
var retrieveIpAddressOfEc2Instance = function(instanceId, ipAddressCallback) {
var ec2 = new AWS.EC2();
var params = {
InstanceIds: [instanceId]
};
ec2.describeInstances(params, function(err, data) {
if (err) {
callback(err);
} else {
ipAddressCallback(data.Reservations[0].Instances[0].PublicIpAddress);
}
});
}
var updateARecord = function(zoneId, name, ip, updateARecordCallback) {
var route53 = new AWS.Route53();
var dnsParams = {
ChangeBatch: {
Changes: [
{
Action: "UPSERT",
ResourceRecordSet: {
Name: name,
ResourceRecords: [
{
Value: ip
}
],
TTL: 60,
Type: "A"
}
}
],
Comment: "updated by lambda"
},
HostedZoneId: zoneId
};
route53.changeResourceRecordSets(dnsParams, function(err, data) {
if (err) {
callback(err, data);
} else {
updateARecordCallback();
}
});
}
retrieveIpAddressOfEc2Instance(INSTANCE_ID, function(ip) {
updateARecord(ZONE_ID, RECORD_NAME, ip, function() {
callback(null, 'record updated with: ' + ip);
});
});
}
Run Code Online (Sandbox Code Playgroud)
您将需要使用有权描述 EC2 实例和更新 Route53 中记录的角色来执行 Lambda。
| 归档时间: |
|
| 查看次数: |
27715 次 |
| 最近记录: |