2011-03-31 79 views
4

我有一个系统在Amazon AWS云上有N台服务器。他们都在同一个区域。实例A想要与实例B交谈,但它显然不通过互联网。据我所知,每当我重新启动实例时,内部IP就会改变。是否有一个内部的,持续的DNS名称给我的所有实例,通过它们可以在它们之间进行交互而不必担心重新启动?如何知道Amazon AWS实例的内部DNS名称?

+0

我有同样的问题......只有两个在EC2上的Windows服务器,我不知道一个简单的方法来从其他具有一致的名称连接到一个,而不是在每次重新启动后手动输入分配的内部IP。也许Windows网络有一个功能可能有帮助? – BrianFinkel 2011-08-01 16:43:31

回答

3
+0

请注意,此方法虽然有效,但并不仅限于内部EC2骨干网上的流量。通过在EC2中使用EIP,您实际上是将请求路由到面向公众的网关,然后通过将请求交给内部路由表并从那里获取内部地址来解析DNS请求。另外,如果你有很多服务器,你可以很快地用完EIP分配 - 你可以请求更多,但是不能保证亚马逊会把这些分配给你。只是要注意一些事情。 – 2011-03-31 17:18:16

+0

这个重新路由到公众面对网关的计费如何? – Dan 2011-05-11 07:51:08

+1

@Jonners,这种方法从来不使用EIP。它只使用EIP的主机名进行DNS查找(在内部DNS服务器上)。所以内部网络之外没有流量。 – Andrew 2013-01-17 23:49:25

2

不,没有办法使用开箱即用的AWS实例使用“固定”IP地址或DNS名称。即使您将EIP(弹性IP)分配给实例,这也只会影响面向公众的IP/DNS引用,而不会影响内部引用。

我们在我们的EC2属性中使用了一对DNS服务器(它是Windows,所以它们是主/辅助AD域控制器)。通过让所有其他实例使用此对作为其DNS服务器,我们可以在每个实例启动时为其分配唯一的计算机名称,并通过这些名称引用任何/所有其他实例。

因此,例如我们基于EC2的Subversion服务器有一个EIP,这意味着当我们从EC2外部与它交谈时,它始终处于相同的位置,但基于EC2的CruiseControl服务器将它称为[ourec2domain] .SVNHOST,因为它在启动时向DC注册该名称。

+0

感谢Jonners。您的解决方案更适合大型部署。另外,你的服务器如何到达DNS服务器本身?如果DNS服务器的IP更改,则说明您遇到了同样的问题。 – 2011-04-01 06:50:03

+0

DC具有EIP分配,并且这些地址在它们旋转时被提供给每个实例 - 设置它们的DNS参考。我们认识到这意味着DNS流量被路由到EC2网关(通过EIP),然后返回,但它仅用于这两个服务器标识,并非全部(如果实例使用任何其他的EIP,则会出现这种情况实例与他们交谈)。我们有一个概念验证过程,它在DC上运行,并宣布其内部IP地址,但尚未将侦听器进程“烘焙”到其他实例快照中以避免网关环路。 – 2011-04-01 13:23:19

+1

这让我感到非常奇怪,没有人以通用的方式解决这个问题。感谢任何情况下的想法。 – 2011-04-02 19:29:08

0

我有同样的问题,当我使用云第一次开始。我也使用2台DNS服务器的设置,并使用命令ec2-create-tags <instance> --tag Purpose=DNS

向两台服务器添加标记使用http://cloudinitnet.codeplex.com服务我创建的服务器在启动时运行powershell脚本。这个PowerShell脚本检查两个DNS服务器的亚马逊并将它们添加到网络接口。假设您此时有一个dns服务器列表,您可以使用下面的代码将条目添加到dns服务器。要获取服务器列表,只需使用PowerShell通过AWSSDKnet查询您的帐户即可。

$connection = "Local Area Connection 2" 
$registered = $false; 

# Clean up the DNS entries incase there are any settings already 
Write-Output "Clearing DNS Entries" 
$X = netsh interface ip set dns $connection static none 

$index = 1; 
foreach ($server in $servers) 
{ 
    # Set this server's 
    Write-Output "Adding server $server to DNS" 
    $X = netsh interface ip add dnsserver $connection $server index=$index 

    # Register the server's hostname with the dns server 
    if(-not ($registered)) 
    { 
     $computer = hostname 
     $address = (netsh interface ip show address $connection | select-string "IP Address") -replace '^[^\d]+' 
     $rec = [WmiClass]"\\dns01\root\MicrosoftDNS:MicrosoftDNS_ResourceRecord" 
     $rec.CreateInstanceFromTextRepresentation("dns01", "network.cloud", "$($computer).network.cloud IN A $address") 
     $registered = $true; 
    } 
    $index++; 
} 

如果您的服务器不是windows,那么您可以使用Ubuntu或Amazon Linux“Cloud-Init”执行相同的任务。

0

从实例:

curl http://169.254.169.254/latest/meta-data/local-hostname