AWS AMI

String chromeDriver = System.getProperty("chrome.driver");
String chromeSetup = System.getProperty("chrome.setup");

log.info("chromeSetup ===> " + chromeSetup);
log.info("chromeDriver ===> " + chromeDriver);

System.setProperty("webdriver.chrome.driver", chromeDriver);

ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-extensions");
options.addArguments("--headless");  // GUI 환경 없이 실행
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--remote-debugging-port=9222");
options.addArguments("'--window-size=1280x1696");
options.addArguments("'--disable-gpu");
options.addArguments("'--enable-logging");
options.addArguments("'--ignore-certificate-errors");

options.setBinary(chromeSetup);

WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://naver.com");
log.info("title : {}", webDriver.getTitle());

1. 개요

AWS AMI(아마존 머신 이미지) 환경에서 Selenium을 사용하여 크롬 브라우저를 자동화하는 과정에서 크롬 드라이버와 리눅스에 설치된 크롬 버전 간의 버전 차이로 인해 발생하는 문제를 해결하는 방법을 설명합니다. 이 글에서는 크롬 드라이버 v129와 리눅스에 설치된 크롬 v126 사이의 충돌, 옵션 미작동 문제, AMI(CentOS/RHEL 기반)에서의 테스트 환경 구성 방법 등을 다룹니다.

2. 내용

2.1 문제점

  1. 크롬 드라이버와 크롬 브라우저 버전 불일치
    AWS AMI 환경에서 크롬 드라이버 v129(상위 버전)가 설치된 반면, 리눅스에 설치된 크롬은 v126(하위 버전)으로 인해 호환성 문제 발생.
  2. 일부 옵션 동작 불가
    --no-sandbox 옵션이 정상적으로 동작하지 않음.
  3. 테스트 환경 정보 부족
    AWS AMI 환경에서는 Selenium 관련 자료가 부족하며, 특히 Ubuntu 대신 CentOS/RHEL 기반 시스템을 사용하기 때문에 기존 리소스와 호환되지 않는 경우가 있음.

2.2 조치 사항

2.2.1 크롬 및 드라이버 설정

  • 크롬 테스트 버전을 구글 크롬 랩 사이트에서 다운로드 후 저장.
  • 다운로드한 크롬을 리눅스에서 실행하기 위해 /app/chrome-exec/chrome-linux/chrome을 실행.
    • 실행 시 http2 오류 및 여러 .so 라이브러리 관련 오류 발생.

2.2.2 패키지 설치

  • 여러 라이브러리 관련 오류 해결을 위해 아래의 명령어로 필요한 패키지 설치:
     
yum install -y rpm-build rpmdevtools gcc gcc-c++ libgcrypt-devel gnutls-devel pam-devel dbus-devel avahi-devel
wget https://github.com/apple/cups/releases/download/release-1.7.5/cups-1.7.5-source.tar.gz
rpmbuild -ta --without libusb1 cups-1.7.5-source.tar.gz
yum install -y ~/rpmbuild/RPMS/x86_64/cups-libs-1.7.5-1.x86_64.rpm

 

2.2.3 가상 디스플레이 설정

  • Xvfb(가상 프레임버퍼)를 사용하여 GUI가 없는 환경에서도 디스플레이를 시뮬레이션하도록 설정.
cat /etc/systemd/system/xvfb.service
[Unit]
Description=Start Xvfb at startup
After=multi-user.target

[Service]
ExecStart=/usr/bin/Xvfb :99 -screen 0 1920x1080x24

[Install]
WantedBy=multi-user.target

echo "export DISPLAY=:99" > /etc/bashrc

systemctl enable xvfb.service

 

2.2.4 Java 프로젝트의 Gradle 설정

  • 기존에 사용하던 Selenium 버전과 혼합된 버전 문제를 해결하기 위해 명시적으로 Selenium 4.23.0 버전을 사용:
implementation 'org.seleniumhq.selenium:selenium-java:4.23.0'
implementation 'org.seleniumhq.selenium:selenium-remote-driver:4.23.0'
implementation 'org.seleniumhq.selenium:selenium-chrome-driver:4.23.0'
implementation group: 'org.seleniumhq.selenium', name: 'selenium-manager', version: '4.23.0'
implementation group: 'org.seleniumhq.selenium', name: 'selenium-api', version: '4.23.0'

 

2.3 Selenium ChromeDriver 설정

  • 크롬 드라이버 및 옵션을 아래와 같이 설정합니다. 크롬 실행 바이너리는 미리 지정한 경로를 사용하고, GUI가 없는 환경에서 동작하도록 옵션을 구성했습니다:
String chromeDriver = System.getProperty("chrome.driver");
String chromeSetup = System.getProperty("chrome.setup");

log.info("chromeSetup ===> " + chromeSetup);
log.info("chromeDriver ===> " + chromeDriver);

System.setProperty("webdriver.chrome.driver", chromeDriver);

ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-extensions");
options.addArguments("--headless");  // GUI 환경 없이 실행
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--remote-debugging-port=9222");
options.addArguments("'--window-size=1280x1696");
options.addArguments("'--disable-gpu");
options.addArguments("'--enable-logging");
options.addArguments("'--ignore-certificate-errors");

options.setBinary(chromeSetup);

WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://naver.com");
log.info("title : {}", webDriver.getTitle());

 

2.4 크롤링 자바 실행

  • 크롤링 작업을 위한 자바 프로그램 실행 명령어는 다음과 같습니다.
java -Dchrome.driver="/app/chrome-exec/chromedriver-linux" -Dchrome.setup="/app/chrome-exec/chrome-linux/chrome" -jar *.jar

 

3. 코드

String chromeDriver = System.getProperty("chrome.driver");
String chromeSetup = System.getProperty("chrome.setup");

log.info("chromeSetup ===> " + chromeSetup);
log.info("chromeDriver ===> " + chromeDriver);

System.setProperty("webdriver.chrome.driver", chromeDriver);

ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-extensions");
options.addArguments("--headless");  // GUI 환경 없이 실행
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--remote-debugging-port=9222");
options.addArguments("'--window-size=1280x1696");
options.addArguments("'--disable-gpu");
options.addArguments("'--enable-logging");
options.addArguments("'--ignore-certificate-errors");

options.setBinary(chromeSetup);

WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://naver.com");
log.info("title : {}", webDriver.getTitle());

결론

크롬 버전 충돌 문제는 AMI 환경에서 적절한 크롬 및 드라이버 버전을 설정하고, 필요한 패키지 설치를 통해 해결할 수 있습니다. Selenium 설정과 가상 디스플레이 환경도 중요하며, 크롤링을 실행할 때 자바 명령어에서 크롬 바이너리 경로를 명시적으로 설정하는 것이 핵심입니다.

 
 
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기