4カ月前に書いた記事では、無償のAzure Functions基板上でヘッドレスChromeを起動してスクレイピングしたいな、というものでした。
結局無償版だと動作が安定せず今は使っていないため、チャレンジした内容だけを以下記載します。
概要
Azure Functionsの無償プラン(消費プラン)でPlaywrightを使用した。色々調べて動いたのはよかったが、安定しなかった。
対象環境
- リソースグループ: 20250428playwright-func
- 場所: 日本東部 (japaneast)
- プラン: Y1 (Dynamic) - 消費プラン
リソース構成
- ストレージアカウント: 20250428playwrightfuncsa
- Linux関数アプリ: 20250428-playwright-func-linux
- Application Insights: 20250428-playwright-func-linux
- App Service Plan: JapanEastLinuxDynamicPlan
無償プランの制約
Azure Functions消費プランには以下の制約があります:
- メモリ制限: 最大1.5GB
- 実行時間制限: 最大10分(デフォルト5分)
- ストレージ制限: 一時ストレージは500MB
- コールドスタート: 初回起動時の遅延
通常のPlaywrightは約300MB以上のサイズがあり、Chromiumブラウザの起動にも大量のメモリを必要とするため、これらの制約内で動作させるのは困難です。
解決策:軽量版の組み合わせ
以下の組み合わせで問題を解決:
package.json
{
"dependencies": {
"@azure/storage-blob": "^12.27.0",
"@sparticuz/chromium": "^133.0.0",
"playwright-core": "^1.52.0"
}
}
実装コード例
import chromium from "@sparticuz/chromium";
import { chromium as pw } from "playwright-core";
export default async function (context, req) {
try {
const browser = await pw.launch({
executablePath: await chromium.executablePath(),
args: chromium.args,
headless: true,
});
const page = await browser.newPage();
await page.goto("https://example.com", { waitUntil: "networkidle" });
// スクレイピング処理
await browser.close();
} catch (error) {
// エラーハンドリング
}
}
技術的なポイント
1. @sparticuz/chromium の使用
- AWS Lambda用に最適化された軽量版Chromium(約50MB)
- 通常のChromiumと比べて大幅にサイズを削減
- Azure Functionsでも問題なく動作
2. playwright-core の使用
- ブラウザバイナリを含まない軽量版Playwright
- @sparticuz/chromiumと組み合わせて使用
- 必要最小限の機能のみを含む
3. WEBSITE_RUN_FROM_PACKAGE の活用
- デプロイパッケージをBlobストレージから直接実行
- ZIPファイルの展開が不要でコールドスタートを高速化
- ストレージ容量の節約にも貢献
パフォーマンスへの影響
この実装により、以下の改善が期待できます:
- パッケージサイズ: 300MB → 50-60MB(約80%削減)
- メモリ使用量: 消費プランの1.5GB制限内で動作可能
- コールドスタート時間: 10-20秒 → 5-10秒程度に短縮
まとめ
理論上、起動はするが、複雑なスクレイピングや長時間の処理には向かないのかもしれない。Premiumプランを使えば確実だが、月額10,000円オーバーなので選択肢の外。
素直にAWS Lambdaでやった方がよさそう。