Python AWS Lambda检查DNS名称上的端口是否打开时发生超时错误

Python AWS Lambda检查DNS名称上的端口是否打开时发生超时错误,python,amazon-web-services,aws-lambda,port,Python,Amazon Web Services,Aws Lambda,Port,我有一个非常基本的Python代码,用于检查负载平衡器DNS上的端口阵列是否打开。因此,我使用传统的套接字来检查它。当我尝试在本地机器上执行代码时,它运行良好,并给出了预期的输出。当我试图在Lambda上部署相同的逻辑时,我得到了一个超时错误 我的本地代码: import socket DNS = ['loadbalancer-dns.elb.amazonaws.com'] PORT = [8099,9087,10041,10004,5001,3001,4001,10010,8085,9050

我有一个非常基本的
Python
代码,用于检查负载平衡器DNS上的端口阵列是否打开。因此,我使用传统的
套接字来检查它。当我尝试在本地机器上执行代码时,它运行良好,并给出了预期的输出。当我试图在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版本是
Python3.8
,我的
Timeout
值设置为1分30秒。

超时错误可归因于几个问题

  • 处理能力不足。虽然您的代码乍一看不是很繁重,但它仍然是O(N2)复杂度。如果您将来扩展它,请记住这一点。这可以通过为函数分配更多内存来解决,这也将按比例分配更多CPU

  • 功能只需要更多的时间。可与第1点相关。您可以尝试使用更详细的日志记录来查看操作在超时之前的位置

  • 网络问题(最有可能)。您可以使用强制对无法访问的资源执行错误。这可以显示lambda和端点(安全组等)之间存在某种AWS“防火墙”块


  • 找到了问题的原因。My loadbalancer是一个内部负载平衡器,为在私有子网中运行的应用程序提供服务。已将VPN配置到我的VPC。所以在将VPC连接到我的Lambda函数之后,它起作用了。

    您的lambda是否在VPC内运行?它不是在VPC@jellycsc内运行。使用时间戳向函数添加更多日志记录可能会有所帮助,以便根据实际发生的情况以及函数中每一步所需的时间进行故障排除。话虽如此,但是:您试图在一个虚拟机上运行端口扫描的目的是什么ELB?只是想看看响应应用程序是否正在运行@DennisTraub。不幸的是,我不熟悉启用基于时间的日志记录。你能提供一些建议吗?