在AWS部署脚本中调用169.254.169.254/latest/meta-data/instance-id失败

时间:2017-07-24 13:23:04

标签: amazon-web-services amazon-ec2 sysprep

我使用基于http://blog.brianbeach.com/2014/07/setting-hostname-in-syspreped-ami.html的一些脚本将从AMI创建的新Windows实例的主机名设置为实例的Name标记。而不是HKLM:\ System \ Setup指向windeploy.exe,它运行一个运行此脚本的脚本:

$InstanceName = 'WebServerNew'

Try 
{
    Start-Transcript -Path D:\WebServerUtility\SysPrep\Windeploy.log -Append
    Write-Host "Discovering instance identity from meta-data web service"
    $InstanceId = (Invoke-RestMethod 'http://169.254.169.254/latest/meta-data/instance-id').ToString()
    $AvailabilityZone = (Invoke-RestMethod 'http://169.254.169.254/latest/meta-data/placement/availability-zone').ToString()
    $Region = $AvailabilityZone.Substring(0,$AvailabilityZone.Length-1)

    Write-Host "Getting Tags for the instance"
    $Tags = Get-EC2Tag -Filters @{Name='resource-id';Value=$InstanceId} -Region $Region
    $InstanceName = ($Tags | Where-Object {$_.Key -eq 'Name'}).Value
    Write-Host "`tFound Instance Name: $InstanceName"    
}
Catch
{
    Write-Host $_
    $InstanceName = 'WebServerError'
}

try
{ 
    If($InstanceName -ne $null) {
          Write-Host "Setting the machine name to $InstanceName"
          $AnswerFilePath = "C:\Windows\Panther\unattend.xml"
          $AnswerFile = [xml](Get-Content -Path $AnswerFilePath) 
          $ns = New-Object System.Xml.XmlNamespaceManager($AnswerFile.NameTable)
          $ns.AddNamespace("ns", $AnswerFile.DocumentElement.NamespaceURI)
          $ComputerName = $AnswerFile.SelectSingleNode('/ns:unattend/ns:settings[@pass="specialize"]/ns:component[@name="Microsoft-Windows-Shell-Setup"]/ns:ComputerName', $ns)
          $ComputerName.InnerText = $InstanceName
          $AnswerFile.Save($AnswerFilePath)
    }
}
Catch
{
    Write-Host $_
}
Finally
{
    Stop-Transcript
}

然后它调用WinDeploy.exe来完成专业化。

问题在于行

    Write-Host "Discovering instance identity from meta-data web service"
    $InstanceId = (Invoke-RestMethod 'http://169.254.169.254/latest/meta-data/instance-id').ToString()

失败,"无法连接到远程服务器"。

知道为什么它无法连接到那个?

enter image description here

3 个答案:

答案 0 :(得分:0)

看起来很奇怪...... URL看起来正确..让我们尝试调试这个。让我们隔离问题并查看其脚本问题或其他问题。

  1. 尝试telnet 169.254.169.254 80
  2. 如果说连接与否

    1. 还可以在浏览器上尝试http://169.254.169.254/latest/meta-data/instance-id并查看输出..
    2. 此外,尝试在系统初始化后运行脚本...可能是脚本运行的时间;此本地IP未初始化。

      每次系统启动; EC2在连接多个NIC时,向主网络适配器添加自定义路由以启用以下IP地址:169.254.169.254。并且在连接NIC之前,您的此脚本正在执行。因此问题。

答案 1 :(得分:0)

你的脚本对我来说非常好。

问题是您的实例上的某些内容阻止了对该IP地址的访问,例如防火墙。

检查您的系统配置,以查看Windows防火墙是否阻止访问,或者是否安装了阻止其访问的任何其他安全软件。

尝试Invoke-RestMethod 'http://google.com'也是一个不错的考验。

答案 2 :(得分:0)

您需要将其添加到脚本顶部:

Start-Service -Name 'Dhcp'
route add 169.254.169.254 MASK 255.255.255.255 0.0.0.0

触发脚本时,DHCP客户端停止。那就是为什么你没有IP。

您还需要向元数据服务添加路由。 Sysprep删除这些路由。