ホームページ > バックエンド開発 > Python チュートリアル > 再利用可能なAWSラムダ層としてコードを作成、デバッグ、展開

再利用可能なAWSラムダ層としてコードを作成、デバッグ、展開

DDD
リリース: 2025-01-30 00:23:09
オリジナル
156 人が閲覧しました

aws lambda層は、異なるラムダとコードを再利用できる良い方法です。既存のPIPパッケージのレイヤーを作成する方法に関する多くのチュートリアルを見てきましたが、自分のコードでそれを行う方法を説明し、Lambdaと一緒にデバッグできるようにすることはできません。私のシナリオでは、このレイヤーを使用してレイヤーといくつかのラムダを使用して、AWS環境をシミュレートするlambdasと層のコードをデバッグできます。そのテンプレート.ymlで作成されたラムダ関数が既にあると思います。そうでない場合は、Lambda https://docs.aws.amazon.com/lambda/latest/dg/getting-started.htmlの作成方法について次の記事を確認してください。作成後、zipファイルとしてダウンロードして、そこからコードとテンプレートを抽出できます。

レイヤーを準備します

まず、レイヤーのフォルダー構造をセットアップする必要があります。レイヤーと呼ばれるフォルダーを作成するのが好きで、レイヤーごとに独自のフォルダーを作成します。 AWS Lambdaには、各レイヤーのコードがPython/フォルダーにあるレイヤーの特定のフォルダー構造が必要です。これの詳細については、次のリンクを参照してください。 https://docs.aws.amazon.com/lambda/latest/dg/packaging-layers.html

レイヤーはlayer_utilsと呼ばれます。次に、Pythonフォルダー内にフォルダーlayer_utilsを配置し、内部では、コードを使用してファイルrequest_handler.pyとprocessor.pyを作成します。また、Pythonがこれをパッケージとして認識するために必要なinit.py空のファイルも必要です。これは、ツリー構造が
のように見えるようにする方法です

layers/
└── layer_utils/
    └── python/
        ├── layer_utils/
        │   ├── __init__.py
        │   └── request_handler.py
        │   └── processor.py

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

request_handler.pyはURLを使用してリクエストを受信し、ライブラリリクエストを使用してデータを取得して返すプロセッサに電話します。

./ layers/layer_utils/python/layer_utils/processor.py

import requests

def process_data(url):
    """
    Fetches data from a URL.

    Args:
        url (str): The URL to fetch data from.

    Returns:
        str: The fetched content or an error message.
    """
    try:
        response = requests.get(url)
        response.raise_for_status()  # Raise an error for bad status codes
        return response.text[:200]  # Return the first 200 characters of the response
    except requests.RequestException as e:
        return f"Error fetching data: {str(e)}"
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

./ layers/layer_utils/python/layer_utils/request_handler.py

from layer_utils.processor import process_data

def handle_request(request):
    """
    Handles an incoming request and processes it.

    Args:
        request (dict): The input request data.

    Returns:
        dict: The processed result.
    """
    # Example: Extract 'url' from the request and process it
    if "url" not in request:
        return {"error": "Missing 'data' in request"}

    data = request["url"]
    processed_result = process_data(data)
    return {"result": processed_result}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ここでは、プロセッサのインポートProcess_Dataからのみではなく、layer_utils.processorインポートProcess_dataから呼び出すことにより、プロセッサ関数をインポートする方法に注意することが重要です。絶対パスを使用すると、後でインポートエラーを回避できます

レイヤーのパッケージ

さて、レイヤーコードが作成されました。しかし、私たちはまだそれで完了していません。これをPIPで編集可能なパッケージを作成して、これをLambdaコードで使用できるようにする必要があります。 PEP 660スタイルに従ってください。 compoestion.txtとpyproject.tomlの2つのファイルを作成する必要があります。最初のものには、このレイヤーに必要なすべての外部ライブラリが含まれます。この場合は、この場合はリクエストです。 2つ目は、PIPを使用して編集可能なパッケージを作成し、すべての依存関係がインストールされていることを確認するために必要なファイルです。これにより、レイヤーコードを絶えず再パッケージ化する必要なく編集できます(デバッグする必要があります)。

これは、木がどのように見えるか

です


Pyproject.TOMLは、PIPで使用され、レイヤーでパッケージを作成します。

./ layers/layer_utils/python/pyproject.toml

layers/
└── layer_utils/
    └── python/
        ├── layer_utils/
        │   ├── __init__.py
        │   └── request_handler.py
        │   └── processor.py

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
このファイルでは、Packageの作成にはSetuptoolsパッケージが必要であり、ホイールパッケージはコードを配布可能な形式にパッケージ化するために使用されます。

要件。txtは、レイヤーが必要とするすべての外部モジュールを示します。この場合、リクエストモジュールのみが必要ですが、必要なだけ追加することができます。

./ layers/layer_utils/python/compoestion.txt


使用しているパッケージのバージョンを追跡することが重要だと思います。AWSLambdaレイヤーリソースをAWSから直接呼び出すことで外部パッケージがインポートされるためです。 Sam Local InvokeまたはSam Local Start-APIを使用する代わりに、Python環境からLambdaをPython環境から直接実行してシステムに直接デバッグする場合は、PIPでインストールされているローカルパッケージが展開と同じであることを確認する必要があります。レイヤーのパッケージ。そのための多くの優れたチュートリアルがあるので、外部レイヤーの作成方法は説明しません(たとえば、このhttps://www.keyq.cloud/en/blog/creating-an-aws-lambda-layer-for-- python-requests-module
import requests

def process_data(url):
    """
    Fetches data from a URL.

    Args:
        url (str): The URL to fetch data from.

    Returns:
        str: The fetched content or an error message.
    """
    try:
        response = requests.get(url)
        response.raise_for_status()  # Raise an error for bad status codes
        return response.text[:200]  # Return the first 200 characters of the response
    except requests.RequestException as e:
        return f"Error fetching data: {str(e)}"
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
)。


仮想環境のセットアップ

次に、仮想環境を作成しましょう。これは必要ありませんが、依存性を分離し、Python環境がラムダが使用する環境と一致することを保証するため、推奨されます。これを行うには、プロジェクト監督のコンソールで、入力


最初のPythonは、-m venvを使用してVenvモジュールを実行し、Venvと呼ばれる仮想環境を作成します。
from layer_utils.processor import process_data

def handle_request(request):
    """
    Handles an incoming request and processes it.

    Args:
        request (dict): The input request data.

    Returns:
        dict: The processed result.
    """
    # Example: Extract 'url' from the request and process it
    if "url" not in request:
        return {"error": "Missing 'data' in request"}

    data = request["url"]
    processed_result = process_data(data)
    return {"result": processed_result}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
2番目は、仮想環境アクティベーションスクリプトを実行する組み込みコマンドソースを呼び出すことにより、仮想環境をアクティブにします。 Visual Studioコードを使用している場合は、仮想環境に切り替えるように求められる場合があります。はいと言います。

この後、あなたはあなたのシェルにこのようなものを見る必要があります。

最初の(venv)は、仮想環境にいることを示しています。

時々、SAMツールではなくPythonファイルを直接実行するのが好きです(より速いため)。これを行うには、仮想環境にすべての外部パッケージをインストールして、開発とデバッグにローカルに使用できるようにします。
└── layer_utils
    └── python
        ├── layer_utils
        │   ├── __init__.py
        │   ├── processor.py
        │   └── request_handler.py
        ├── pyproject.toml
        └── requirements.txt
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これは、SAMツールなしでローカルで直接デバッグするためにのみ必要です。そのため、これを行う予定がない場合は、この手順をスキップできます。


レイヤーをパッケージ化する必要があるので、ラムダはレイヤーをPythonパッケージとして見つけることができます。

[project]
name = "layer_utils"
version = "0.1.0"

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

-eフラグは、これが編集可能なパッケージであることを示します。パスは、pyproject.tomlファイルがどこにあるかを指します。これを実行すると、新しいフォルダーlayer_utils.egg-infoが作成されます。そこに何もすることはありません、ただそれを残してください。

デバッグ

わかりました、今、これをどのようにデバッグするか見てみましょう。これは、レイヤーとラムダを備えた私のフォルダー構造です。

layers/
└── layer_utils/
    └── python/
        ├── layer_utils/
        │   ├── __init__.py
        │   └── request_handler.py
        │   └── processor.py

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これは私のlambdaのコードです

import requests

def process_data(url):
    """
    Fetches data from a URL.

    Args:
        url (str): The URL to fetch data from.

    Returns:
        str: The fetched content or an error message.
    """
    try:
        response = requests.get(url)
        response.raise_for_status()  # Raise an error for bad status codes
        return response.text[:200]  # Return the first 200 characters of the response
    except requests.RequestException as e:
        return f"Error fetching data: {str(e)}"
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ファイルを実行でき、エラーなしで有効な結果が得られるはずです。

PILANCEでVisual Studioコードを使用している場合、コードが機能していてもレイヤーのインポートが解決しないことがわかります。

Pylance complaining on VSCode

これを解決するために、ワークスペースのsettings.jsonを編集できます。コントロール/コマンドシフトPを実行し、設定を入力します。ワークスペース設定(JSON)を開き、ブラケット内に次のものを追加します(さらに外部がある場合は、パスを追加するだけです)


from layer_utils.processor import process_data

def handle_request(request):
    """
    Handles an incoming request and processes it.

    Args:
        request (dict): The input request data.

    Returns:
        dict: The processed result.
    """
    # Example: Extract 'url' from the request and process it
    if "url" not in request:
        return {"error": "Missing 'data' in request"}

    data = request["url"]
    processed_result = process_data(data)
    return {"result": processed_result}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
今、パイランスはこの罰金を解決する必要があります。

スタックにレイヤーを追加します

ここで、lambdas template.ymlにレイヤーを設定する必要があります。リソース内に次のものを追加する必要があります。セクション(プロジェクトに従ってコンテンツを調整します)./ lambdas/mylambda/template.yml


contenturiでは、レイヤーコードがある相対パスをどのように指すかを見ることができます。 AWS SAMシステムがPythonフォルダーを探しているため、Pythonフォルダーを指し示していない方法をご覧ください。ランタイムが仮想環境とLamnbdaで使用しているものと一致することを確認してください。
└── layer_utils
    └── python
        ├── layer_utils
        │   ├── __init__.py
        │   ├── processor.py
        │   └── request_handler.py
        ├── pyproject.toml
        └── requirements.txt
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
また、ファイルのラムダセクションのレイヤーを参照する必要があります



テンプレートファイルのレイヤーセクションには、すでにAWSにあるリクエストレイヤーもあることに注意してください。これにより、レイヤーがローカルに作成されるため、サムはそれを読む必要があることを知っています。また、AWS Deployを呼び出すときはいつでもこのレイヤーをAWSに展開します。
[project]
name = "layer_utils"
version = "0.1.0"

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
サムとのデバッグ

これをテストしましょう。最初に構築しましょう。テンプレートには、ソースコードがどこにあるかについての兆候があるため、テンプレートを別のパスから構築することに問題がありました。これを避けるために、テンプレートファイルのパスから直接構築することをお勧めします。

これにより、必要なすべての依存関係が構築されます。

今、それを呼び出すことができます。ラムダをテストするためのイベントファイルを作成しました
requests==2.32.2
ログイン後にコピー
ログイン後にコピー

./ lambdas/mylambda/events/event.json

デバッグのためにファイルを呼び出すことができます。 Dockerがインストールされて実行される必要があることを忘れないでください。繰り返しますが、テンプレートファイルがある場所からこれを呼び出すことを忘れないでください。

python3.12 -m venv venv

source venv/bin/activate
ログイン後にコピー
ログイン後にコピー
これにより、template.ymlの関数が呼び出されます。 -dフラグは、デバッグポートが5678であることを示します。-eフラグは、ラムダに提出されるイベントファイルがどこにあるかを示します。

あなたのラムダとレイヤーをAWSに展開します

ここで、これを完成させて、コードをAWSに展開します。

layers/
└── layer_utils/
    └── python/
        ├── layer_utils/
        │   ├── __init__.py
        │   └── request_handler.py
        │   └── processor.py

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ラムダをまだ展開していない場合は、照らされたフラグを初めて使用できます。これを行った後、AWSコンソールにアクセスしてレイヤーを見つけることができます。これで、レイヤーのARNを使用して、他のラムダとレイヤーを使用できます。

The lambda layer on the AWS Console

vscodeを設定してデバッグします

vscodeを使用してデバッグ、ブレークポイントの設定などを行う場合は、追加の手順を実行する必要があります。

デバッグ構成を追加する必要があります。これを行うには、Control/Command Shift Pを実行し、Debugを入力します。構成を追加....これにより、launch.jsonファイルが開きます。そこに構成を追加する必要があります。

./。vscode/launch.json

import requests

def process_data(url):
    """
    Fetches data from a URL.

    Args:
        url (str): The URL to fetch data from.

    Returns:
        str: The fetched content or an error message.
    """
    try:
        response = requests.get(url)
        response.raise_for_status()  # Raise an error for bad status codes
        return response.text[:200]  # Return the first 200 characters of the response
    except requests.RequestException as e:
        return f"Error fetching data: {str(e)}"
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

SAMローカルの呼び出しに取り付けられるDebugpyを使用しています。ここでは、-Dフラグで呼び出したときに見たポート5678をセットアップします。 LocalRootがLambdaコードがあるディレクトリを指していることを確認してください。より多くの構成がある場合は、構成内の部分をリストに追加します。

デバッグするにはデバッグライブラリが必要になります。まず、lambdaの要件に追加しましょう

./ lambdas/mylambda/compoestion.txt

from layer_utils.processor import process_data

def handle_request(request):
    """
    Handles an incoming request and processes it.

    Args:
        request (dict): The input request data.

    Returns:
        dict: The processed result.
    """
    # Example: Extract 'url' from the request and process it
    if "url" not in request:
        return {"error": "Missing 'data' in request"}

    data = request["url"]
    processed_result = process_data(data)
    return {"result": processed_result}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

PIP
でインストールしましょう

└── layer_utils
    └── python
        ├── layer_utils
        │   ├── __init__.py
        │   ├── processor.py
        │   └── request_handler.py
        ├── pyproject.toml
        └── requirements.txt
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

または要件を介してインストールすることもできます。txtファイル

[project]
name = "layer_utils"
version = "0.1.0"

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

環境ファイルを作成する必要があります。ここでは、ローカルで実行されていることをレイヤーに伝えるAWS_SAM_LOCAL環境変数を定義できます。ワークスペースフォルダーにファイル.ENVを作成します。

./。env

requests==2.32.2
ログイン後にコピー
ログイン後にコピー

ここでは、AWS_SAM_LOCOLを定義して、LambdaがAWS SAMを介してローカルに実行されていることを知っています。

また、環境ファイルから環境変数を使用する必要があることをPython環境に伝える必要があります。これは、

のように見えるべき方法です

./。vscode/settings.json

python3.12 -m venv venv

source venv/bin/activate
ログイン後にコピー
ログイン後にコピー
そして最後に、ラムダコードを変更する必要があります。これにより、ローカルで実行するときにデバッガーに接続する必要があることがわかります。ファイルの最初に、次のコードを追加します

./ lambdas/mylambda/src/lambda_function.py

(venv) usar@MacBookPro my-lambda-project
ログイン後にコピー
さて、関数を呼び出します(再び、関数がある経路から):


pip3 install -r ./layers/layer_utils/python/requirements.txt
ログイン後にコピー
デバッガーが添付されるのを待っているコンソールが表示されるとき、F5を押すか、Pythonデバッガーを選択します。

そして今、あなたはあなたのローカルレイヤーとラムダをデバッグする準備ができています!

以上が再利用可能なAWSラムダ層としてコードを作成、デバッグ、展開の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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