我对以下功能的方式有点困惑:
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
,使用这些过滤器,将检查每个网络接口 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:根本就没打算运行它。