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

Amazon web services 在AWS部署脚本中调用169.254.169.254/latest/meta-data/instance-id失败,amazon-web-services,amazon-ec2,sysprep,Amazon Web Services,Amazon Ec2,Sysprep,我使用一些基于的脚本将从AMI创建的新windows实例的主机名设置为实例的名称标记。它运行的脚本不是指向windeploy.exe的HKLM:\System\Setup,而是运行以下命令: $InstanceName = 'WebServerNew' Try { Start-Transcript -Path D:\WebServerUtility\SysPrep\Windeploy.log -Append Write-Host "Discovering instance i

我使用一些基于的脚本将从AMI创建的新windows实例的主机名设置为实例的名称标记。它运行的脚本不是指向windeploy.exe的HKLM:\System\Setup,而是运行以下命令:

$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()
失败,无法连接到远程服务器

你知道为什么它不能连接到那个吗


看起来很奇怪。URL看起来是正确的。。让我们试着调试一下。让我们隔离这个问题,看看是脚本问题还是其他问题

请尝试telnet 169.254.169.254 80 如果它说连接与否

也可以在浏览器上尝试并查看输出。。 另外,尝试在系统初始化后运行脚本。。。可能是脚本运行的时间;此本地IP未初始化


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

看起来很奇怪。URL看起来是正确的。。让我们试着调试一下。让我们隔离这个问题,看看是脚本问题还是其他问题

请尝试telnet 169.254.169.254 80 如果它说连接与否

也可以在浏览器上尝试并查看输出。。 另外,尝试在系统初始化后运行脚本。。。可能是脚本运行的时间;此本地IP未初始化


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

你的脚本对我来说非常好

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

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


正在尝试调用RestMethod'http://google.com“这也是一个很好的测试。

你的脚本对我来说非常好

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

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


正在尝试调用RestMethod'http://google.com'也是一个很好的测试。

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

Start-Service -Name 'Dhcp'
route add 169.254.169.254 MASK 255.255.255.255 0.0.0.0
触发脚本时,DHCP客户端将停止。这就是你没有IP的原因


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

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

Start-Service -Name 'Dhcp'
route add 169.254.169.254 MASK 255.255.255.255 0.0.0.0
触发脚本时,DHCP客户端将停止。这就是你没有IP的原因


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

当实例运行时,它可以正常工作。只是在启动脚本中它失败了。当实例运行时,它工作正常。只是在启动脚本中它失败了。当实例运行时,它工作正常。只是在启动脚本中失败了。我将尝试禁用Windows防火墙并创建新映像。我也会打电话给谷歌,看看这是否有效。是的,对我来说也是有效的@BenCurthoys,也许您的脚本在接口启动之前执行;您甚至可能在执行时没有IP地址,因此无法访问元数据服务器。也许您可以尝试进入重试循环。当实例正在运行时,它可以正常工作。只是在启动脚本中失败了。我将尝试禁用Windows防火墙并创建新映像。我也会打电话给谷歌,看看这是否有效。是的,对我来说也是有效的@BenCurthoys,也许您的脚本在接口启动之前执行;您甚至可能在执行时没有IP地址,因此无法访问元数据服务器。也许您可以尝试进入重试循环。谢谢!我没有看到这个答案,我已经不再关心自动化这一点的服务器安装,但你现在可以有一个公认的答案,我会测试它,当我得到它=谢谢!我没有看到这个答案,我已经不再关心自动化这一点的服务器安装,但你可以有一个接受的答案,现在,我会测试它,当我得到它=