소개 대표 사이트 카테고리 커뮤니티 페이지 만들기
본문 바로가기
프로그램 (PHP,Python)

브라우저 자동화를 위한 인프라 없는 서버리스 플랫폼 확장성

by 날으는물고기 2025. 8. 27.

브라우저 자동화를 위한 인프라 없는 서버리스 플랫폼 확장성

728x90

  • Kernel 아키텍처와 활용법: Playwright·Puppeteer를 위한 차세대 서버리스 플랫폼

한눈에 보기

  1. 정의
  • Kernel은 샌드박스된 Chrome 브라우저를 서버리스로 제공하여, Playwright·Puppeteer 등 CDP(Chrome DevTools Protocol) 기반 프레임워크로 바로 제어할 수 있게 합니다.
  • 개발자가 인프라 고민 없이 로컬 개발과 거의 같은 속도로 코드를 배포·실행하고, 모든 에이전트를 API로 노출해 외부에서 호출할 수 있습니다.
  1. 강점
  • 수초 내 배포, 대규모 병렬 확장(수천 인스턴스), 격리된 VM 실행, 라이브 뷰(원격 GUI)·세션 영속성·리플레이 제공.
  • Unikraft unikernel 지원으로 초고속 재시작(≈20ms), 스냅샷 복원, 스탠바이 절전 등 고성능 특화.
  1. 배포 방식
  • Docker 이미지 또는 Unikraft unikernel 2가지.
  • WebRTC 라이브 뷰는 TURN 서버가 필요할 수 있으며, unikernel은 퍼블릭 URL이 발급되므로 민감 작업 금지·사용 후 삭제 권장.

아키텍처 개념

  1. CDP 엔드포인트(포트 9222)
  • 각 브라우저 인스턴스는 /json/version 에서 webSocketDebuggerUrl을 제공합니다.
  • 원격 클라이언트(Playwright/Puppeteer)가 이 CDP WebSocket으로 연결·해제·재연결 가능합니다.
  • unikernel 환경에서는 헤더에 Host 값이 필요할 수 있습니다.
  1. 라이브 뷰(원격 GUI)
  • noVNC: 읽기/쓰기 가능, 간단·보편적.
  • WebRTC: 읽기/쓰기 + 창 크기 조절 + 복사/붙여넣기, 고성능. (오디오는 비활성/미지원일 수 있음)
  • 읽기 전용 모드 지원(환경변수 또는 URL 파라미터).
  1. 세션 영속성 & 스탠바이
  • 네트워크 활동이 없으면 스탠바이 모드 진입(자원·비용 최소화).
  • 상태 스냅샷으로 쿠키·토큰·히스토리·열어둔 탭·줌까지 그대로 복원.
  • 같은 persistence ID로 재접속하면 동일 브라우저 세션 사용.
  1. 리플레이(비디오 녹화)
  • 세션 전체를 영상으로 자동 녹화/중지/다운로드.
  • 실패·이슈 상황을 정확히 재현하고 원인 분석에 활용.

배포: Docker / Unikraft

1) Docker(헤드풀 Chromium)

# 1) 빌드
cd images/chromium-headful
IMAGE=kernel-docker ./build-docker.sh

# 2) 실행(noVNC 기본)
IMAGE=kernel-docker ./run-docker.sh

# 3) WebRTC 활성(권장: 빠름)
IMAGE=kernel-docker ENABLE_WEBRTC=true ./run-docker.sh

# 4) 읽기 전용 라이브 뷰(운영 시 안전)
IMAGE=kernel-docker ENABLE_READONLY_VIEW=true ./run-docker.sh
  • 포트: CDP(9222), 라이브 뷰(443).
  • 레코딩 API를 쓰려면 실행 시 옵션으로 활성화(아래 “리플레이” 참고).

2) Unikraft unikernel(초저지연/스냅샷)

# 1) Kraft CLI
curl -sSfL https://get.kraftkit.sh | sh

# 2) 시크릿(메트로/토큰)
export UKC_METRO=<region>
export UKC_TOKEN=<secret>

# 3) 빌드
./build-unikernel.sh

