لایه لامبدا در پایتون — راهنمای مقدماتی
در این مقاله تلاش کردهایم یک لایه لامبدا در پایتون به صورت ابتدایی بسازیم. به این منظور از فریمورک 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 را میتوانید در این صفحه (+) ملاحظه کنید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون Python
- مجموعه آموزشهای برنامهنویسی
- گنجینه آموزشهای برنامهنویسی پایتون (Python)
- زبان برنامه نویسی پایتون (Python) — از صفر تا صد
- قابلیتهای جدید پایتون ۳.۸ — راهنمای کاربردی
==