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

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 までご連絡ください。
数値データを保存するためのリストよりも一般的にメモリ効率が高いのはなぜですか?数値データを保存するためのリストよりも一般的にメモリ効率が高いのはなぜですか?May 05, 2025 am 12:15 AM

AlaySaregenerallymorememory-effictient forstring forstring inumericaldataduetotheirfixed-sizenature anddirectmoryaccess.1)AraysstoreElementsinaCourowlock、Reducingoverheadfrompointertersormetadata.2)リスト

PythonリストをPythonアレイに変換するにはどうすればよいですか?PythonリストをPythonアレイに変換するにはどうすればよいですか?May 05, 2025 am 12:10 AM

ToconvertaPythonlisttoanarray,usethearraymodule:1)Importthearraymodule,2)Createalist,3)Usearray(typecode,list)toconvertit,specifyingthetypecodelike'i'forintegers.Thisconversionoptimizesmemoryusageforhomogeneousdata,enhancingperformanceinnumericalcomp

同じPythonリストに異なるデータ型を保存できますか?例を挙げてください。同じPythonリストに異なるデータ型を保存できますか?例を挙げてください。May 05, 2025 am 12:10 AM

Pythonリストは、さまざまな種類のデータを保存できます。サンプルリストには、整数、文字列、フローティングポイント番号、ブール膜、ネストされたリスト、辞書が含まれています。リストの柔軟性は、データ処理とプロトタイピングにおいて価値がありますが、コードの読みやすさと保守性を確保するためには注意して使用する必要があります。

Pythonの配列とリストの違いは何ですか?Pythonの配列とリストの違いは何ですか?May 05, 2025 am 12:06 AM

Pythondoesnothavebuiltinarays; usethearmoduleformemory-efficienthogeneousdatastorage、while-lelistSareversatileformixeddatypes.Arraysareeffientive for forlardatedateSetsetype、wheneasofferistofibuliestibuliestuseduseerieartusedoersorerdatatess。

Pythonで配列を作成するために一般的に使用されるモジュールは何ですか?Pythonで配列を作成するために一般的に使用されるモジュールは何ですか?May 05, 2025 am 12:02 AM

sostCommonlylysedModule forcreatinginpythonisnumpy.1)numProvidesefficientToolsForArrayoperations、理想的なfornumericaldata.2)arrayscanbecreatedusingnp.array()for1dand2dstructures.3)

Pythonリストに要素をどのように追加しますか?Pythonリストに要素をどのように追加しますか?May 04, 2025 am 12:17 AM

toAppendElementStoapyThonList、usetheappend()methodforsingleelements、extend()formultipleElements、andinsert()forspecificopsitions.1)useappend()foraddingoneElementatheend.2)useextend()toaddmultipleelementseffictience.3)

Pythonリストをどのように作成しますか?例を挙げてください。Pythonリストをどのように作成しますか?例を挙げてください。May 04, 2025 am 12:16 AM

To CreateapythonList、usesquareBrackets []およびSeparateItemswithcommas.1)listsaredynamicandcanholdmixdatatypes.2)useappend()、remaid()、andslicingformanipulation.3)listcompreheNsionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsientionforcreating.4)

数値データの効率的なストレージと処理が重要な実際のユースケースについて話し合います。数値データの効率的なストレージと処理が重要な実際のユースケースについて話し合います。May 04, 2025 am 12:11 AM

金融、科学研究、医療、およびAIの分野では、数値データを効率的に保存および処理することが重要です。 1)財務では、メモリマッピングされたファイルとnumpyライブラリを使用すると、データ処理速度が大幅に向上する可能性があります。 2)科学研究の分野では、HDF5ファイルはデータストレージと取得用に最適化されています。 3)医療では、インデックス作成やパーティション化などのデータベース最適化テクノロジーがデータのパフォーマンスを向上させます。 4)AIでは、データシャーディングと分散トレーニングがモデルトレーニングを加速します。システムのパフォーマンスとスケーラビリティは、適切なツールとテクノロジーを選択し、ストレージと処理速度の間のトレードオフを検討することにより、大幅に改善できます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!