Получить все IP-адреса, назначенные экземпляру EC2

Приведенная ниже функция, а также другие функции, которые есть в сценарии для сбора полного перечня всего, что есть в AWS, работают без проблем.

Однако мне не хватает всех IP-адресов, которые назначены экземпляру после первого, когда экземпляр имеет более одного интерфейса.

Как я могу убедиться, что получил все ip-адреса каждого экземпляра в функции ниже, прежде чем записывать детали в лист Excel?

function Create-EC2InstanceWorksheet {

 #Creating EC2 Instances Worksheet

        # Add Excel worksheet
        $workbook.Worksheets.Add()

        # We need to create a sheet for the Instances
        $InstancesWorksheet = $workbook.Worksheets.Item(1)
        $InstancesWorksheet.Name = 'Instances'

        # Headers for the Instance worksheet
        $InstancesWorksheet.Cells.Item(1,1) = 'Region'
        $InstancesWorksheet.Cells.Item(1,2) = 'Instance Name'
        $InstancesWorksheet.Cells.Item(1,3) = 'Image ID'
        $InstancesWorksheet.Cells.Item(1,4) = 'Instance ID'
        $InstancesWorksheet.Cells.Item(1,5) = 'PEM File'
        $InstancesWorksheet.Cells.Item(1,6) = 'Instance Type'
        $InstancesWorksheet.Cells.Item(1,7) = 'Private IP'
        $InstancesWorksheet.Cells.Item(1,8) = 'Public IP'
        $InstancesWorksheet.Cells.Item(1,9) = 'VPC ID'
        $InstancesWorksheet.Cells.Item(1,10) = 'Subnet ID'
        $InstancesWorksheet.Cells.Item(1,11) = 'State'
        $InstancesWorksheet.Cells.Item(1,12) = 'Security Group Id'
        $InstancesWorksheet.Cells.Item(1,13) = 'Source/Dest Check'

        # Excel Cell Counter
        $row_counter = 3
        $column_counter = 1



    # Get the Ec2 instances for each region
    foreach($AWS_Locations_Iterator in $AWS_Locations){
        $EC2Instances = Get-EC2Instance -Region $AWS_Locations_Iterator

        # Iterating over each instance

foreach ($ EC2Instances_Iterator.Instances.NetworkInterfaces.PrivateIpAddresses.PrivateIpAddress в $ EC2Instances) {

foreach ($ EC2Instances_Iterator.Instances.NetworkInterfaces.Pr... + ~ Отсутствует 'in' после переменной в цикле foreach.

Удалите приведенный выше код, начиная с foreach, и воспользуйтесь предложением, предоставленным @AnthonyNeace. Заменяется на foreach ниже, который предоставляет дополнительные IP-адреса.

        foreach($instance in $EC2Instances.Instances){
            foreach($networkInterface in $instance.NetworkInterfaces){
            "$($instance.InstanceID): $($networkInterface.PrivateIpAddresses.PrivateIpAddress)";



            # Ignore if a region does not have any instances
            if($EC2Instances_Iterator.count -eq $null) {
            continue
            }
            # Populating the cells
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $AWS_Locations_Iterator
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.Tags.value
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.imageid
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.Instanceid
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.keyname.tostring()
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.Instancetype.Value
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.PrivateIpAddress
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.PublicIpAddress
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.VpcId
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.SubnetId
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.state.name.value
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.securitygroups.GroupId
            $InstancesWorksheet.Cells.Item($row_counter,$column_counter++) = $EC2Instances_Iterator.Instances.SourceDestCheck


            # Seting the row and column counter for next EC2 instance entry
            $row_counter = $row_counter + 1
            $column_counter = 1
        }

        # Iterating to the next region
        $row_counter = $row_counter + 1
    }

}

1 ответ

Сетевой интерфейс включен в каждый экземпляр EC2 в ответе Get-EC2Instance, поэтому, взяв в качестве примера частные IP-адреса... вы можете получить доступ к частным IP-адресам, просто выполняя итерацию по каждому частному IP-адресу, выставленному на каждом сетевом интерфейсе. То же самое для адресов IPv6.

Объектная модель

Пример IPv4

$EC2Instances_Iterator.Instances.NetworkInterfaces.PrivateIpAddresses.PrivateIpAddress

Пример IPv6

$EC2Instances_Iterator.Instances.NetworkInterfaces.Ipv6Addresses.Ipv6Address

Пример: запись строки адресов с использованием цикла foreach

В этом примере адреса каждого сетевого интерфейса строятся в строку с разделителями-запятыми в пределах цикла экземпляров. Таким образом, строка создается для каждого экземпляра.

Оператор подвыражения powershell$() используется для разрешения сложных свойств в строке.

$EC2Instances = Get-EC2Instance

foreach($instance in $EC2Instances.Instances){
  $addresses = "";
  foreach($networkInterface in $instance.NetworkInterfaces){
    $addresses = $addresses, $networkInterface.PrivateIpAddresses.PrivateIpAddress -join ","
  }
  "$($instance.InstanceID): $($addresses.Trim(','))"    
}

Дальнейшее чтение

Другие вопросы по тегам