2012-04-10 31 views
36

Chúng tôi đang sử dụng Route 53 DNS để trỏ đến phiên bản EC2. Có cách nào để có được Route 53 để trỏ đến cá thể trực tiếp, thay vì một IP Elastic hoặc CNAME?Có định tuyến 53 điểm đến một phiên bản thay vì IP hoặc CNAME không?

Tôi có nhiều lý do cho việc này:

  1. Tôi không muốn ghi một IP.

  2. CNAME không đáng tin cậy, bởi vì nếu một phiên bản đi xuống và quay trở lại, tên đầy đủ, ec2-X-X-X-X.compute-1.amazonaws.com, sẽ thay đổi.

  3. Trong tương lai, tôi cần phải xoay các trường hợp theo lập trình và giải quyết chúng bằng tên miền phụ và tôi không thấy cách nào dễ dàng để thực hiện việc này với IP hoặc CNAME đàn hồi.

Cách tiếp cận tốt nhất là gì?

+3

Đ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? –

+0

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ể. –

+5

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

Trả lời

14

tôi đã viết giải pháp của riêng tôi cho vấn đề này kể từ khi tôi không hài lòng với cách tiếp cận khác đã được trình bày ở đây. Sử dụng các công cụ Amazon CLI là tốt đẹp, nhưng họ IMHO có xu hướng chậm hơn so với các cuộc gọi API trực tiếp bằng cách sử dụng các thư viện API của Amazon (ví dụ Ruby).

Đây là liên kết đến số AWS Route53 DNS instance update Gist của tôi. Nó chứa một chính sách IAM và một kịch bản Ruby. Bạn nên tạo một người dùng mới trong bảng IAM, cập nhật nó với chính sách đính kèm (với id vùng của bạn trong đó) và thiết lập các thông tin và tham số trong kịch bản lệnh Ruby. Tham số đầu tiên là bí danh tên máy chủ cho cá thể của bạn trong vùng được lưu trữ của bạn. hostname tin sơ thẩm là bí danh của <hostname>.<domain> và máy tính công cộng ví dụ được lấy bí danh là <hostname>-public.<domain>

CẬP NHẬT: Dưới đây là một liên kết đến AWS Route53 DNS instance update init.d script đăng ký hostname khi dụ khởi động. Đây là một số khác nếu muốn sử dụng AWS Route53 DNS load-balancing theo cách tương tự.

+0

Tất nhiên và đó là một tài nguyên bổ sung mà bạn phải quản lý. Điều này có mục đích khác nhau. – kixorz

1

Với Route 53 bạn có thể tạo các bản ghi bí danh mà bản đồ đến một đàn hồi cân bằng tải (ELB):

http://docs.amazonwebservices.com/Route53/latest/DeveloperGuide/HowToAliasRRS.html

+4

Đây là một cách tốn kém để giải quyết vấn đề, vì nó đòi hỏi và ELB mà bạn phải trả tiền ... Tôi thực sự ngạc nhiên khi Amazon không cung cấp giải pháp cho vấn đề rất phổ biến này !!! – Sdra

+5

Có một giải pháp. Bạn có thể sử dụng một IP đàn hồi miễn phí nếu nó đang được sử dụng. Và nếu bạn cần nhiều hơn 5 người trong số họ, bạn có thể yêu cầu tăng giới hạn cho tài khoản của mình. –

6

Nếu bạn dính vào sử dụng route53, bạn có thể tạo ra một kịch bản cập nhật bản ghi CNAME cho ví dụ đó mỗi lần khởi động lại.

thấy điều này ->http://cantina.co/automated-dns-for-aws-instances-using-route-53/ (tiết lộ, tôi đã không tạo này, mặc dù tôi đã sử dụng nó như là một điểm nhảy cho một tình huống tương tự)

tốt hơn chưa, bởi vì bạn đề cập đến việc có thể để quay lên trường lập trình, điều này cách tiếp cận nên hướng dẫn bạn đến đích đó.

cũng thấy ->http://docs.pythonboto.org/en/latest/index.html

0

Tôi đã không thử trên phiên bản EC2 aws nhưng nó cũng hoạt động. Tôi đã viết một chương trình Java nhỏ phát hiện IP công cộng của máy và cập nhật một bản ghi nhất định trên tuyến đường aws 53.

Yêu cầu duy nhất là bạn cần cài đặt Java trên phiên bản EC2 của bạn.

Dự án được lưu trữ trên https://github.com/renatodelgaudio/awsroute53 và bạn cũng có thể tự do sửa đổi nó trong trường hợp bạn cần nó

Bạn có thể cấu hình nó để chạy lúc khởi động hoặc như một công việc crontab để hồ sơ của bạn được cập nhật với các mới IP công khai theo các hướng dẫn tương tự với các ví dụ này Linux manual installation steps

0

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.