首頁 > 後端開發 > Python教學 > 創建,調試和部署您的代碼作為可重複使用的AWS lambda層

創建,調試和部署您的代碼作為可重複使用的AWS lambda層

DDD
發布: 2025-01-30 00:23:09
原創
109 人瀏覽過

> 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 .py空文件,Python必須將其識別為包裝。這就是樹結構應該看起來像

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.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}
登入後複製
登入後複製
登入後複製
登入後複製
>在這裡,重要的是要注意如何通過從layer_utils.processor導入process_data而不是從processor import import import process_data導入處理器函數。使用絕對路徑有助於以後避免導入錯誤。

包裝您的層

好的,現在我們創建了層代碼。但是我們還沒有完成。我們現在需要使用PIP創建一個可編輯的軟件包,因此可以通過Lambda代碼使用。我們將遵循PEP 660風格。我們需要創建兩個文件:需求.txt和pyproject.toml。在這種情況下,第一個將包括我們所需的所有外部庫。第二個是我們需要使用PIP創建一個可編輯軟件包的文件,並確保安裝所有依賴關係。這允許編輯圖層代碼而無需不斷重新包裝(我們需要調試)。

>

這是樹的外觀

>


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)}"
登入後複製
登入後複製
登入後複製
登入後複製
>我認為重要的是要跟踪您使用的包裝的哪個版本,因為您的外部軟件包將通過直接從AWS調用AWS lambda層資源來導入您的外部軟件包。如果直接通過直接從Python環境運行Lambda而不是使用SAM Local Invoke或Sam Local Start-API來直接在系統上調試,則需要確保使用PIP安裝的本地軟件包與已部署的本地套件相同層中的包裝。我不會解釋如何創建外部圖層,因為有很多好的教程(例如,此https://www.keyq.cloud/en/blog/creating-an-an-aws-an-aws-lambda-layer- for- Python-Requests-Module

)。

設置虛擬環境

現在,讓我們創建一個虛擬環境。這不是必需的,但是建議它隔離依賴關係並確保Python環境與Lambda將使用的環境一致。為此,在您的項目dir的控制台中,輸入


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}
登入後複製
登入後複製
登入後複製
登入後複製
>第一個使Python使用-M VENV運行VENV模塊,並創建一個稱為VENV的虛擬環境。

第二個通過調用運行虛擬環境激活腳本的內置命令源來激活虛擬環境。如果您使用的是Visual Studio代碼,則可能會提示您切換到虛擬環境。是的。

之後,您應該在外殼中看到類似的東西。

>

└── layer_utils
    └── python
        ├── layer_utils
        │   ├── __init__.py
        │   ├── processor.py
        │   └── request_handler.py
        ├── pyproject.toml
        └── requirements.txt
登入後複製
登入後複製
登入後複製
(VENV)一開始表明您在虛擬環境中。

有時,我喜歡直接使用SAM工具來調試運行Python文件(因為它更快)。為此,我將在虛擬環境上安裝所有外部軟件包,以便我可以在本地使用它們進行開發和調試。

>


>這僅是在沒有SAM工具的情況下直接在本地和直接調試的必要條件,因此,如果您不打算這樣做,則可以跳過此步驟。
[project]
name = "layer_utils"
version = "0.1.0"

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
登入後複製
登入後複製
登入後複製

我們現在需要打包該層,因此我們的lambda可以找到該層作為Python軟件包。


-e標誌表明這是一個可編輯的軟件包。路徑指向pyproject.toml文件的位置。運行此功能將創建一個新的文件夾layer_utils.egg-info。在那裡沒什麼事,只剩下它。
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代碼,您可能會發現即使代碼有效,該圖層的導入也無法解決。

Pylance complaining on VSCode 為了解決此問題,您可以編輯工作空間的設置。 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}
登入後複製
登入後複製
登入後複製
登入後複製

將圖層添加到堆棧中

我們現在需要在lambdas template.yml上設置圖層。我們需要在資源中添加以下內容:部分(根據您的項目調整內容)

>

./ lambdas/mylambda/template.yml

>

>在contenturi中,您可以看到它是指圖層代碼所在的相對路徑。查看如何指向Python文件夾,因為AWS SAM系統將在那裡尋找Python文件夾。確保運行時與您在虛擬環境和lamnbda中使用的時間匹配。
└── layer_utils
    └── python
        ├── layer_utils
        │   ├── __init__.py
        │   ├── processor.py
        │   └── request_handler.py
        ├── pyproject.toml
        └── requirements.txt
登入後複製
登入後複製
登入後複製
另外,您需要在文件

>的lambda部分上引用該圖層。

請注意,在模板文件的“層”部分中,我們還具有已在AWS上的請求層。這將在本地創建該圖層,因此SAM知道它需要閱讀它。每當您致電AWS部署時,它也會在AWS上部署此層。 >
[project]
name = "layer_utils"
version = "0.1.0"

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
登入後複製
登入後複製
登入後複製
與山姆調試

>讓我們對此進行測試。讓我們先構建它。我從與位置的不同路徑構建模板方面遇到了問題,因為在模板中,有關於源代碼所在位置的指示。為了避免這種情況,我建議直接從模板文件的路徑構建它。

>


>這將建立所有必要的依賴關係。

requests==2.32.2
登入後複製
登入後複製
>現在我們可以調用它。我創建了一個事件文件來測試lambda

./ lambdas/mylambda/events/event.json


>現在我們可以調用調試文件。請記住,您需要為此安裝並運行Docker。同樣,請記住從模板文件所在的地方調用此。

>
python3.12 -m venv venv

source venv/bin/activate
登入後複製
登入後複製


>這將在template.yml上調用函數。 -d標誌表示調試端口為5678。 -E標誌指示將提交給lambda的事件文件在哪裡。

將您的lambda和圖層部署到AWS

>現在,通過將代碼部署到AWS。

如果您尚未部署lambda,則可以在第一次使用 - 引導的標誌,因為它將在此過程中為您提供幫助。執行此操作後,您可以轉到AWS控制台並找到您的層。現在,您可以使用該圖層的ARN將圖層與其他lambdas一起使用。
layers/
└── layer_utils/
    └── python/
        ├── layer_utils/
        │   ├── __init__.py
        │   └── request_handler.py
        │   └── processor.py

登入後複製
登入後複製
登入後複製
登入後複製

The lambda layer on the AWS Console 設置VSCODE進行調試

如果您想使用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)}"
登入後複製
登入後複製
登入後複製
登入後複製
>我們將需要調試庫進行調試。讓我們首先將其添加到您的lambda

> 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環境,它需要使用環境文件中的環境變量。這就是應該看起來像

> requests==2.32.2

>

>最後,我們需要修改我們的lambda代碼,以便知道在本地運行時需要將其附加到調試器。在文件的開始,我們將添加以下代碼

python3.12 -m venv venv

source venv/bin/activate
登入後複製
登入後複製
./ lambdas/mylambda/src/lambda_function.py

>

現在,我們調用函數(再次,從函數的路徑中):
>

(venv) usar@MacBookPro my-lambda-project
登入後複製
當控制台顯示等待調試器附加...,按F5或選擇python調試器:使用linaign.json

調試時

pip3 install -r ./layers/layer_utils/python/requirements.txt
登入後複製

>現在您準備好調試本地層和lambdas!

>

以上是創建,調試和部署您的代碼作為可重複使用的AWS lambda層的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板