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

AWS Lambda Ruby2.7集成Selenium部署后Chrome连接异常排查

AWS Lambda Ruby 2.7 集成Selenium的两类报错解决方案

第一类报错:层部署阶段提示 unable to connect to /opt/chromedriver 127.0.0.1:9515

该报错本质是chromedriver进程启动失败,Selenium无法连通9515端口的驱动服务,和文件是否存在无关,常见触发原因:

  • chromedriver与headless chromium大版本不匹配,二者版本必须严格对应才能正常通信
  • 打包Lambda层时未给两个二进制文件添加可执行权限,进程无法被拉起
  • 自定义打包的headless chromium缺少依赖的系统库,启动时直接崩溃

第二类报错:本地Docker容器测试正常,部署到Lambda线上后提示 Net::ReadTimeout with #<TCPSocket:(closed)>

该问题核心是Lambda线上运行环境的权限、路径配置和本地容器测试环境存在差异:本地容器默认以root用户运行不会触发权限问题,线上Lambda默认以低权限用户运行,仅/tmp目录有写入权限,会导致chromedriver、Chrome进程启动时无法创建临时运行文件,卡在启动阶段无法响应Selenium的会话创建请求,最终触发读超时。
按以下步骤修复即可:

  • 对齐二进制文件路径
    你在Dockerfile中通过yum安装的Chrome默认路径为/usr/bin/google-chrome-stable,解压的chromedriver路径为/usr/bin/chromedriver,需要把代码中硬编码的/opt路径替换为上述实际安装路径,避免路径不匹配。

  • 补全Chrome启动参数,将所有运行时生成的文件路径指向可写的/tmp目录
    修正后的driver_options方法如下:

    def driver_options
      options = Selenium::WebDriver::Chrome::Options.new(binary: '/usr/bin/google-chrome-stable')
      options.add_argument('--no-sandbox')
      options.add_argument('--headless=new')
      options.add_argument('--window-size=800,600')
      options.add_argument('--disable-popup-blocking')
      options.add_argument('--disable-gpu')
      options.add_argument('--disable-dev-shm-usage')
      options.add_argument('--single-process')
      options.add_argument('--disable-extensions')
      options.add_argument('--disable-software-rasterizer')
      # 将所有运行时数据目录指定到/tmp,避免权限错误
      options.add_argument('--user-data-dir=/tmp/chrome-user-data')
      options.add_argument('--data-path=/tmp/chrome-data')
      options.add_argument('--disk-cache-dir=/tmp/chrome-cache')
      options
    end
    
  • 调整Selenium服务配置,延长客户端超时时间
    修正后的setup_driver方法如下,显式指定chromedriver日志路径到/tmp,同时延长读超时避免启动慢导致的超时:

    def setup_driver
      service = Selenium::WebDriver::Service.chrome(
        path: '/usr/bin/chromedriver',
        log_path: '/tmp/chromedriver.log'
      )
      client = Selenium::WebDriver::Remote::Http::Default.new
      client.read_timeout = 120
      Selenium::WebDriver.for :chrome, service: service, options: driver_options, http_client: client
    end
    
  • 补全Dockerfile权限配置
    在Dockerfile安装完Chrome和chromedriver的步骤后,添加权限配置,确保低权限用户可以正常执行二进制文件:

    RUN chmod 755 /usr/bin/chromedriver /usr/bin/google-chrome-stable
    RUN chmod 1777 /tmp
    

如果修复后仍存在问题,可以在代码中添加puts %x[/usr/bin/chromedriver --version]和puts %x[/usr/bin/google-chrome-stable --version],查看CloudWatch日志输出,确认两个组件版本匹配、可正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:39:19