Giới thiệu
Trong những ngày qua, tôi đã khám phá việc sử dụng Azure Functions để triển khai giám sát tổng hợp với Playwright. Mục tiêu là khá đơn giản: chạy các bài kiểm tra tự động hóa trình duyệt mỗi 30 phút hoặc 1 giờ để theo dõi các chức năng hệ thống quan trọng. Tuy nhiên, như nhiều cuộc phiêu lưu trên đám mây, đã có một số bất ngờ trong quá trình thực hiện.
1. Lựa Chọn Kế Hoạch Phù Hợp
Kế hoạch Consumption hay Premium?
Khi bắt đầu, tôi đã đứng trước một quyết định quan trọng: Kế hoạch Consumption hay Kế hoạch Premium?
- Kế hoạch Consumption: Giá rẻ nhưng không hỗ trợ chạy trình duyệt như Playwright do những hạn chế nghiêm ngặt của sandbox.
- Kế hoạch Premium: Loại bỏ khởi động lạnh, cung cấp CPU/RAM riêng biệt và cho phép chạy trình duyệt - điều cần thiết cho các tác vụ tự động hóa.
Trong kế hoạch Premium, có các SKU khác nhau: EP1, EP2 và EP3. Đối với một proof of concept (POC) chạy thử nghiệm mỗi 30 phút hoặc 1 giờ, EP1 (1 vCPU / 3.5 GB RAM) là đủ và rẻ hơn nhiều (~130-150 USD/tháng). Các khối lượng công việc nặng hơn yêu cầu EP2 hoặc EP3 với nhiều CPU và bộ nhớ hơn.
Tôi đã chọn EP1. Điều này đảm bảo Playwright chạy ổn định ngay cả khi mở các trình duyệt headless.
2. Cấu Trúc Triển Khai và Vấn Đề “No Functions Found”
Ban đầu, tôi đã triển khai Function App của mình qua .zip bằng Azure Pipeline và Release, bao gồm dist/, host.json, và các thư mục dự án khác. Tuy nhiên, nhật ký cho thấy:
Không tìm thấy hàm nào
Tôi phát hiện rằng Azure Functions yêu cầu thư mục hàm phải nằm ở gốc của lần triển khai hoặc được cấu hình đúng. Trong các hàm hiện đại (v4, JavaScript/TypeScript), mỗi tệp hàm phải sử dụng @azure/functions và host.json cần phải ở gốc.
Để duy trì cấu trúc dự án của tôi (dist/functions, dist/support, dist/tests), giải pháp là chỉ định việc triển khai đến gốc của dist và đảm bảo host.json và các tệp hàm .js được đặt ở vị trí chính xác.
3. Playwright và Các Trình Duyệt
Một trong những thách thức lớn nhất là chạy Playwright trên Azure.
- Chromium hoạt động tốt ✅
- Firefox và WebKit không hoạt động ❌
Lỗi điển hình:
Lỗi: browserType.launch: spawn UNKNOWN
Điều này xảy ra vì sandbox Windows của Azure Functions không cung cấp tất cả các phụ thuộc hệ thống mà Firefox/WebKit yêu cầu.
Giải Pháp Có Thể
- Sử dụng Chromium duy nhất – hoạt động đáng tin cậy và đủ cho giám sát tổng hợp.
- Triển khai qua Linux Function App + --with-deps – cài đặt các thư viện hệ thống cần thiết.
- Container tùy chỉnh – một hình ảnh Docker dựa trên
mcr.microsoft.com/playwrightđã được cài đặt sẵn Chromium, Firefox và WebKit cùng với các phụ thuộc. Điều này lý tưởng cho sản xuất.
4. Biến Môi Trường và Đường Dẫn
Để Playwright tìm thấy trình duyệt, tôi đã phải thiết lập:
PLAYWRIGHT_BROWSERS_PATH = 0
Điều này đảm bảo Azure Function tìm kiếm trình duyệt ở đúng vị trí trong node_modules. Nếu bạn cài đặt trình duyệt trong pipeline với npx playwright install chromium, thư mục node_modules phải bao gồm tất cả các trình duyệt bạn cần và với PLAYWRIGHT_BROWSERS_PATH = 0, Playwright sẽ tìm đúng vị trí.
5. Thực Hành Tốt Nhất
- Thực hiện kiểm tra thường xuyên: Đặt lịch kiểm tra tự động hóa để phát hiện lỗi sớm.
- Theo dõi hiệu suất: Sử dụng Application Insights để theo dõi hiệu suất và phân tích lỗi.
- Lưu trữ kết quả: Sử dụng Azure Blob Storage để lưu trữ và phân tích kết quả kiểm tra.
6. Những Cạm Bẫy Thường Gặp
- Không tìm thấy hàm: Đảm bảo cấu trúc dự án và vị trí của các tệp hàm đúng.
- Lỗi trình duyệt không chạy: Chỉ sử dụng Chromium hoặc đảm bảo các phụ thuộc được cài đặt đúng.
7. Mẹo Tối Ưu Hiệu Suất
- Giảm thiểu khởi động lạnh: Sử dụng Kế hoạch Premium để giảm thiểu thời gian khởi động.
- Tối ưu hóa mã kiểm tra: Viết mã kiểm tra hiệu quả để giảm thời gian chạy.
8. Khắc Phục Sự Cố
Nếu bạn gặp phải lỗi khi chạy hàm Azure, hãy kiểm tra nhật ký để tìm thông tin chi tiết về lỗi. Đảm bảo rằng tất cả các biến môi trường đã được thiết lập chính xác và rằng bạn đang sử dụng phiên bản Playwright mới nhất.
Kết Luận
Sau khi trải qua tất cả những điều này, tôi cuối cùng đã thành công trong việc làm cho Azure Function TimerTrigger chạy một cách đáng tin cậy. Những dấu vết thực hiện được gửi đến Application Insights, cho phép tôi theo dõi từng lần chạy theo thời gian thực. Ngoài ra, các lỗi xảy ra trong quá trình thử nghiệm đã giúp tôi nhận ra rằng các báo cáo đang được lưu trữ trong Azure Blob Storage, cung cấp một cách đáng tin cậy để phân tích kết quả kiểm tra và thu thập thông tin cho những cải tiến tiếp theo.