Назад | Перейти на главную страницу

AWS описывает поведение сетевых интерфейсов при фильтрации по списку групп безопасности и списку идентификаторов интерфейсов

Я немного смущен тем, как будет работать следующее:

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: Совершенно не заморачивался запускать.