# 4) 실행
./run-unikernel.sh
  • 메모리 8GB 이상 권장.
  • WebRTC 사용 시 TURN 서버 필요
    ENABLE_WEBRTC=true \
    NEKO_ICESERVERS='[{"urls":["turn:turn.example.com:19302","stun:stun.example.com:19302"],"username":"name","credential":"password"}]' \
    ./run-unikernel.sh
  • 퍼블릭 URL이 자동 발급 → 민감 작업 금지, 테스트 후 인스턴스 삭제.
  • browser.close()WebSocket만 종료(브라우저 자체는 유지) → 스탠바이 후 CDP 재연결 가능.

개발자 워크플로(로컬→클라우드 “수초 내”)

  1. 로컬에서 검증: Playwright/Puppeteer 스크립트를 로컬에서 완성.
  2. 배포: Docker 또는 unikernel로 이미지/인스턴스 실행.
  3. 연결: CDP WebSocket을 가져와 원격으로 연결.
  4. 라이브 뷰/HIL: 실시간 화면 확인·수동介入(Human-In-the-Loop).
  5. 리플레이: 실패 케이스 재현·분석.
  6. API화: 에이전트가 자동으로 API 엔드포인트로 노출 → 외부 호출.
300x250

코드 예시

1) CDP 엔드포인트 조회 & 연결(Node/TypeScript)

import fetch from "node-fetch";
import puppeteer from "puppeteer";
import { chromium } from "playwright";

// 1) CDP WS URL 조회
const res = await fetch("http://localhost:9222/json/version", {
  headers: { "Host": "anything" } // unikernel일 때 필요할 수 있음
});
if (!res.ok) throw new Error(`CDP 조회 실패: ${res.status} ${await res.text()}`);
const { webSocketDebuggerUrl } = await res.json();

// 2) 연결: Puppeteer
const pBrowser = await puppeteer.connect({ browserWSEndpoint: webSocketDebuggerUrl });

// 3) 연결: Playwright
const pwBrowser = await chromium.connectOverCDP(webSocketDebuggerUrl);

// 4) 컨텍스트/페이지 확보(재사용 우선)
const ctx = pwBrowser.contexts()[0] || await pwBrowser.newContext();
const page = ctx.pages()[0] || await ctx.newPage();
await page.goto("https://example.com");

2) Kernel SDK로 브라우저 만들고 접속(권장)

import { Kernel } from "@onkernel/sdk";
import { chromium } from "playwright";

const kernel = new Kernel();
const kb = await kernel.browsers.create({
  // 세션 재사용(로그인 유지 등)
  persistence: { id: "acct-123" }
});

console.log("Live View:", kb.browser_live_view_url);  // 브라우저 화면 확인
const browser = await chromium.connectOverCDP(kb.cdp_ws_url);

const ctx = browser.contexts()[0] || await browser.newContext();
const page = ctx.pages()[0] || await ctx.newPage();
await page.goto("https://shop.example.com");

3) 다운로드/업로드 처리(2가지 전략)

A. Playwright 기본 다운로드 흐름

const [ download ] = await Promise.all([
  page.waitForEvent("download"),
  page.click("text=영수증 다운로드")
]);
const path = await download.path();  // 컨테이너 내부 경로
// 이후 Kernel 파일 API(또는 컨테이너 바운드 볼륨)로 호스트에 전달

B. CDP로 다운로드 디렉토리 지정(Chromium 전용)

const client = await ctx.newCDPSession(page);
await client.send("Browser.setDownloadBehavior", {
  behavior: "allow",
  downloadPath: "/downloads"
});

4) 리플레이 녹화 REST(로컬 이미지 API가 켜진 경우)

# 활성화 예시(도커 실행 시)
WITH_KERNEL_IMAGES_API=true ENABLE_WEBRTC=true ./run-docker.sh

# 1) 녹화 시작
curl -X POST http://localhost:10001/recording/start -d {}

# ... 에이전트 동작 ...

# 2) 녹화 중지
curl -X POST http://localhost:10001/recording/stop -d {}

# 3) 다운로드
curl http://localhost:10001/recording/download --output recording.mp4

5) 라이브 뷰 읽기 전용 모드

  • 도커 환경변수: ENABLE_READONLY_VIEW=true
  • URL 파라미터: ?readOnly=true

운영·확장 설계

  1. 병렬 확장
  • 작업 유형을 큐(예: URL·작업ID)로 관리 → 워커가 필요 시 브라우저 생성·실행·종료.
  • 헤드리스는 대량·단주기 작업에 유리(저비용/고속), 헤드풀은 디버깅·HIL·리플레이 필요 시.
  1. 수명주기 관리
  • 스탠바이로 유휴비용 최소화, persistence ID로 장기 로그인 세션 유지.
  • TTL/유휴 타임아웃/가비지 컬렉션으로 세션 누수 방지.
  1. 품질/신뢰성
  • Idempotency 키로 중복 실행 방지, 재시도(지수 백오프), 타임아웃/회로차단기.
  • 실패 시 리플레이 링크를 알림에 첨부.
  1. 관찰성
  • 지표: 실행 수/시간, 스탠바이 진입 횟수, 연결 오류율, 스냅샷/복원 시간, 리플레이 용량.
  • 로그 스키마(예)
    {"ts":"2025-08-27T04:21:00Z","agent":"price-check","session":"acct-123","step":"login","ok":true,"latency_ms":842}

보안 점검 체크리스트

보안 원칙: “플랫폼의 격리” + “조직 내부 통제” 이중화.

1) 네트워크·접근 제어

  • CDP(9222)·라이브 뷰(443)사설망 또는 VPN으로만 노출(가능하면 프라이빗 링크/보안그룹).
  • IP 허용목록·방화벽 규칙 적용, WAF/리버스 프록시 앞단에 배치.
  • SSO/OIDC 로 라이브 뷰 접근 제어(운영계는 읽기 전용 기본).
  • mTLS(내부) 또는 JWT/HMAC 기반 프리사인드 단기 토큰으로 CDP 접속을 한시 보호.
  • Unikraft 퍼블릭 URL민감 작업 금지, 테스트 후 즉시 파기.

2) WebRTC/TURN

  • TURN 서버 필수 구성(방화벽·NAT 환경) 및 자격증명 주기적 회전.
  • TURN 시크릿은 시크릿 매니저에 저장, 환경변수 주입 시 마스킹·로그 노출 금지.

3) 세션·데이터 보호

  • persistence ID ↔ 사용자/업무 키를 보안 저장소에 매핑, 만료/휴면/강제 로그아웃 정책.
  • 민감 데이터(쿠키/토큰/다운로드 파일) 는 저장 시 암호화·분류(PII/결제 등급)·보존기간 적용.
  • 브라우저 다운로드 디렉토리는 작업별 격리 경로 사용, 처리 후 보안 삭제.

4) 감사·포렌식

  • 리플레이 영상/로그/산출물무결성 해시(SHA-256) 부여, 보존기간 준수.
  • 사용자·운영자 행위(라이브 뷰 조작, 재생, 파일 열람) 감사 로그 남기기.
  • SIEM 연동(EDR/IDS 이벤트 상관분석)으로 이상 탐지.

5) 취약점·준법

  • 이미지 다이제스트 고정, 베이스 이미지 주기 패치·SBOM 관리.
  • 사이트 약관/robots/저작권/개인정보 준수, CAPTCHA·우회도구 사용 시 법무 검토.
  • 3rd-party 확장/스크립트는 코드 리뷰·정적분석(SAST)·비밀스캔 진행.

대표 활용사례 설계 포인트

  1. 가격·재고 모니터링
  • 영속 세션으로 로그인 유지 → 스케줄러가 변동 감지 시만 실행.
  • 알림(슬랙/웹훅) 에 리플레이 링크 첨부.
  1. 웹 회귀 테스트
  • 기본 헤드리스 병렬 실행, 실패 케이스만 헤드풀+리플레이로 분석.
  • HIL 버튼으로 운영자가 라이브 뷰에 즉시介入.
  1. 증빙/정산 수집
  • 지정 경로로 다운로드 → 산출물 해시 → 아카이브/ES에 메타데이터 적재.
  • 오류 재현은 리플레이로 재확인.
  1. 사내 RPA(웹 기반)
  • 사설망 전용, SSO / 역할기반 권한 필수.
  • 표준 위임 계정·개인 토큰 금지, 권한·세션 만료 정책 준수.

