You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python 3.9版AWS Lambda中实现IP服务器ping监测及解决命令报错

错误原因

AWS Lambda的Python 3.9运行环境基于裁剪版的Amazon Linux系统,默认未预装ping命令行工具,因此你通过subprocess调用ping命令时会直接返回127状态码的找不到命令错误。
除此之外还有一个隐性限制:ICMP协议需要raw socket权限,标准Lambda运行环境的执行用户没有该权限,就算手动安装ping命令也无法正常执行。

推荐实现方案:TCP端口存活检测

绝大多数场景下监测服务器存活不需要依赖ICMP ping,直接检测目标服务器对外开放的服务端口(比如SSH 22、HTTP 80、HTTPS 443等)的连通性更符合实际需求,且原生Python就可以实现,无需任何额外依赖:

import socket

def lambda_handler(event, context):
    # 配置监测目标:(IP/域名, 端口, 服务名称)
    SERVERS = [
        ('203.124.136.164', 443, 'Local Host 1'),
        ('baidu.com', 80, '百度首页')
    ]
    # 超时时间,单位秒
    CHECK_TIMEOUT = 2

    for ip, port, name in SERVERS:
        status = check_tcp(ip, port, CHECK_TIMEOUT)
        print(f"{name} {'是正常运行的' if status else '无法访问'}")

def check_tcp(ip: str, port: int, timeout: int) -> bool:
    try:
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.settimeout(timeout)
            s.connect((ip, port))
        return True
    except (socket.timeout, ConnectionRefusedError, OSError) as e:
        print(f"检测{ip}:{port}时出错: {str(e)}")
        return False

该方案的注意事项

  • 目标服务器的安全组、防火墙需要放通Lambda出口IP对指定端口的访问
  • 如果Lambda配置在VPC内,需要为对应子网绑定NAT网关才能访问公网IP的服务
  • Lambda函数的超时时间需要设置得大于检测超时时间,避免函数提前被终止
特殊场景:必须使用ICMP ping的实现方案

如果业务要求必须使用ICMP协议检测,需要按以下步骤操作:

  1. 本地在Python 3.9环境下安装pythonping库,打包成Lambda层上传到AWS控制台
  2. 给Lambda函数配置使用该层
  3. 检测代码示例:
from pythonping import ping

def lambda_handler(event, context):
    SERVERS = [
        ('203.124.136.164', 'Local Host 1')
    ]
    for ip, name in SERVERS:
        # 发送1个ICMP包,超时2秒
        res = ping(ip, count=1, timeout=2)
        if res.success():
            print(f"{name} 可达")
        else:
            print(f"{name} 不可达")

注意:该方案需要Lambda运行在你自己的VPC内,且对应VPC的安全组、网络ACL允许ICMP协议的出入站流量。

内容的提问来源于stack exchange,提问作者Codeblooded Saiyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:48:02