لایه لامبدا در پایتون — راهنمای مقدماتی

۱۲۹ بازدید
آخرین به‌روزرسانی: ۰۴ مهر ۱۴۰۲
زمان مطالعه: ۴ دقیقه
لایه لامبدا در پایتون — راهنمای مقدماتی

در این مقاله تلاش کرده‌ایم یک لایه لامبدا در پایتون به صورت ابتدایی بسازیم. به این منظور از فریمورک Serverless در پایتون 3 استفاده می‌کنیم. راه‌اندازی این فریمورک ساده، توزیع آن آسان و مستندات و راهنماهایی که برای آن عرضه شده، دائماً در حال افزایش است.

با این حال علی‌رغم همه مزیت‌های فوق یکی از نکات آزاردهنده مهم، توزیع فایل‌های zip بزرگ است، چون پکیج‌های پایتون گاهی بسیار بزرگ هستند. شاید بپرسید منظور از بزرگ چه مقدار بزرگ است؟

فرض کنید لازم است از NumPy استفاده کنید که یکی از پر دانلودترین پکیج‌های پایتون محسوب می‌شود. این پکیج در زمان استخراج از حالت فشرده حجمی در حدود 85 مگابایت دارد.

 لایه لامبدا در پایتون

فشرده‌سازی و توزیع تابع‌هایی که از این پکیج استفاده می‌کنند ممکن است بسیار بزرگ و کاری زمان‌بر باشد که زمان توسعه و توزیع را تا حدود زیادی کندتر می‌سازد.

راه‌حل: لایه‌ها

AWS در نوامبر 2018، «لایه‌های لامبدا» (Lambda Layers) را به عنوان یک روش برای حل این مشکل عرضه کرده است. لایه‌های لامبدا به عنوان روشی برای افراز کد با قابلیت استفاده مجدد به کامپوننت‌های مجزا فراهم می‌سازد. بدین ترتیب می‌توانید صرفاً تغییرات در تابع‌های لامبدای «منطق تجاری» (Business Logic) را توزیع کنید و موارد دیگر را که به ندرت تغییر پیدا می‌کنند و کد مشترکی مانند کتابخانه NumPy محسوب می‌شوند را در لایه‌ای مجزا نگهداری کنید.

در ادامه مثالی ارائه شده که نشان می‌دهد چگونه لایه‌ها می‌توانند کد مشترک را در تابع‌های لامبدا افراز کنند:

 لایه لامبدا در پایتون

بررسی مثال

در ادامه یک راهنمای گام به گام برای تبیین شیوه راه‌اندازی یک مثال کاربردی با استفاده از لایه‌های لامبدا ارائه شده است. برای مشاهده کد کامل آن به این صفحه گیت‌هاب (+) مراجعه کنید.

راه‌اندازی یک تابع ساده Serverless پایتون

یک سرویس Serverless پایتون 3 راه‌اندازی کرده و یک محیط مجازی برای آن ایجاد کنید:

sls create -t aws-python3 -p sls-layers-python
cd sls-layers-python
virtualenv -p python3 venv
. venv/bin/activate

 لایه لامبدا در پایتون

Numpy را نصب کنید:

pip install numpy

 لایه لامبدا در پایتون

یک تابع hello ساده با استفاده از numpy در فایل handler.py ایجاد کنید:

1import json
2import numpy as np
3
4def hello(event, context):
5	arr = np.arange(15).reshape(3, 5)
6	b = arr.tolist()
7
8	body = {
9		"result": b
10	}
11
12	response = {
13		"statusCode": 200,
14		"body":json.dumps(body)
15	}
16
17	return response

این کد را به صورت لوکال تست کنید:

sls invoke local -f hello

 لایه لامبدا در پایتون

اینک زمان توزیع فرا رسیده است، اما پیش از اقدام به توزیع کد باید میزان بزرگ بودن فایل zip را بررسی کنیم. بدین ترتیب یک مقدار ابتدایی برای مقایسه‌های آتی خواهیم داشت. پکیج serverless را اجرا کنید تا تابع را به صورت محلی zip کند و اندازه فایل zip را که قرار است توزیع شود بررسی کنید:

sls package
ls -lh.serverless/*.zip

 لایه لامبدا در پایتون

در خروجی دستور فوق می‌بینیم که فایل کنونی فشرده دارای حجم 42 مگابایت است. این تابع را افراز می‌کنیم. اما پیش از آغاز به این کار باید در مورد چارچوب کار نیز توضیح بدهیم. در زمان نگارش این مقاله فریمورک Serverless نمی‌تواند عملاً لایه‌های را به صورت مجزا از هم توزیع کند. دلیل این مسئله یک محدودیت در CloudFormation است. بنابراین بهترین روش برای حل این مشکل آن است که لایه و تابع‌ها را در پشته‌های مجزایی نگهداری کنیم.

به همین دلیل بهترین رویه کنونی افراز کد به صورت زیر است:

محیط مجازی را غیرفعال کنید و به دایرکتوری root بروید. سپس یک پشته Serverless دیگر ایجاد کرده و این بار آن را sls-layers-python-requirements بنامید:

deactivate
cd..
sls create -t aws-python3 -p sls-layers-python-requirements
cd sls-layers-python-requirements

بدین ترتیب ساختار دایرکتوری زیر ایجاد می‌شود:

 لایه لامبدا در پایتون

در ادامه پکیج numpy را مجدداً مقداردهی و نصب می‌کنیم:

virtualenv -p python3 venv
. venv/bin/activate
pip install numpy
pip freeze > requirements.txt

اکنون باید مطمئن شویم که پکیج‌های پایتون در پکیج توزیع ما بسته‌بندی شده‌اند. پلاگین erverless-python-requirements را به صورت زیر نصب می‌کنیم:

yarn add serverless-python-requirements --save-dev

سپس serverless.yml را به صورت زیر به‌روزرسانی می‌کنیم:

1service: sls-layers-python-requirements
2
3provider:
4  name: aws
5  runtime: python3.6
6
7plugins:
8  - serverless-python-requirements
9
10custom:
11  pythonRequirements:
12    dockerizePip: non-linux
13    layer:
14      name: numpy
15      description: Numpy Library
16      compatibleRuntimes:
17        - python3.6

و آن را توزیع می‌کنیم:

sls deploy

این کار کمی طول می‌کشد اما زمانی که انجام یابد، نتیجه‌ای مانند زیر مشاهده می‌کنید:

 لایه لامبدا در پایتون

در تصویر فوق می‌بینیم که خروجی لایه لامبدا ظاهر شده است. آن را کپی می‌کنیم و از آن در پشته sls-layers-python اصلی استفاده می‌کنیم. در این دایرکتوری فایل serverless.yaml را به صورت زیر به‌روزرسانی کنید:

1service: sls-layers-python
2
3provider:
4  name: aws
5  runtime: python3.6
6
7package:
8  individually: true
9  exclude:
10    - venv/**
11    - node_modules/**
12
13functions:
14  hello:
15    handler: handler.hello
16    layers:
17      - arn:aws:lambda:us-east-1:XXXXXXXXXX:layer:numpy:1

سپس همانند قبل باید مطمئن شویم که بسته سرورلس ما می‌تواند همچنان در زمان توزیع به پکیج NumPy پایتون ارجاع دهد:

yarn add serverless-python-requirements --save-dev
pip freeze > requirements.txt

اکنون اندازه این پکیج جدید را پیش از انتظار برای یک توزیع 41 مگابایتی دیگر بررسی می‌کنیم. دستورهای زیر را اجرا کنید:

sls package
ls -lh.serverless/*.zip

 لایه لامبدا در پایتون

چنان که می‌بینید اندازه آن 6.2 کیلوبایت است که بسیار بهتر شده است. این پکیج را با استفاده از دستور زیر توزیع می‌کنیم:

sls deploy

 لایه لامبدا در پایتون

اکنون که هم NumPy و هم منطق تجاری خود را توزیع کرده‌ایم، می‌توانیم این بسته را با اجرای دستور زیر تست کنیم:

sls invoke -f hello

 لایه لامبدا در پایتون

محدودیت‌های این روش کدام است؟

با این که این راه‌حل بهبود عظیمی در توزیع Serverless محسوب می‌شود اما چند مشکل نیز وجود دارند که باید از آن مطلع باشید. مهم‌ترین مشکل‌ها به شرح زیر هستند:

  • اندازه کلی پکیج توزیع (لایه‌های لامبدا و منطق تجاری) نمی‌تواند از 250 مگابایت در حالت نافشرده تجاوز کند.
  • حداکثر می‌توان پنج لایه لامبدا برای هر کارکرد استفاده کرد.

سخن پایانی

یکی از قابلیت‌های دیگر این روش امکان ارجاع به لایه‌ها از حساب‌های AWS دیگر است. به همین دلیل بسیاری از افراد و سازمان‌ها لایه‌های لامبدای خاص خود را در دسترس همه افراد برای استفاده قرار داده‌اند. لیستی از لایه لامبدای AWS را می‌توانید در این صفحه (+) ملاحظه کنید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
better-programming
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *