プロジェクトの概要
本プロジェクトは、Azure Functions(Linux Consumptionプラン)上でPlaywrightと@sparticuz/chromiumを活用し、とあるWebサイトの自動取得・差分検出・CSV保存を行うバッチを構築したものです。HTTPトリガーで実行し、サーバーレスによる自動化と省力化を目指しました。
システム構成と技術選定
- Azure Functions(Node.js 20.x, TypeScript, Linux Consumption)
- Playwright+@sparticuz/chromiumによるヘッドレスブラウザ自動化
- データやデバッグファイルはAzure Blob Storageに保存
クラウド上での自動化を実現するため、Node.jsとTypeScriptをベースに、軽量なChromium環境を@sparticuz/chromiumで構築。取得データやデバッグ用ファイルはすべてBlob Storageに集約し、運用の効率化を図りました。
実装内容と工夫
- TypeScript、Playwright、Chromium、Azure Functionsのセットアップ
- HTTPトリガーFunction(HTTPTrigger01)の実装とデプロイ
- Playwright/PuppeteerのwaitForSelector挙動差やUser-Agent設定、タイムアウト対応
- 取得データの保存先をAzure Blob Storageに変更
- デバッグ用HTML/PNG/JSONファイルのアップロードと外部確認対応
- APIデータ取得・保存処理のリファクタリング
- ドキュメント・CSVデータの更新
- npm install & build、Azure Functionsへのデプロイ
とくに、PlaywrightのwaitForSelectorの挙動やUser-Agentの調整、タイムアウト対策など、クラウド環境特有の課題に細かく対応しました。デバッグファイルをBlob Storageに保存することで、外部からも動作状況を確認できるようにしています。
得られた成果
- Azure Functions上でPlaywright/Chromiumによる自動化バッチの構築・運用に成功
- HTTPリクエストで最新の店舗情報や差分を即時取得可能
- 取得データのCSV自動保存と過去データ比較が容易に
- デバッグファイルをBlob Storage経由で外部から確認可能
サーバーレス環境での自動化により、運用コストの削減と作業効率の向上を実現しました。
直面した課題とその対応
最大の課題は、Azure FunctionsのIPアドレスがAPI側で許可されておらず、API経由でのデータ取得ができなかった点です(現状プロジェクトは凍結中)。
問題解決までのプロセス
-
エンドポイントの動作確認
Azure Functions(HTTPTrigger01)をデプロイ後、HTTPリクエストで動作確認。ローカルでは正常に取得できたが、Azure上では失敗。 -
エラー内容の調査
実行ログやレスポンス内容を確認し、タイムアウトやネットワークエラー(ECONNREFUSED/ECONNRESET等)を特定。PlaywrightのデバッグファイルをBlob Storageに保存し、外部から内容を確認。 -
コード・設定の再点検
User-Agentやタイムアウト、APIエンドポイントURL、リクエストヘッダー等を再確認。ローカルとAzure Functionsの環境差異も洗い出し。 -
ネットワーク経路の仮説検証
Azure Functionsから外部APIへのアクセス制限を想定し、IPアドレス帯やAPI側のアクセス制御(IPホワイトリスト等)を調査。 -
API提供元への問い合わせ・検証
Azure Functions App Service上のSSHでcurlコマンドを実行し、APIエンドポイントに直接アクセス。API側でAzure FunctionsのIPアドレスが許可されていないことが判明。 -
結論と今後の対応
クラウド上(Azure Functions)からのAPIアクセスがブロックされているため、現状は自動取得不可と判断。API側でIP許可が得られれば、クラウド上での完全自動化が実現可能です。
今後の展望
API側でAzure FunctionsのIP許可が得られれば、クラウド上での完全自動化が実現できます。今後もサーバーレス技術とヘッドレスブラウザの活用による業務効率化に挑戦していきたいと考えています。