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"]