Я немного смущен тем, как будет работать следующее:
profile_session = boto3.session.Session(aws_access_key_id=accessKey,aws_secret_access_key=acc
essSecret,region_name=awsRegion)
ec2_client = profile_session.client('ec2')
describeNetworkInterfacesResponse = ec2_client.describe_network_interfaces(Filters=[{'Name':'group-id', 'Values':listOfGroupIds if type(listOfGroupIds) == list else [listOfGroupIds]}, {'Name':'network-interface-id', 'Values':listOfinterfaceIds}])
Учитывая, что len(listOfGroupIds)
является 145 и что len(listOfinterfaceIds)
является 40 & который ec2_client
это EC2, когда я запускаю вышеуказанное, я получаю следующее в качестве значения describeNetworkInterfacesResponse
{'NetworkInterfaces': [],
'ResponseMetadata': {'RequestId': '6b52c532-f582-4607-8c3c-8366441dbc11',
'HTTPStatusCode': 200,
'HTTPHeaders': {'content-type': 'text/xml;charset=UTF-8',
'content-length': '251',
'date': 'Sun, 20 Oct 2019 11:20:37 GMT',
'server': 'AmazonEC2'},
'RetryAttempts': 0}}
Я правильно понимаю, что ec2_client.describe_network_interfaces
с этими фильтрами будет проверять каждый идентификатор сетевого интерфейса в списке listOfinterfaceIds для любая отдельная группа безопасности или их комбинация, из listOfGroupIds, привязанный к интерфейсу и вернуть сведения об этом сетевом интерфейсе?
Поскольку ответ, describeNetworkInterfacesResponse
на самом деле не было возвращено никаких сетевых интерфейсов, я немного скептически отношусь к тому, правильно ли я это понимаю.
Наоборот, учитывая, что listOfGroupIds
это список идентификаторов групп безопасности, и это listOfInterfaceId
это список идентификаторов сетевых интерфейсов, приведут ли приведенные ниже 4 фрагмента кода к тем же результатам (за вычетом инструкции печати, конечно)?
фрагмент 1
describeNetworkInterfacesResponse = ec2_client.describe_network_interfaces(Filters=[{'Name':'group-id', 'Values':listOfGroupIds if type(listOfGroupIds) == list else [listOfGroupIds]}, {'Name':'network-interface-id', 'Values':listOfInterfaceId}])
фрагмент 2
for netId in listOfInterfaceId:
print("Processing {0}".format(str(netId)))
describeNetworkInterfacesResponse = ec2_client.describe_network_interfaces(Filters=[{'Name':'group-id', 'Values':listOfGroupIds if type(listOfGroupIds) == list else [listOfGroupIds]}, {'Name':'network-interface-id', 'Values':[netId]}])
if describeNetworkInterfacesResponse.get('NetworkInterfaces'):
print(describeNetworkInterfacesResponse)
фрагмент 3
for groupId in listOfGroupIds:
print("Processing {0}".format(str(netId)))
describeNetworkInterfacesResponse = ec2_client.describe_network_interfaces(Filters=[{'Name':'group-id', 'Values':groupId if type(groupId) == list else [groupId]}, {'Name':'network-interface-id', 'Values':[listOfInterfaceIds]}])
if describeNetworkInterfacesResponse.get('NetworkInterfaces'):
print(describeNetworkInterfacesResponse)
фрагмент 4
for groupId in listOfGroupIds:
print("\n[*] For security group {0}".format(str(groupId)))
for netId in listOfInterfaceIds:
print("[+] Processing interface {0}".format(str(netId)))
describeNetworkInterfacesResponse = ec2_client.describe_network_interfaces(Filters=[{'Name':'group-id', 'Values':groupId if type(groupId) == list else [groupId]}, {'Name':'network-interface-id', 'Values':[netId]}])
if describeNetworkInterfacesResponse.get('NetworkInterfaces'):
print(describeNetworkInterfacesResponse)
И какой из перечисленных 4 способов сделать это наиболее эффективно? (Четвертый фрагмент, безусловно, наихудший, поскольку для его завершения явно требуется больше, чем для любого другого фрагмента, но без ясности в отношении путаницы, выраженной выше в этом вопросе, фрагмент 4 само по себе кажется гарантированным способом получить необходимую информацию.
Собственно, ответ я нашел. Все 4 фрагмента кода дали одинаковый ответ. Ниже указано время, необходимое для завершения каждого из них:
Фрагмент 1 взял:
--- 3,737805128097534 секунды ---
Фрагмент 2: взял (учитывая, что соответствующий идентификатор интерфейса был последним в списке идентификаторов интерфейсов:
--- 134.37576508522034 секунды ---
Фрагмент 3: взял:
--- 414.51906514167786 секунд ---
Фрагмент 4: Совершенно не заморачивался запускать.