Sử dụng kết hợp Cloudwatch, Route53 và Lambda cũng là một tùy chọn nếu bạn lưu trữ ít nhất một phần của dns của bạn trong Route53. Ưu điểm của việc này là bạn không cần bất kỳ ứng dụng nào đang chạy trên bản thân cá thể đó.
Để sử dụng phương pháp này, bạn định cấu hình quy tắc Cloudwatch để kích hoạt hàm Lambda bất cứ khi nào trạng thái của phiên bản EC2 thay đổi để chạy. Hàm Lambda sau đó có thể lấy địa chỉ IP công khai của cá thể và cập nhật bản ghi dns trong Route53.
Các Lambda có thể giống như thế này (sử dụng Node.js runtime):
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);
});
});
}
Bạn sẽ cần phải thực hiện Lambda với một vai trò đó có quyền truy cập để mô tả EC2 và cập nhật các bản ghi trong Route53.
Điều này có thể sẽ không được trả lời, nhưng tôi cũng quan tâm đến câu trả lời. Nếu tôi sở hữu "example.com" và có máy chủ DNS của riêng mình, tôi có thể chuyển hướng "foo.example.com" sang phiên bản EC2 không? –
Vâng, để trả lời câu hỏi meta của riêng tôi, tôi đã gán một IP đàn hồi cho cá thể của mình và sau đó tạo một bản ghi A cho nó. Bạn cũng có thể tạo bản ghi CNAME cho tên DNS công khai của cá thể, nhưng điều đó không ổn định vì tên DNS công cộng thay đổi khi bạn dừng và khởi động lại cá thể. –
Trên thực tế, khi bạn gán một IP đàn hồi, bạn có thể dự đoán tên DNS công cộng sẽ được tạo: ec2 - {{Elastic IP}}. {{AWS AZ}}. Compute.amazonaws.com. Nếu bạn gán một cname cho DNS đó trong route 53, nó sẽ luôn luôn trỏ đúng vào cá thể mà bạn gán EIP cho nó. Điều này có lợi thế của việc giải quyết cho IP EC2 bên trong khi bạn đang ở trong mạng EC2 và IP đàn hồi công cộng chính xác khi ở bên ngoài. – jslatts