ホームページ > バックエンド開発 > Python チュートリアル > Docker化されたラムダ関数での相対Pythonインポート

Docker化されたラムダ関数での相対Pythonインポート

Patricia Arquette
リリース: 2024-12-23 22:47:15
オリジナル
460 人が閲覧しました

Relative Python imports in a Dockerized lambda function

ラムダ関数の場合、Python の相対インポートは扱いにくい場合があります。 3年前にこれについてブログを書きました。しかし最近、Docker 化されたラムダ関数で同じ問題に遭遇しました。それで、新しいブログを書く時期が来たと思いました!

手順に従うことも、GitHub で結果を直接確認することもできます。

プロジェクトのセットアップ

AWS CDK cli がインストールされていることを確認してください。

brew install aws-cdk
ログイン後にコピー

プロジェクトを初期化します:

cdk init app --language=typescript
ログイン後にコピー

ラムダのセットアップ

まず、ファイルとフォルダーの構造を作成する必要があります。

mkdir -p lib/functions/hello-world/hello_world
touch lib/functions/hello-world/hello_world/__init__.py
touch lib/functions/hello-world/requirements.txt
touch lib/functions/hello-world/Dockerfile
ログイン後にコピー

次に、次のように Dockerfile を埋める必要があります:

FROM public.ecr.aws/lambda/python:3.12
COPY requirements.txt .
COPY hello_world ${LAMBDA_TASK_ROOT}/hello_world
RUN pip install --no-cache-dir -r requirements.txt
CMD ["hello_world.handler"]
ログイン後にコピー

Python 3.12 に基づく Python ベース イメージを使用しています。次に、requirements.txt ファイルとソース コードをコピーします。 requirements.txt ファイルにリストされているすべての依存関係をインストールし、ハンドラー メソッドが CMD として設定されていることを確認します。

次に、Python ファイルにコードを入力する必要があります。 __init__.py ファイルには、次のコンテンツを配置できます:

from typing import Dict, Any


def handler(event: Dict[str, Any], context: Any) -> Dict[str, str]:
    name = event.get("name", "World")

    return {
        "Name": name,
        "Message": f"Hello {name}!",
    }


__all__ = [
    "handler"
]
ログイン後にコピー

注: ここで使用されているコードでは、相対インポートを使用することができます。別パッケージだからできることです。この例では、__init__.py ファイル内のコードのみを示します。ただし、ここで複数のファイルを使用して、プロジェクトの保守性を向上させることができます。

この例では、依存関係は必要ないので、requirements.txt ファイルを空のままにしておきます。依存関係も含める方法を説明するために、この例にこれを含めました。

IaC を使用して Lambda 関数を作成する

フォルダーとファイルが配置されたので、CDK 構造に Lambda 関数を追加します。次のように追加するだけです:

    new lambda.Function(this, 'Function', {
      functionName: "hello-world",
      code: lambda.Code.fromAssetImage("lib/functions/hello-world", {
        platform: ecr_assets.Platform.LINUX_ARM64,
      }),
      runtime: lambda.Runtime.FROM_IMAGE,
      handler: lambda.Handler.FROM_IMAGE,
      architecture: lambda.Architecture.ARM_64,
      timeout: cdk.Duration.seconds(15),
      memorySize: 128,
    });
ログイン後にコピー

これが機能するには、次のインポートも必要です:

import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as ecr_assets from 'aws-cdk-lib/aws-ecr-assets';
ログイン後にコピー

コード ディレクトリが Dockerfile を含むディレクトリを指していること、およびコードと関数自体の両方に ARM プラットフォームを選択していることに注意してください。

ラムダ関数をローカルでテストする

迅速なフィードバックが重要であるため、コンテナをローカルで実行する必要がある場合があります。このためには、まずコンテナを構築する必要があります:

docker build --platform linux/arm64 \
  -t hello-world:latest \
  -f ./lib/functions/hello-world/Dockerfile \
  ./lib/functions/hello-world
ログイン後にコピー

このコマンドはプロジェクトのルートから実行できることに注意してください。次に、呼び出す前に実行中であることを確認する必要があります:

docker run --platform linux/arm64 -p 9000:8080 hello-world:latest
ログイン後にコピー

その後、次のように関数を呼び出すことができます:

curl http://localhost:9000/2015-03-31/functions/function/invocations -d '{"name": "Joris"}'
ログイン後にコピー

結論

相対インポートは難しい場合があります。コードをパッケージに配置する必要があります。これにより、独自のパッケージ内で相対インポートを行うことができます。これにより、責任を複数のファイルに分割できるため、よりクリーンなコードが可能になり、管理と保守が容易になります。

写真提供: Kaique Rocha

以上がDocker化されたラムダ関数での相対Pythonインポートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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