Route 53 DNSを使用してEC2インスタンスをポイントしています。 Elastic IPまたはCNAMEではなく、インスタンスを直接指すようにRoute 53を取得する方法はありますか?
これには複数の理由があります。
IPを焼きたくありません。
CNAMEは信頼できません。インスタンスがダウンして再びアップすると、フルネームec2-X-X-X-X.compute-1.amazonaws.comが変更されるためです。
将来的には、プログラムでインスタンスをスピンアップし、サブドメインでインスタンスを処理する必要があります。これをエラスティックIPまたはCNAMEで簡単に行う方法はありません。
最善のアプローチは何ですか?
ここで紹介した他のアプローチに不満だったため、この問題に対する独自の解決策を書きました。 Amazon CLIツールを使用するのはいいことですが、他のAmazon APIライブラリ(Rubyなど)を使用した直接API呼び出しよりもIMHOが遅い傾向があります。
AWS Route53 DNSインスタンスの更新 要点へのリンクを次に示します。 IAMポリシーとRubyスクリプト。IAMパネルで新しいユーザーを作成し、アタッチされたポリシー(ゾーンIDを含む)で更新し、資格情報とパラメーターを設定する必要があります。 Ruby script。最初のパラメーターはホストゾーンのインスタンスのホスト名エイリアスです。インスタンスのプライベートホスト名は<hostname>.<domain>
にエイリアスされ、インスタンスのパブリックホスト名は<hostname>-public.<domain>
にエイリアスされます
[〜#〜] update [〜#〜]:ここにリンクがあります AWS Route53 DNSインスタンス更新init.dスクリプト インスタンスの起動時にホスト名を登録します。同様の方法で AWS Route53 DNS負荷分散 を使用する場合は、次のようになります。
Route53の使用に固執する場合は、再起動するたびにそのインスタンスのCNAMEレコードを更新するスクリプトを作成できます。
これを参照してください-> http://cantina.co/automated-dns-for-aws-instances-using-route-53/ (開示、これは作成しませんでしたが、同様の状況のジャンプポイント)
さらに良いのは、プログラムでインスタンスをスピンアップできることを述べたので、このアプローチはその目的に役立つはずです。
Route53のDNSの少なくとも一部をホストする場合、Cloudwatch、Route53、およびLambdaの組み合わせを使用することもできます。これの利点は、インスタンス自体で実行されているアプリケーションを必要としないことです。
このアプローチを使用するには、EC2インスタンスのステータスが実行中に変わるたびにLambda関数をトリガーするようにCloudwatchルールを設定します。 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);
});
});
}
EC2インスタンスを記述し、Route53のレコードを更新する権限を持つロールでLambdaを実行する必要があります。
Route 53を使用すると、Elastic Load Balancer(ELB)にマップするエイリアスレコードを作成できます。
http://docs.amazonwebservices.com/Route53/latest/DeveloperGuide/HowToAliasRRS.html
AWS EC2インスタンスで試したことはありませんが、動作するはずです。マシンのパブリックIPを検出し、awsルート53の特定のレコードを更新する小さなJavaプログラムを作成しました。
唯一の要件は、EC2インスタンスにJavaをインストールする必要があることです。
プロジェクトは https://github.com/renatodelgaudio/awsroute5 でホストされており、必要に応じて自由に変更することもできます
ブート時またはcrontabジョブとして実行するように設定して、次のような手順に従って新しいパブリックIPでレコードが更新されるようにすることができます Linux手動インストール手順