AWS Lambda を使用する場合、開発者が直面する一般的な課題の 1 つは、大規模な Python 依存関係の管理です。地理空間分析などのタスクに不可欠な Pandas、Shapely、GeoPandas などのライブラリは、Lambda の解凍されたレイヤーの 250 MB 制限を超えることがよくあります。現実的な解決策は?依存関係を EFS (Elastic File System) に保存し、Lambda 関数にマウントします。
この投稿では、前提条件、主な利点、段階的な実装など、これを設定するプロセスを順を追って説明します。
この投稿は、AWS の高度な経験を持つユーザーを対象としています。 Lambda、EFS、VPC、セキュリティ グループなどの AWS のサービスをしっかりと理解し、インフラストラクチャの管理とクラウドでのスケーラブルなソリューションのデプロイに精通していることを前提としています。
セットアップに入る前に、以下のものがあることを確認してください:
ハンドラーは、AWS Lambda 関数にマウントされた Amazon EFS ストレージに Python の依存関係を直接インストールします。このアプローチは、Lambda レイヤーのサイズ制限を回避し、地理空間データ処理によく必要となる、pandas、geopandas、shapely などの重い依存関係に適しています。これにより、Lambda が実行中に使用する必要なライブラリが /mnt/data ディレクトリで利用可能になることが保証されます。
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/ ディレクトリにインストールされているパッケージを確認します。
または、単純に を使用して、インストールされているパッケージを確認します
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"] }
Python の依存関係を EFS に直接インストールすることは一般的な方法ではありませんが、250 MB の解凍されたレイヤー サイズ など、Lambda のデフォルトの制限が厳しくなるシナリオでは一定の利点があります。このアプローチは、層サイズの制限を超えることが多い Pandas、Shapely、GeoPandas などの重いライブラリを使用した地理空間計算を必要とするアプリケーションに特に有益です。
このソリューションは、地理空間分析などの高度なデータ処理タスクに最適であり、サーバーレス アーキテクチャの柔軟性を維持しながら、必要に応じてストレージを簡単に拡張することもできます。
以上がEFS を使用した AWS Lambda への Python 依存関係のインストールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。