“에이전트 = API” 활용 예시

1) 에이전트 핸들러(개념 설계)

// 예: 상품 가격 조회 에이전트
export async function handler(req: { url: string }) {
  // 1) 영속 브라우저 연결
  const kb = await kernel.browsers.create({ persistence: { id: "acct-merchant" }});
  const browser = await chromium.connectOverCDP(kb.cdp_ws_url);
  const ctx = browser.contexts()[0] || await browser.newContext();
  const page = ctx.pages()[0] || await ctx.newPage();

  // 2) 업무 로직
  await page.goto(req.url, { waitUntil: "domcontentloaded" });
  const price = await page.textContent("[data-price]");
  // 3) 결과 반환(필요 시 리플레이/스크린샷 첨부)
  return { price, liveView: kb.browser_live_view_url };
}

2) 외부 호출(cURL 예시, 개념)

curl -X POST https://<agent-endpoint>/price-check \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://shop.example.com/item/123"}'

트러블슈팅 FAQ

  • 9222 연결 실패: 방화벽/보안그룹·IP ACL 확인, unikernel은 Host 헤더 필요 여부 점검.
  • 라이브 뷰 검은 화면/연결 지연: TURN 자격증명/포트 확인, 읽기 전용 플래그·브라우저 창 크기 재조정.
  • 다운로드 파일이 안 보임: 컨테이너 내부 경로 확인, 권한/마운트·파일 API로 호스트 반출.
  • QuickTime 재생 문제: 다른 플레이어 사용(mp4 H.264).
  • 브라우저가 “닫힌 것처럼” 보임: browser.close()는 WS만 끊김 → 스탠바이 후 재연결.

도입 SOP(표준 운영절차) 초안

  1. 설계
  • 요구사항(성능·보안·준법) 정리 → 헤드리스/헤드풀·Docker/Unikraft 매트릭스 결정.
  • CDP/라이브 뷰 노출 정책, SSO·WAF·IP ACL 확정.
  1. 프로비저닝
  • 시크릿(TURN·계정) 저장소 등록, 이미지 빌드·서명, IaC 템플릿(Terraform/Helm) 작성.
  • 로그/리플레이 저장소(S3/GCS 등)·수명주기 정책 구성.
  1. 배포
  • 스테이징 → 카나리(1~5%) → 전면 배포.
  • 알림(실패/지연/과금 급증) 설정.
  1. 운영
  • 메트릭 대시보드(실행수/성공률/지연/스탠바이/비용)·SLI/SLO.
  • 월간 패치ウ 창구: 브라우저·OS 업데이트/취약점 점검.
  1. 사고 대응
  • 즉시 차단(IP/토큰 폐기), 리플레이·로그 확보, 해시 검증, 재발 방지 RCA.
  • 데이터 삭제/만료/DSR 대응 절차.

구성 선택 가이드(요약)

  • Unikraft: 극저지연·장수명·스냅샷·즉시 확장(단, 퍼블릭 URL 주의).
  • Docker: 사설망·커스텀 이미지·운영 일관성.
  • 헤드리스: 대량·단주기·저비용.
  • 헤드풀: 디버깅/HIL/리플레이 필수 시.

바로 적용 가능한 보안 점검표(요약)

  • 사설망·IP ACL·WAF·SSO 배치, 운영계 읽기 전용 라이브 뷰
  • CDP 9222는 한시 토큰+mTLS 조합, 로깅 최소화
  • TURN 비밀 보관/회전, 환경변수 마스킹, 로그 금지
  • 세션 영속성 TTL/휴면/강제 종료 정책, 민감데이터 암호화·분류
  • 리플레이/로그 해시·보존정책, SIEM·EDR 연계
  • 이미지 다이제스트 고정, 패치/취약점·SBOM 관리
  • 사이트 약관·개인정보·봇탐지 우회 관련 법무 검토
728x90
그리드형(광고전용)

댓글