按安全组列表和接口 ID 列表过滤时的 AWS describe-network-interfaces 行为

按安全组列表和接口 ID 列表过滤时的 AWS describe-network-interfaces 行为

我对以下功能的方式有点困惑:

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)40ec2_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,使用这些过滤器,将检查每个网络接口 ID在列表中接口 ID 列表为了任何单个安全组或其组合, 来自群组 ID 列表,附加到接口并返回该网络接口的详细信息?

由于响应中describeNetworkInterfacesResponse实际上没有返回任何网络接口,因此我有点怀疑我的理解是否正确。

反过来说,考虑到这listOfGroupIds是一个安全组 ID 列表,这listOfInterfaceId是一个网络接口 ID 列表,下面的 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看来,这本身就是获取所需信息的保证方法。

答案1

事实上,我确实找到了答案。所有 4 个代码片段都给出了完全相同的响应。以下是每个代码片段完成所需的时间:

片段 1拿:

--- 3.737805128097534 秒 ---

片段2:采取(假设匹配的接口 ID 位于接口 ID 列表的最后一个位置:

--- 134.37576508522034 秒 ---

片段 3:拿:

--- 414.51906514167786 秒 ---

片段4:根本就没打算运行它。

相关内容