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}
レイヤーのパッケージ
です
Pyproject.TOMLは、PIPで使用され、レイヤーでパッケージを作成します。
./ layers/layer_utils/python/pyproject.toml
layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py
要件。txtは、レイヤーが必要とするすべての外部モジュールを示します。この場合、リクエストモジュールのみが必要ですが、必要なだけ追加することができます。
./ layers/layer_utils/python/compoestion.txt
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)}"
仮想環境のセットアップ
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}
この後、あなたはあなたのシェルにこのようなものを見る必要があります。
最初の(venv)は、仮想環境にいることを示しています。
└── 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コードを使用している場合、コードが機能していてもレイヤーのインポートが解決しないことがわかります。
これを解決するために、ワークスペースの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}
スタックにレイヤーを追加します
└── layer_utils └── python ├── layer_utils │ ├── __init__.py │ ├── processor.py │ └── request_handler.py ├── pyproject.toml └── requirements.txt
[project] name = "layer_utils" version = "0.1.0" [build-system] requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta"
これをテストしましょう。最初に構築しましょう。テンプレートには、ソースコードがどこにあるかについての兆候があるため、テンプレートを別のパスから構築することに問題がありました。これを避けるために、テンプレートファイルのパスから直接構築することをお勧めします。
これにより、必要なすべての依存関係が構築されます。
requests==2.32.2
デバッグのためにファイルを呼び出すことができます。 Dockerがインストールされて実行される必要があることを忘れないでください。繰り返しますが、テンプレートファイルがある場所からこれを呼び出すことを忘れないでください。
python3.12 -m venv venv source venv/bin/activate
ここで、これを完成させて、コードをAWSに展開します。
layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py
ラムダをまだ展開していない場合は、照らされたフラグを初めて使用できます。これを行った後、AWSコンソールにアクセスしてレイヤーを見つけることができます。これで、レイヤーのARNを使用して、他のラムダとレイヤーを使用できます。
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
そして今、あなたはあなたのローカルレイヤーとラムダをデバッグする準備ができています!
以上が再利用可能なAWSラムダ層としてコードを作成、デバッグ、展開の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。