Selenium+ChromeDriver本地正常,部署AWS Lambda崩溃问题排查
解决AWS Lambda容器中Chrome启动崩溃的问题
核心错误分析
报错CreatePlatformSocket() failed: Address family not supported by protocol (97)表明Chrome尝试创建IPv6套接字失败,尽管你添加了--disable-ipv6参数,但Lambda环境的网络限制可能导致该参数未完全生效;另外本地与Lambda的资源、权限差异也是核心诱因。
调试与修复步骤
1. 捕获Chrome崩溃日志
在Chrome启动参数中添加--crash-dumps-dir=/tmp,Lambda执行后导出/tmp目录下的崩溃文件(通常为.dmp格式)分析,或在代码中把日志上传至存储服务,这能直接定位崩溃的具体原因。
2. 修正文件权限
Lambda容器以非root用户执行,确保Chrome二进制文件及目录具备可执行权限,在安装脚本末尾追加:
chmod -R 755 /opt/chrome chmod -R 755 /opt/chromedriver
3. 简化并优化Chrome启动参数
移除冗余参数,保留适配Lambda的核心配置,示例代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.binary_location = '/opt/chrome/google-chrome' options.add_argument('--headless=new') # Chrome 112+推荐新无头模式,规避旧模式兼容性问题 options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') # 解决Lambda的/dev/shm空间限制 options.add_argument('--disable-gpu') options.add_argument('--crash-dumps-dir=/tmp') options.add_argument('--disable-ipv6') options.add_argument('--log-level=3') # 输出更详细的Chrome运行日志 options.add_argument('--window-size=1920,1080') service = webdriver.ChromeService( executable_path='/opt/chromedriver/chromedriver', service_log_path='/tmp/chromedriver.log' ) driver = webdriver.Chrome(options=options, service=service)
4. 调整Lambda资源配置
默认128MB内存不足以启动Chrome,将Lambda函数的内存配置调整为1024MB或更高,同时把超时时间延长至至少30秒。
5. 修复Chrome安装脚本的变量解析错误
原安装脚本中curl链接的变量编码有误,可能导致下载不匹配的Chromium版本,修正后的下载命令:
# 替换原Chrome下载的curl命令 curl -Lo "/opt/chrome/$br/chrome-linux.zip" "https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Linux_x64%2F${chrome_versions[$br]}%2Fchrome-linux.zip?alt=media"
确保变量${chrome_versions[$br]}正确解析为对应快照编号,避免下载错误版本。
额外建议
- 参考
chrome-aws-lambda的容器适配逻辑,该库专门针对Lambda环境优化了Chrome的安装与启动配置,可直接借鉴其脚本和参数设置。 - 在Lambda容器的Dockerfile中添加依赖检查命令
ldd /opt/chrome/google-chrome,若缺少系统库(如glibc、nss等),需通过yum或apt安装补充。
内容的提问来源于stack exchange,提问作者Claudio Chiappetta
相关产品推荐
相关产品推荐

