L'utilisation de Cloudwatch, Route53 et Lambda est également une option si vous hébergez au moins une partie de votre DNS dans Route53. L'avantage est que vous n'avez besoin d'aucune application en cours d'exécution sur l'instance elle-même. Pour utiliser cette approche, vous devez configurer une règle Cloudwatch pour déclencher une fonction Lambda chaque fois que l'état d'une instance EC2 passe à l'exécution. La fonction Lambda peut ensuite récupérer l'adresse IP publique de l'instance et mettre à jour l'enregistrement DNS dans Route53.
Le Lambda pourrait ressembler à ceci (en utilisant l'exécution 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);
});
});
}
Vous devrez exécuter le Lambda avec un rôle qui a des autorisations pour décrire les instances EC2 et les enregistrements de mise à jour dans Route53.
Cela ne sera probablement pas répondu, mais je suis également intéressé par la réponse. Si je possède "example.com" et que j'ai mes propres serveurs DNS, puis-je diriger "foo.example.com" vers une instance EC2? –
Eh bien, pour répondre à ma propre méta-question, j'ai assigné une adresse IP élastique à mon instance, puis créé un enregistrement A pour cela. Vous pouvez également créer un enregistrement CNAME pour le nom DNS public de l'instance, mais ce n'est pas stable puisque le nom DNS public change lorsque vous arrêtez et redémarrez l'instance. –
En fait, une fois que vous affectez une adresse IP élastique, vous pouvez prédire le nom DNS public qui sera créé: ec2 - {{Elastic IP}}. {{AWS AZ}}. Compute.amazonaws.com. Si vous affectez un nom de c à ce DNS dans la route 53, il doit toujours pointer correctement vers l'instance à laquelle vous attribuez l'EIP. Cela a l'avantage de se résoudre à l'IP EC2 interne lorsque vous êtes à l'intérieur du réseau EC2 et l'adresse IP publique correcte à l'extérieur. – jslatts