使用 AWS Lambda 時,開發人員面臨的常見挑戰之一是管理大型 Python 相依性。 Pandas、Shapely 和 GeoPandas 等庫對於地理空間分析等任務至關重要,通常會超過 Lambda 的 250 MB 解壓層限制。一個實用的解決方案?將您的依賴項儲存在 EFS(彈性檔案系統) 上並將其掛載到您的 Lambda 函數。
在這篇文章中,我們將逐步介紹其設定過程,包括先決條件、主要優勢和逐步實施。
這篇文章是針對具有進階 AWS 經驗的使用者。它假設您對 Lambda、EFS、VPC 和安全群組等 AWS 服務有深入的了解,並且熟悉管理基礎架構和在雲端部署可擴展的解決方案。
在我們深入設定之前,請確保您具備以下條件:
處理程序直接在掛載到 AWS Lambda 函數的 Amazon EFS 儲存上安裝 Python 相依性。這種方法繞過了 Lambda 層的大小限制,使其適用於地理空間資料處理通常需要的重依賴項,例如 pandas、geopandas 和 shapely。它確保 /mnt/data 目錄中提供所需的庫,供 Lambda 在執行期間使用:
import os import subprocess PACKAGE_DIR = "/mnt/data/lib/{}/site-packages/" def get_python_version_tag(): """Generates a Python version tag like 'python3.11'.""" return f"python{os.sys.version_info.major}.{os.sys.version_info.minor}" def install_package(package): """Installs a Python package into the EFS-mounted directory.""" target_dir = PACKAGE_DIR.format(get_python_version_tag()) os.makedirs(target_dir, exist_ok=True) try: subprocess.run( [ "pip", "install", package, "--target", target_dir, "--upgrade", "--no-cache-dir", ], check=True, ) print(f"Package {package} installed successfully!") except subprocess.CalledProcessError as e: print(f"Failed to install package {package}: {e}") def handler(event, context): """AWS Lambda Handler for installing packages.""" try: # List of packages to install from the event input packages = event.get("packages", []) for package in packages: install_package(package) #optional for see packages installed #os.system(f"ls -la {PACKAGE_DIR.format(get_python_version_tag())}") return {"statusCode": 200, "body": "Packages installed successfully!"} except Exception as e: print(f"Error: {e}") return {"statusCode": 500, "body": f"An error occurred: {e}"}
呼叫 Lambda 函數時,傳遞以下 JSON 負載:
{ "packages": ["requests", "pandas"] }
使用 SSH 會話或 AWS CLI 導覽到您的 EFS 掛載點(例如 /mnt/data/lib/)。
檢查 site-packages/ 目錄下已安裝的軟體套件。
或簡單地使用 a 查看已安裝的軟體包
import os import subprocess PACKAGE_DIR = "/mnt/data/lib/{}/site-packages/" def get_python_version_tag(): """Generates a Python version tag like 'python3.11'.""" return f"python{os.sys.version_info.major}.{os.sys.version_info.minor}" def install_package(package): """Installs a Python package into the EFS-mounted directory.""" target_dir = PACKAGE_DIR.format(get_python_version_tag()) os.makedirs(target_dir, exist_ok=True) try: subprocess.run( [ "pip", "install", package, "--target", target_dir, "--upgrade", "--no-cache-dir", ], check=True, ) print(f"Package {package} installed successfully!") except subprocess.CalledProcessError as e: print(f"Failed to install package {package}: {e}") def handler(event, context): """AWS Lambda Handler for installing packages.""" try: # List of packages to install from the event input packages = event.get("packages", []) for package in packages: install_package(package) #optional for see packages installed #os.system(f"ls -la {PACKAGE_DIR.format(get_python_version_tag())}") return {"statusCode": 200, "body": "Packages installed successfully!"} except Exception as e: print(f"Error: {e}") return {"statusCode": 500, "body": f"An error occurred: {e}"}
更新 Lambda 函數的處理程序以包含安裝在 EFS 上的依賴項,這裡的關鍵是將 efs 中的依賴項路徑掛載到 lambda 處理程序的 PYTHONPATH:
所有希望使用已安裝相依性的 Lambda 函數都必須將 EFS 附加到 Lambda。如果沒有此附件,Lambda 將無法存取 EFS 上儲存的所需相依性。
{ "packages": ["requests", "pandas"] }
雖然直接在 EFS 中安裝 Python 依賴項並不常見,但在 Lambda 的預設限制(例如 250 MB 解壓縮層大小)受到限制的情況下,它提供了某些優勢。這種方法對於需要使用諸如Pandas、Shapely 和GeoPandas 等繁重庫進行地理空間計算的應用程式特別有用,這些函式庫通常超出層大小限制。
此解決方案非常適合高級資料處理任務,例如地理空間分析,還可以根據需要輕鬆擴展存儲,同時保持無伺服器架構的靈活性。
以上是使用 EFS 在 AWS Lambda 上安裝 Python 依賴項的詳細內容。更多資訊請關注PHP中文網其他相關文章!