我有一个非常基本的Python
代码,用于检查负载平衡器DNS上的端口阵列是否打开。因此,我使用常规的SOCKET
来检查它。当我尝试在本地机器上执行代码时,它运行良好,并给出了预期的输出。当我试图在Lambda上部署相同的逻辑时,我得到了一个超时错误
我的本地代码:
import socket
DNS = ['loadbalancer-dns.elb.amazonaws.com']
PORT = [8099,9087,10041,10004,5001,3001,4001,10010,8085,9050,8088,8081,10041,8086,8072,10025,20026,10006,9098,9099,10005,8070]
for iDNS in DNS:
for iport in PORT:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
output = sock.connect_ex((iDNS,iport))
if output == 0:
print(f'Port {iport} is open on {iDNS}')
else:
print(f'Port {iport} is closed on {iDNS}')
sock.close()
我的Lambda函数代码:
import json
import boto3
import socket
PORT = [8099,9087]
DNS = ['loadbalancer-dns.elb.amazonaws.com']
def lambda_handler(event, context):
try:
for iDNS in DNS:
for iport in PORT:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
output = sock.connect_ex((iDNS,iport))
if output == 0:
print(f'Port {iport} is open on {iDNS}')
else:
print(f'Port {iport} is closed on {iDNS}')
sock.close()
except:
print('Task timed out')
在Lambda中,我的Python版本是Python 3.8
,我的Timeout
值设置为1分30秒
超时错误可归因于几个问题
处理能力不足。虽然您的代码乍一看不是很繁重,但仍然是O(N2)复杂度。如果您将来扩展它,请记住这一点。这可以通过为函数分配更多内存来解决,这也将按比例分配更多CPU
功能只需要更多的时间。可与第1点相关。您可以尝试使用更详细的日志记录来查看操作在超时之前的位置
网络问题(最有可能)。您可以使用socket timeout对无法访问的资源强制执行错误。这可以显示lambda和端点(安全组等)之间存在某种AWS“防火墙”块
找到了问题的原因。My loadbalancer是一个内部负载平衡器,为在私有子网中运行的应用程序提供服务。已将VPN配置到我的VPC。因此,在将VPC连接到我的Lambda函数后,它起了作用
相关问题 更多 >
编程相关推荐