Lapisan Lambda AWS adalah cara yang baik untuk dapat menggunakan semula kod dengan lambdas yang berbeza. Saya telah melihat banyak tutorial tentang cara membuat lapisan untuk pakej PIP yang sedia ada, tetapi tidak banyak yang menjelaskan bagaimana untuk melakukannya dengan kod anda sendiri dan membolehkan anda menyahpepijatnya bersama -sama dengan lambda anda. Dalam senario saya, anda boleh mempunyai lapisan anda dan beberapa lambdas menggunakan lapisan ini, dan debug kod lambdas dan lapisan di sepanjang simulasi persekitaran AWS. Saya akan menganggap anda sudah mempunyai fungsi lambda yang dibuat dengan template.yml. Jika tidak, periksa artikel berikut mengenai cara membuat lambda https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html. Selepas menciptanya, anda boleh memuat turunnya sebagai fail zip dan mengeluarkan kod dan template.yml dari sana.
Pertama, kita perlu menyediakan struktur folder untuk lapisan. Saya suka membuat folder yang dipanggil Lapisan, dan untuk setiap lapisan membuat folder sendiri. AWS Lambda memerlukan struktur folder tertentu untuk lapisan, di mana kod setiap lapisan berada dalam python/ folder. Lihat pautan berikut untuk maklumat lanjut mengenai perkara ini. https://docs.aws.amazon.com/lambda/latest/dg/packaging-layers.html
Lapisan kami akan dipanggil Layer_utils. Kami meletakkan kemudian folder layer_utils di dalam folder python dan di dalam kami membuat fail request_handler.py dan pemproses.py dengan kod. Kami juga memerlukan fail kosong . Ini adalah bagaimana struktur pokok sepatutnya kelihatan seperti
layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py
3
3
di sini, adalah penting untuk diperhatikan bagaimana kami mengimport fungsi pemproses, dengan memanggil dari Layer_utils.Processor Import Process_data, bukannya dari Processor Import Process_Data sahaja. Menggunakan jalan mutlak membantu mengelakkan kesilapan import kemudian.
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)}"
baiklah, kini kami mempunyai kod lapisan kami yang dibuat. Tetapi kita belum selesai dengannya. Kita perlu membuat pakej yang boleh diedit dengan PIP supaya ini boleh digunakan oleh kod Lambda kami. Kami akan mengikuti gaya PEP 660 untuk berbuat demikian. Kita perlu membuat dua fail: keperluan.txt dan pyproject.toml. Yang pertama akan memasukkan semua perpustakaan luaran yang kita perlukan untuk lapisan ini, dalam permintaan ini. Yang kedua ialah fail yang kita perlukan untuk membuat pakej yang boleh diedit menggunakan PIP dan memastikan semua kebergantungan dipasang. Ini membolehkan mengedit kod lapisan tanpa perlu mengemas semula ia sentiasa (yang kita perlukan untuk debug).
ini adalah bagaimana pokok itu kelihatan seperti
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 akan digunakan oleh PIP untuk membuat pakej dengan lapisan kami.
Dalam fail ini, pakej setuptools diperlukan untuk membuat pakej dan pakej roda digunakan untuk membungkus kod ke dalam format yang boleh diedarkan.
layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py
Saya fikir penting untuk menjejaki versi pakej anda yang anda gunakan, kerana pakej luaran anda akan diimport dengan menghubungi sumber lapisan AWS Lambda secara langsung dari AWS. Sekiranya anda menyahpepijat secara langsung pada sistem anda dengan menjalankan lambda anda secara langsung dari persekitaran python anda dan bukannya menggunakan Sam Local Invoke atau Sam Local Start-API, anda perlu memastikan bahawa pakej tempatan anda dipasang dengan PIP akan sama seperti yang anda gunakan pakej di lapisan anda. Saya tidak akan menerangkan cara membuat lapisan luaran kerana terdapat banyak tutorial yang baik untuk itu (contohnya, ini https://www.keyq.cloud/en/blog/creating-an-aws-lambda-layer-for- Python-Requests-Module
).
Menetapkan persekitaran maya
Sekarang mari kita buat persekitaran maya. Ini tidak perlu, tetapi disyorkan, kerana ia mengasingkan kebergantungan dan memastikan persekitaran python selaras dengan yang akan digunakan oleh Lambda. Untuk melakukan ini, dalam konsol di dir projek anda, input
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)}"
Yang pertama membuat python menjalankan modul Venv dengan -m venv dan mewujudkan persekitaran maya yang dipanggil Venv.
selepas ini, anda harus melihat dalam shell anda seperti ini.
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) pada mulanya menunjukkan anda berada di persekitaran maya.
Kadang -kadang saya suka debug menjalankan fail python secara langsung dan bukannya dengan alat SAM (kerana ia lebih cepat). Untuk melakukan ini, saya akan memasang semua pakej luaran pada persekitaran maya saya supaya saya dapat menggunakannya secara tempatan untuk pembangunan dan debugging.
└── layer_utils └── python ├── layer_utils │ ├── __init__.py │ ├── processor.py │ └── request_handler.py ├── pyproject.toml └── requirements.txt
sekarang kita perlu membungkus lapisan, jadi lambda kami dapat mencari lapisan sebagai pakej python.
[project] name = "layer_utils" version = "0.1.0" [build-system] requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta"
OK, mari kita lihat bagaimana kita akan debug ini. Ini adalah struktur folder saya dengan lapisan dan lambdas.
layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py
ini adalah kod lambda saya
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)}"
anda boleh menjalankan fail dan anda harus mendapatkan hasil yang sah tanpa kesilapan.
Jika anda menggunakan kod Visual Studio dengan Pylance, anda mungkin melihat bahawa import lapisan tidak menyelesaikan walaupun kod tersebut telah berfungsi.
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}
Menambah lapisan ke timbunan anda
3
Di Contenturi, anda dapat melihat bagaimana ia merujuk kepada laluan relatif di mana kod lapisan itu. Lihat bagaimana ia tidak menunjuk pada folder Python, kerana sistem AWS Sam akan mencari folder Python di sana. Pastikan runtime sepadan dengan yang anda gunakan dalam persekitaran maya anda dan lamnbda anda.
Juga, anda perlu merujuk lapisan pada bahagian lambda fail
└── layer_utils └── python ├── layer_utils │ ├── __init__.py │ ├── processor.py │ └── request_handler.py ├── pyproject.toml └── requirements.txt
Perhatikan bahawa dalam bahagian lapisan fail templat kami juga mempunyai lapisan permintaan yang sudah ada di AWS kami. Ini akan mewujudkan lapisan tempatan, jadi Sam akan tahu ia perlu membacanya. Ia juga akan menggunakan lapisan ini pada AWS setiap kali anda memanggil AWS Deploy.
Debugging dengan Sam
[project] name = "layer_utils" version = "0.1.0" [build-system] requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta"
Sekarang kita boleh memanggilnya. Saya membuat fail acara untuk menguji lambda
requests==2.32.2
Sekarang kita boleh menggunakan fail untuk debugging. Ingat bahawa anda memerlukan Docker dipasang dan berjalan untuk ini. Sekali lagi, ingatlah untuk memohon ini dari tempat di mana fail templat.
Ini akan memohon fungsi pada template.yml. Bendera -d bendera menunjukkan bahawa port debug ialah 5678.
mari kita selesaikan ini dengan menggunakan kod ke AWS.
layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py
Bendera yang boleh digunakan boleh digunakan pada kali pertama jika anda belum menggunakan Lambda anda, kerana ia akan membantu anda dalam proses. Selepas melakukan ini, anda boleh pergi ke konsol AWS dan mencari lapisan anda. Anda kini boleh menggunakan lapisan dengan lambdas lain dengan menggunakan ARN lapisan.
kita perlu menambah konfigurasi debug. Untuk melakukan ini, lakukan Control/Command Shift P dan Taip Debug: Tambah Konfigurasi .... Ini akan membuka fail launch.json. Anda perlu menambah konfigurasi di sana.
./. 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)}"
Kami akan memerlukan perpustakaan debugpy untuk debug. Mari kita tambahkan terlebih dahulu ke keperluan.txt Lambda anda
3
sekarang mari kita pasang dengan 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}
└── 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"
di sini kita menentukan AWS_SAM_LOCAL supaya lambda akan tahu bahawa berjalan secara tempatan melalui AWS Sam.
kita juga perlu memberitahu persekitaran python kita bahawa ia perlu menggunakan pembolehubah persekitaran dari fail persekitaran. Ini adalah bagaimana ia kelihatan seperti
requests==2.32.2
./. Vscode/settings.json
dan akhirnya kita perlu mengubah suai kod Lambda kami supaya ia perlu melampirkan ke debugger ketika menjalankannya secara tempatan. Pada permulaan fail kami, kami akan menambah sekeping kod berikut
./ Lambdas/Mylambda/Src/Lambda_Function.py
python3.12 -m venv venv source venv/bin/activate
Sekarang, kami memanggil fungsi (sekali lagi, dari jalan di mana fungsi itu):
(venv) usar@MacBookPro my-lambda-project
dan sekarang anda sudah bersedia untuk debug lapisan tempatan dan lambdas anda!
Atas ialah kandungan terperinci Buat, debug, dan gunakan kod anda sebagai lapisan AWS Lambda yang boleh diguna semula. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!