ホームページ > バックエンド開発 > Python チュートリアル > EFS を使用した AWS Lambda への Python 依存関係のインストール

EFS を使用した AWS Lambda への Python 依存関係のインストール

Mary-Kate Olsen
リリース: 2024-11-24 21:21:12
オリジナル
876 人が閲覧しました

Installing Python Dependencies on AWS Lambda Using EFS

AWS Lambda を使用する場合、開発者が直面する一般的な課題の 1 つは、大規模な Python 依存関係の管理です。地理空間分析などのタスクに不可欠な PandasShapelyGeoPandas などのライブラリは、Lambda の解凍されたレイヤーの 250 MB 制限を超えることがよくあります。現実的な解決策は?依存関係を EFS (Elastic File System) に保存し、Lambda 関数にマウントします。

この投稿では、前提条件、主な利点、段階的な実装など、これを設定するプロセスを順を追って説明します。


前提条件

この投稿は、AWS の高度な経験を持つユーザーを対象としています。 Lambda、EFS、VPC、セキュリティ グループなどの AWS のサービスをしっかりと理解し、インフラストラクチャの管理とクラウドでのスケーラブルなソリューションのデプロイに精通していることを前提としています。
セットアップに入る前に、以下のものがあることを確認してください:

  1. AWS Lambda 関数: EFS を使用して構成する、デプロイされた Lambda 関数。
  2. EFS ファイル システム: 同じ AWS リージョンに作成された Elastic File System。
  3. EFS アクセス ポイント: /data へのルート ディレクトリ パスを使用して、同じ AWS リージョンに作成された EFS アクセス ポイント。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 などの重い依存関係に適しています。これにより、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 で使用します

Lambda 関数のハンドラーを更新して、EFS にインストールされている依存関係を含めます。ここで重要なのは、efs 内の依存関係のパスを lambda ハンドラーの PYTHONPATH にマウントすることです。

重要な注意事項

インストールされた依存関係を使用したいすべての Lambda 関数は、EFS を Lambda にアタッチする必要があります。この添付ファイルがないと、Lambda は EFS に保存されている必要な依存関係にアクセスできません。

{
    "packages": ["requests", "pandas"]
}
ログイン後にコピー
ログイン後にコピー

主なメリット

Python の依存関係を EFS に直接インストールすることは一般的な方法ではありませんが、250 MB の解凍されたレイヤー サイズ など、Lambda のデフォルトの制限が厳しくなるシナリオでは一定の利点があります。このアプローチは、層サイズの制限を超えることが多い PandasShapelyGeoPandas などの重いライブラリを使用した地理空間計算を必要とするアプリケーションに特に有益です。

依存関係に EFS を使用する利点:

  • Lambda レイヤーのサイズ制限をバイパスします: パッケージ化の制約を気にせずにライブラリをインストールして使用します。
  • 大規模な地理空間処理を有効にする: サーバーレス環境で複雑な空間計算を処理します。
  • 依存関係管理を効率化します: Lambda 関数を再デプロイすることなく、ライブラリを動的に追加または更新します。

このソリューションは、地理空間分析などの高度なデータ処理タスクに最適であり、サーバーレス アーキテクチャの柔軟性を維持しながら、必要に応じてストレージを簡単に拡張することもできます。

以上がEFS を使用した AWS Lambda への Python 依存関係のインストールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート