Получить все 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.
Объектная модель
- Amazon.EC2.Model.Instance
- System.Collections.Generic.List< Amazon.EC2.Model.InstanceNetworkInterface>
- System.Collections.Generic.List< Amazon.EC2.Model.InstancePrivateIpAddress>
- PrivateIpAddress
- System.Collections.Generic.List< Amazon.EC2.Model.InstanceIpv6Address>
- Ipv6Address
- System.Collections.Generic.List< Amazon.EC2.Model.InstancePrivateIpAddress>
- System.Collections.Generic.List< Amazon.EC2.Model.InstanceNetworkInterface>
Пример 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(','))"
}