我如何知道Amazon AWS实例的内部DNS名称?

时间:2011-03-31 12:14:46

标签: amazon-ec2

我的系统在Amazon AWS云上有N台服务器。他们都在同一个区域。实例A想要与实例B交谈,但显然不会通过互联网。据我所知,每次重启实例时内部IP都会发生变化。我的所有实例都有一个内部的,不变的DNS名称,通过它们可以在它们之间进行交互,而不必担心重启吗?

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

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

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

所以例如我们的基于EC2的Subversion服务器有一个EIP,这意味着当我们从EC2外面与它交谈时它总是在同一个地方,但是基于EC2的CruiseControl服务器将它称为[ourec2domain] .SVNHOST,因为它在启动时将DC命名为DC。

答案 2 :(得分:0)

我第一次使用云时遇到了同样的问题。我也使用2个DNS服务器的设置,并使用命令ec2-create-tags <instance> --tag Purpose=DNS

将标签添加到两个服务器

使用我创建的http://cloudinitnet.codeplex.com服务,服务器在启动时运行powershell脚本。这个powershell脚本检查amazon的两个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”来执行相同的任务。

答案 3 :(得分:0)

来自实例:

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