> aws lambda層是能夠與不同的lambdas重複使用代碼的好方法。我已經看到了許多有關如何為現有的PIP軟件包創建層的教程,但是沒有那麼多解釋如何使用自己的代碼來進行操作並允許您與lambda一起進行調試。在我的情況下,您可以使用此層有幾層和幾個lambdas,並沿模擬AWS環境調試Lambdas和層的代碼。我將假設您已經擁有使用其template.yml創建的lambda函數。如果不是,請查看以下文章,以了解如何創建lambda https://docs.aws.amazon.com/lambda/lambda/latest/dg/getting-started.html。創建它後,您可以將其下載為zip文件,然後從那裡提取代碼和template.yml。
首先,我們需要設置該圖層的文件夾結構。我喜歡創建一個稱為layers的文件夾,每一層都創建自己的文件夾。 AWS lambda需要該圖層的特定文件夾結構,其中每個層的代碼位於Python/文件夾中。有關此信息的更多信息,請參見以下鏈接。 https://docs.aws.amazon.com/lambda/latest/dg/packaging-layers.html
我們的圖層將稱為layer_utils。然後,我們將一個文件夾layer_utils放入Python文件夾中,內部我們創建文件request_handler.py和processor.py和代碼。我們還需要一個init
layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py
./ layers/layer_utils/python/layer_utils/processor.py.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}
包裝您的層
這是樹的外觀
>
PIP將使用Pyproject.toml使用我們的圖層來創建軟件包。
./ layers/layer_utils/python/python/pyproject.toml
layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py
在此文件中,Setuptools軟件包對於創建軟件包來說是必需的,並且使用車輪軟件包將代碼包裝到可分佈的格式中。
> the要求。 txt指示我們的圖層所需的所有外部模塊。在我們的情況下,我們只需要請求模塊,但是您可以在必要時添加盡可能多的模塊。
./ layers/layer_utils/python/sumpliont.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}
第二個通過調用運行虛擬環境激活腳本的內置命令源來激活虛擬環境。如果您使用的是Visual Studio代碼,則可能會提示您切換到虛擬環境。是的。
之後,您應該在外殼中看到類似的東西。
>
└── 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"
我們現在需要打包該層,因此我們的lambda可以找到該層作為Python軟件包。
requests==2.32.2
好吧,現在讓我們看看我們將如何調試。這是我的文件夾結構,帶有圖層和lambdas。
>
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)}"
您可以運行文件,並且應該獲得沒有錯誤的有效結果。
>如果您使用的是帶有Pylance的Visual Studio代碼,您可能會發現即使代碼有效,該圖層的導入也無法解決。
為了解決此問題,您可以編輯工作空間的設置。 DO Control/Command Shift P,輸入首選項:打開工作區設置(JSON),並在括號內添加以下內容(如果您有更多的Extroapaths,只需添加路徑)
>
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
>的lambda部分上引用該圖層。
[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標誌指示將提交給lambda的事件文件在哪裡。
>現在,通過將代碼部署到AWS。
layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py
設置VSCODE進行調試
我們需要添加調試配置。為此,請執行控制/命令換檔P並輸入調試:添加配置。 ...這將打開啟動。 JSON文件。您需要在此處添加配置。
>我們正在使用將附加到SAM Local Invoke的Debugpy,在這裡我們設置了使用-D標誌調用時看到的端口5678。確保Localroot指向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)}"
> txt的要求中。
./ lambdas/mylambda/supiends.txt
現在,讓我們與PIP
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}
>您也可以通過要求安裝它。 TXT文件
└── layer_utils └── python ├── layer_utils │ ├── __init__.py │ ├── processor.py │ └── request_handler.py ├── pyproject.toml └── requirements.txt
>我們需要創建一個環境文件,在其中我們可以定義一個AWS_SAM_LOCAL環境變量,該變量將告訴我們的圖層它在本地運行。我們在工作區文件夾上創建一個文件.ENV。
[project] name = "layer_utils" version = "0.1.0" [build-system] requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta"
./
>在這裡,我們定義AWS_SAM_LOCAL,以便Lambda知道通過AWS SAM在本地運行的Lambda。
>我們還需要告訴我們的Python環境,它需要使用環境文件中的環境變量。這就是應該看起來像
>
>最後,我們需要修改我們的lambda代碼,以便知道在本地運行時需要將其附加到調試器。在文件的開始,我們將添加以下代碼
python3.12 -m venv venv source venv/bin/activate
現在,我們調用函數(再次,從函數的路徑中):
>
(venv) usar@MacBookPro my-lambda-project
調試時
pip3 install -r ./layers/layer_utils/python/requirements.txt
>現在您準備好調試本地層和lambdas!
>以上是創建,調試和部署您的代碼作為可重複使用的AWS lambda層的詳細內容。更多資訊請關注PHP中文網其他相關文章!