首頁  >  文章  >  後端開發  >  使用 EFS 在 AWS Lambda 上安裝 Python 依賴項

使用 EFS 在 AWS Lambda 上安裝 Python 依賴項

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-24 21:21:12822瀏覽

Installing Python Dependencies on AWS Lambda Using EFS

使用 AWS Lambda 時,開發人員面臨的常見挑戰之一是管理大型 Python 相依性。 PandasShapelyGeoPandas 等庫對於地理空間分析等任務至關重要,通常會超過 Lambda 的 250 MB 解壓層限制。一個實用的解決方案?將您的依賴項儲存在 EFS(彈性檔案系統) 上並將其掛載到您的 Lambda 函數。

在這篇文章中,我們將逐步介紹其設定過程,包括先決條件、主要優勢和逐步實施。


先決條件

這篇文章是針對具有進階 AWS 經驗的使用者。它假設您對 Lambda、EFS、VPC 和安全群組等 AWS 服務有深入的了解,並且熟悉管理基礎架構和在雲端部署可擴展的解決方案。
在我們深入設定之前,請確保您具備以下條件:

  1. AWS Lambda 函數:您將使用 EFS 配置的已部署 Lambda 函數。
  2. EFS 檔案系統:在相同 AWS 區域中建立的彈性檔案系統。
  3. EFS 存取點:在同一AWS 區域中建立的EFS 存取點,根目錄路徑為/data ,確保正確設定POSIX 權限和目錄建立權限,如下所示,1101 和1001,次要群組ID 1002 和權限0755。
  4. VPC 和網路:確保 Lambda 函數與 EFS 位於相同 VPC 中,並正確設定子網路和安全群組。
  5. IAM 權限:您的 Lambda 函數需要存取 EFS 的權限。附加適當的策略(例如,elasticfilesystem:ClientMount、elasticfilesystem:ClientWrite)。

用於安裝軟體包的處理程序代碼

處理程序直接在掛載到 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 中安裝的依賴項

更新 Lambda 函數的處理程序以包含安裝在 EFS 上的依賴項,這裡的關鍵是將 efs 中的依賴項路徑掛載到 lambda 處理程序的 PYTHONPATH:

重要提示

所有希望使用已安裝相依性的 Lambda 函數都必須將 EFS 附加到 Lambda。如果沒有此附件,Lambda 將無法存取 EFS 上儲存的所需相依性。

{
    "packages": ["requests", "pandas"]
}

主要優點

雖然直接在 EFS 中安裝 Python 依賴項並不常見,但在 Lambda 的預設限制(例如 250 MB 解壓縮層大小)受到限制的情況下,它提供了某些優勢。這種方法對於需要使用諸如PandasShapelyGeoPandas 等繁重庫進行地理空間計算的應用程式特別有用,這些函式庫通常超出層大小限制。

使用 EFS 進行依賴項的好處:

  • 繞過 Lambda 層大小限制:安裝和使用庫,無需擔心打包限制。
  • 啟用大規模地理空間處理:在無伺服器環境中處理複雜的空間運算。
  • 簡化相依性管理:動態新增或更新函式庫,無需重新部署 Lambda 函數。

此解決方案非常適合高級資料處理任務,例如地理空間分析,還可以根據需要輕鬆擴展存儲,同時保持無伺服器架構的靈活性。

以上是使用 EFS 在 AWS Lambda 上安裝 Python 依賴項的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn