Lambda で Playwright によるWebブラウジングを行う

awsnode.js

Lambda で Playwright を動かす。/tmp にしか書き込めないため –disable-dev-shm-usage を指定して Chromium を起動する。

import { chromium, Browser, Page } from "playwright-chromium";

browser = await chromium.launch({
  headless: true,
  args: [
    "--no-sandbox",
    "--disable-setuid-sandbox",
    "--disable-dev-shm-usage",
    "--single-process",
  ],
});

const page = await browser.newPage();

await page.goto("https://example.com", {
  waitUntil: "networkidle",
});

アプリケーションと、aws-lambda-ric が依存しているバイナリをビルドし、公式の Playwright イメージにコピーする。aws-lambda-ric は独自のベースイメージで Lambda 関数を動かすためのパッケージで、アプリケーションと Lambda Runtime API を接続する。

Chromium はインストールされているので npx playwright install --with-deps chromium などする必要はない。イメージのバージョンは playwright ライブラリのバージョンと合わせている。

FROM node:24-slim AS builder

# builder image doesn't need chromium so prevent from being installed by postinstall
ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1

# for building curl/aws-lambda-cpp on aws-lambda-ric preinstall
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      cmake make g++ python3 xz-utils ca-certificates && \
    rm -rf /var/lib/apt/lists/*

RUN corepack enable && corepack prepare pnpm@latest --activate

WORKDIR /repo

COPY pnpm-workspace.yaml pnpm-lock.yaml package.json ./
COPY test-app/package.json ./test-app/

RUN pnpm install --frozen-lockfile --filter test-app...

COPY test-app/tsconfig.json ./test-app/
COPY test-app/src ./test-app/src
RUN pnpm --filter test-app run build

RUN pnpm deploy --filter test-app --prod /out

FROM mcr.microsoft.com/playwright:v1.59.1-noble

WORKDIR /var/task

COPY --from=builder /out/node_modules ./node_modules
COPY --from=builder /out/package.json ./package.json
COPY --from=builder /repo/test-app/dist/ ./

ENTRYPOINT ["/var/task/node_modules/.bin/aws-lambda-ric"]
CMD ["handler.handler"]