适用于Powershell的AWS工具Get-EC2Instance过滤器

时间:2017-07-12 18:53:14

标签: powershell amazon-web-services amazon-ec2 aws-powershell

是否可以按机器主机名过滤EC2实例?我试图找到一个内部实例,但我没有IP地址或instanceId。我找不到任何例子,但我正在考虑这个问题。

$instanceName = "MYMACHINEHOSTNAME"
$filter = New-Object Amazon.EC2.Model.Filter
$filter.Name = "Hostname"
$filter.Value = "$instanceName"
$ec2Instances = (Get-EC2Instance -Region us-west-2 -Filter $filter).Instances

有人做过这样的事吗?

谢谢,

朗达

1 个答案:

答案 0 :(得分:0)

Get-EC2Instance不知道有关此类操作系统级别的详细信息,但您可以从Get-EC2ConsoleOutput获得所需内容。这将输出系统日志,我相信默认情况下,亚马逊拥有的Windows AMI RDPCERTIFICATE-SUBJECTNAME通常会匹配Windows主机名。

尝试一下,我只是编写它来打印一个基于亚马逊拥有的Windows AMI的EC2实例案例的InstanceId,Windows主机名对的集合:

# Note: This is designed to work with default Windows AMIs that Amazon supplies.
function Get-EC2InstanceWindowsHostNames
{   
  # Filter to use only windows instances
  $instanceIds = (Get-EC2Instance -Filter @(@{name="platform";value="windows"})).Instances.InstanceId

  $instanceIds | % {    
    $consoleOutput = Get-EC2ConsoleOutput -InstanceId $_

    # Convert from Base 64 string
    $bytes = [System.Convert]::FromBase64String($consoleOutput.Output)
    $string = [System.Text.Encoding]::UTF8.GetString($bytes)

    # If the string contains RDPCERTIFICATE-SUBJECTNAME, we can extract the hostname
    if($string -match 'RDPCERTIFICATE-SUBJECTNAME: .*') {
      $windowsHostName = $matches[0] -replace 'RDPCERTIFICATE-SUBJECTNAME: '

      # Write resulting obj to stdout
      [pscustomobject]@{InstanceID=$($consoleOutput.InstanceId);HostName=$($windowsHostName.Trim())}
    }
  }
}

示例输出

InstanceID          HostName
----------          --------
i-abcdefgh          EC2AMAZ-ABCDE
i-12345678          WIN-1ABCD2EFG

过滤

从那里,您可以简单地匹配该cmdlet的输出以过滤您的主机名:

@(Get-EC2InstanceWindowsHostNames) | ? { $_.HostName -eq 'WIN-1ABCD2EFG' }

示例输出

InstanceID HostName
---------- --------
i-12345678 WIN-1ABCD2EFG

进一步阅读