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

2024-09-30 03:24:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常基本的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秒


Tags: 代码inimportforoutputisonport
2条回答

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

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

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

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

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

相关问题 更多 >

    热门问题