회사 업무 중, Ubuntu 서버에서 배포한 스크래핑 서버가 약 한 달에 한 번 꼴로 Chrome Driver 버전이 자동으로 업데이트되는 문제가 발생하였습니다.
이로 인해 Chrome과 Chrome Driver 간의 버전 불일치가 생겨 스크래핑 기능이 정상적으로 동작하지 않았고, 문제가 발생할 때마다 수동으로 Chrome을 업데이트해야 했습니다.
이 서버는 향후 실제 서비스에 사용될 예정이었기 때문에, 운영 중에도 동일한 문제가 발생한다면 서비스에 심각한 영향을 줄 수 있었습니다. 이에 따라 해당 문제를 사전에 해결하고자 하였습니다.
문제를 해결하기 위해 서버 상태를 점검하고, 전체 구조를 분석해보았습니다.
해당 서버는 google-chrome과 chrome-driver를 설치한 뒤 Selenium을 통해 웹 스크래핑을 수행하는 구조였습니다. 구체적인 상황은 다음과 같았습니다.
apt install google-chrome-stable
명령어를 통해 Chrome 설치webdriver-manager
를 이용하여 Chrome Driver 설치chromedriver_autoinstaller
, selenium-manager
등 다양한 도구를 시도했지만 동일한 문제가 지속됨chromium-chromedriver
명령어를 사용하였으나, 여전히 자동 업데이트 문제가 발생함Chrome과 Chrome Driver를 설치하였으나, 주기적으로 Driver가 자동 업데이트되면서 문제가 발생했습니다.
원하는 방향은 다음 두 가지 중 하나였습니다.
운영 환경에서는 자동 업데이트로 인해 예기치 못한 문제가 생길 수 있으므로, Chrome과 Driver의 버전을 고정하는 것이 중요하다고 판단하였습니다.
이전에 하던 방식인, webdriver-manager
, chromedriver_autoinstaller
, selenium-manager
모두 자동 업데이트를 도와주는 도구들이므로, 설정에 따라서 자동업데이트가 일어날 수 있었습니다.
여기서 주목할 점은 chromium-chromedriver 패키지를 설치했을 때였습니다.
$ sudo apt search chromium-chromedriver
Sorting... Done
Full Text Search... Done
chromium-chromedriver/jammy-updates 1:85.0.4183.83-0ubuntu2.22.04.1 amd64
Transitional package - chromium-chromedriver -> chromium snap
해당 설명에서 알 수 있듯이, chromium-chromedriver는 더 이상 독립적인 APT 패키지가 아니고, 내부적으로는 snap을 통해 chromium을 설치하게 되어 있습니다.
snap은 Canonical에서 개발한 리눅스용 패키지 시스템으로, 자동 업데이트 기능을 기본적으로 포함하고 있으며, 백그라운드에서 자동으로 업데이트가 진행됩니다.
결과적으로, snap을 통해 설치된 Chrome과 Driver는 자동으로 업데이트되어 버전 불일치를 유발하게 됩니다.
해당 문제를 근본적으로 해결하기 위해, snap이나 자동 설치 도구를 사용하는 방식을 지양하고, Chrome과 Chrome Driver를 수동으로 설치하여 버전을 명시적으로 고정하는 방법을 선택하였습니다.
이 방식은 다음과 같은 장점이 있습니다.
이를 위해 특정 버전의 Chrome과 Chrome Driver를 다운로드하고, 전역에서 사용할 수 있도록 설정하는 스크립트를 공유하고자 합니다.
install_chrome.sh
#!/bin/bash
set -e
# 필수 의존성 설치
echo "[0] 필수 라이브러리 설치..."
sudo apt-get update
sudo apt-get install -y \
libatk1.0-0 \
libgtk-3-0 \
libxss1 \
libasound2 \
libnss3 \
libx11-xcb1 \
libxcb-dri3-0 \
libgbm1 \
libdrm2 \
libxcomposite1 \
libxdamage1 \
libxrandr2 \
libpangocairo-1.0-0 \
libatk-bridge2.0-0 \
libcups2 \
libu2f-udev \
fonts-liberation \
libappindicator3-1 \
xdg-utils
# 설치하고자 하는 크롬 버전을 입력하세요.
CHROME_VERSION="134.0.6998.88"
ARCHIVE_URL="https://storage.googleapis.com/chrome-for-testing-public/${CHROME_VERSION}/linux64"
echo "[1] 크롬 및 드라이버 다운로드..."
wget "${ARCHIVE_URL}/chromedriver-linux64.zip"
wget "${ARCHIVE_URL}/chrome-linux64.zip"
echo "[2] 압축 해제..."
unzip chromedriver-linux64.zip
unzip chrome-linux64.zip
echo "[3] 크롬드라이버 전역 설치..."
sudo mv chromedriver-linux64/chromedriver /usr/local/bin/chromedriver
sudo chmod +x /usr/local/bin/chromedriver
hash -r
sudo ln -sf /usr/local/bin/chromedriver /usr/bin/chromedriver
echo "[4] 크롬 브라우저 전역 설치..."
mv chrome-linux64 google-chrome
sudo mv google-chrome /opt/google-chrome
sudo ln -sf /opt/google-chrome/chrome /usr/bin/google-chrome
echo "[5] 압축파일 정리..."
rm -rf chromedriver-linux64.zip chrome-linux64.zip chromedriver-linux64
echo "[✅ 완료] 크롬 및 드라이버 설치가 끝났습니다."
echo "Google Chrome 버전: $(/usr/bin/google-chrome --version)"
echo "Chromedriver 버전: $(/usr/bin/chromedriver --version)"
remove_chrome.sh
#!/bin/bash
set -e
echo "[1] /usr/local/bin/chromedriver 삭제..."
sudo rm -f /usr/local/bin/chromedriver
echo "[2] /usr/bin/chromedriver 심볼릭 링크 삭제..."
sudo rm -f /usr/bin/chromedriver
echo "[3] /opt/google-chrome 디렉토리 삭제..."
sudo rm -rf /opt/google-chrome
echo "[4] /usr/bin/google-chrome 심볼릭 링크 삭제..."
sudo rm -f /usr/bin/google-chrome
echo "[✅ 완료] 크롬 및 크롬드라이버 관련 설치 내용이 삭제되었습니다."
Ubuntu 환경에서 Selenium을 사용하는 스크래핑 서버를 운영할 경우, snap 기반의 자동 업데이트로 인해 Chrome과 Chrome Driver 간의 버전 불일치 문제가 발생할 수 있습니다.
이 문제를 해결하기 위해서는 Chrome과 Driver를 수동으로 설치하고, 버전을 명확히 고정하는 방식이 가장 안정적입니다.
자동화와 편의성도 중요하지만, 운영 환경에서는 예측 가능하고 안정적인 시스템이 우선되어야 하므로, 버전 고정은 필수적인 조치라 판단하였습니다.
읽어주셔서 감사합니다.