استقرار API لاراول در AWS Lambda

حدود دو ماه پیش، وظیفه ای به من داده شد تا API لاراول را در لامبدا مستقر کنم. و سپس راههایی برای استقرار آن با استفاده از چارچوب بدون سرور و Bref پیدا کردم.
فریم ورک بدون سرور چیست؟
چارچوب بدون سرور یک چارچوب متن باز است که به توسعه دهندگان اجازه می دهد برنامه ها و توابع بدون سرور را بسازند و به کار گیرند. این فرآیند مدیریت معماری های بدون سرور را با انتزاع کردن مدیریت زیرساخت زیربنایی ساده می کند. با استفاده از چارچوب بدون سرور، توسعه دهندگان می توانند بیشتر بر روی نوشتن کد تمرکز کنند و کمتر بر روی مدیریت سرورها یا تامین منابع تمرکز کنند.
برای نصب بدون سرور، باید از npm استفاده کنید:
npm install -g serverless
برف چیست؟
برای مدیریت عملکرد، Bref یک ابزار رابط خط فرمان (CLI) برای مقداردهی اولیه، استقرار و مدیریت برنامههای PHP بدون سرور ارائه میکند. توسعه دهندگان می توانند از CLI برای ایجاد پروژه های جدید، استقرار توابع در AWS Lambda و مدیریت تنظیمات پیکربندی استفاده کنند.
شما بچه ها همچنین محیط زمان اجرا را برای اجرای برنامه های PHP با استفاده از Bref تنظیم کنید. این محیط شامل پشتیبانی از PHP 7.x، 8.x، افزونههایی است که معمولاً در برنامههای PHP استفاده میشوند، و ویژگیهایی مانند رسیدگی به درخواست HTTP، متغیرهای محیطی و گزارشگیری.
Bref را با استفاده از composer نصب کنید:
cd laravel-project
composer require bref/bref bref/laravel-bridge --update-with-dependencies
در نهایت، برای استقرار تابع یا برنامه خود باید همه چیز را تعریف کنیم، از جمله زمان اجرا، نسخه زمان اجرا، مرحله، محیط، ارائه دهنده ابر در فایلی به نام serverless.yml
برپایی
خوب، فکر می کنم توضیح و نصب کافی است. حالا بیایید تنظیماتی را انجام دهیم. 🙂
cd laravel-project
ايجاد كردن serverless.yml
:
php artisan vendor:publish --tag=serverless-config
در حال حاضر، شما نیاز دارید
service: laravel
provider:
name: aws
region: ap-southeast-2
stage: dev
runtime: provided.al2
environment:
DB_HOST: wwww.ap-southeast-2.rds.amazonaws.com
DB_DATABASE: xxxx
DB_USERNAME: yyyy
DB_PASSWORD: zzzz
vpc:
securityGroupIds:
- sg-xyz
subnetIds:
- subnet-abcd
package:
# Files and directories to exclude from deployment
patterns:
- '!node_modules/**'
- '!resources/assets/**'
- '!storage/**'
- '!tests/**'
- '!docker/'
- '!.husky/'
- '!.github/**'
functions:
# This function runs the athena website/API
athena:
handler: public/index.php
runtime: php-82-fpm
timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
events:
- httpApi: '*'
# This function lets us run artisan commands in Lambda
artisan:
handler: artisan
runtime: php-82-console
timeout: 720 # in seconds
# Uncomment to also run the scheduler every minute
#events:
# - schedule:
# rate: rate(1 minute)
# input: '"schedule:run"'
plugins:
# We need to include the Bref plugin
- ./vendor/bref/bref
کمی توضیح
service: laravel
provider:
name: aws
region: ap-southeast-2
stage: dev
runtime: provided.al2
environment:
DB_HOST: wwww.ap-southeast-2.rds.amazonaws.com
DB_DATABASE: xxxx
DB_USERNAME: yyyy
DB_PASSWORD: zzzz
vpc:
securityGroupIds:
- sg-xyz
subnetIds:
- subnet-abcd
-
service
: این نام سرویس ما را مشخص می کند. در این مورد، “لاراول” نامیده می شود. -
provider
:-
name
: مشخص می کند که ارائه دهنده ابر. به عنوان مثال ما از AWS استفاده می کنیم. -
region
: منطقه AWS را مشخص می کند که منابع ما در آنجا مستقر خواهند شد. در این مورد، منطقه آسیا و اقیانوسیه (سیدنی) است. -
stage
: مرحله یا محیط استقرار را مشخص می کند. در اینجا، روی “dev” تنظیم شده است که نشان دهنده یک مرحله توسعه است، یاprod
تولید را نشان می دهد. -
runtime
: زمان اجرا Lambda را مشخص می کند.provided.al2
نشان می دهد که ما از یک زمان اجرا سفارشی مبتنی بر لینوکس آمازون 2 استفاده می کنیم. این یک انتخاب رایج برای برنامه های کاربردی مبتنی بر PHP است. سپس از دیگر لایک های زمان اجرا استفاده خواهید کرد. Node Js، Python، .NET و غیره -
environment
: متغیر محیطی را مشخص می کند که برای تابع Lambda ما در دسترس خواهد بود. در این مورد من یک محیط برای پایگاه داده RDS نوشتم. به هر حال، بعداً در مورد AWS CDK با استفاده از پایتون برای ایجاد کلاسترهای پایگاه داده و غیره خواهم نوشت. -
vpc
: این نشان می دهد که ما در حال پیکربندی تنظیمات Virtual Private Cloud برای عملکردهای Lambda خود هستیم. این برای سناریوهایی مفید است که توابع Lambda شما نیاز به تعامل با منابعی دارند که فقط در VPC شما قابل دسترسی هستند، مانند پایگاههای داده میزبانی شده در Amazon RDS یا سرویسهایی که در نمونههای Amazon EC2 اجرا میشوند. -
securityGroupIds
: گروه های امنیتی مرتبط با توابع Lambda ما را مشخص می کند. -
subnetIds
: زیرشبکه هایی را مشخص می کند که توابع Lambda ما در آنها مستقر خواهند شد. زیرشبکه ها بخش هایی از VPC ما هستند که می توانید منابع را در آنها قرار دهید. subnet-abcd شناسه زیرشبکه ای است که توابع Lambda ما در آن مستقر خواهند شد.
-
package:
# Files and directories to exclude from deployment
patterns:
- '!node_modules/**'
- '!resources/assets/**'
- '!storage/**'
- '!tests/**'
- '!docker/'
- '!.husky/'
- '!.github/**'
functions:
# This function runs the athena website/API
athena:
handler: public/index.php
runtime: php-82-fpm
timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
events:
- httpApi: '*'
# This function lets us run artisan commands in Lambda
artisan:
handler: artisan
runtime: php-82-console
timeout: 720 # in seconds
# Uncomment to also run the scheduler every minute
#events:
# - schedule:
# rate: rate(1 minute)
# input: '"schedule:run"'
plugins:
# We need to include the Bref plugin
- ./vendor/bref/bref
بسته
-
patterns
: فایل ها و دایرکتوری هایی را که باید از بسته استقرار حذف شوند را مشخص می کند. اینها معمولاً دایرکتوری هایی هستند که حاوی فایل های توسعه یا آزمایش هستند که در استقرار تولید مورد نیاز نیستند.
کارکرد
-
functions
: یک تابع Lambda را تعریف می کند که مسئول اجرای وب سایت/API Athena است. -
handler
: نقطه ورود برای تابع را مشخص می کند. در این مورد، public/index.php است که برای برنامه های لاراول معمولی است. -
runtime
: زمان اجرا را برای تابع Lambda مشخص می کند. روی php-82-fpm تنظیم شده است، که نشان می دهد PHP 8.2 به عنوان FastCGI Process Manager (FPM) اجرا می شود. -
timeout
: مدت زمان اجرای تابع را بر حسب ثانیه تنظیم می کند. -
events
: تریگر رویداد را برای تابع تعریف می کند. در این مورد، یک راهانداز رویداد HTTP API است. -
artisan
: یک تابع Lambda به نام “Artisan” را تعریف می کند که مسئول اجرای دستورات artisan در Lambda است. -
handler
: نقطه ورود برای تابع را مشخص می کند. در اینجا، artisan است، که نشاندهنده Laravel artisan CLI است. -
runtime
: زمان اجرا را برای تابع Lambda مشخص می کند. روی php-82-console تنظیم شده است که نشان می دهد PHP 8.2 در حالت کنسول اجرا می شود.
پلاگین ها
-
./vendor/bref/bref
: پلاگین Bref را مشخص می کند که برای استقرار برنامه های PHP در AWS Lambda ضروری است. این افزونه زمان اجرا و ادغام لازم با سرویس های AWS را فراهم می کند.
خوب در نهایت، ما تابع را با اجرای دستور بدون سرور مستقر خواهیم کرد:
serverless deploy
یا
sls deploy
Deploying laravel to stage dev (ap-southeast-2)
✔ Service deployed to stack laravel-dev (102s)
endpoint: ANY - https://xxyyzz.execute-api.ap-southeast-2.amazonaws.com
functions:
athena: laravel-dev-athena (45 MB)
artisan: laravel-dev-artisan (45 MB)
Want a better experience than the AWS console? Try out https://dashboard.bref.sh
مهاجرت با استفاده از bref، معمولا ما استفاده می کنیم artisan
فرمان، مانند php artisan migrate
اما اگر از bref استفاده می کنید فقط از:
serverless bref:cli --args="migrate"
توجه: شما بچه ها می توانید از bref برای اجرای دستورات صنعتگر دیگر استفاده کنید.
با دسترسی به API، در این مورد از api/health-check استفاده میکنم:
curl https://xxyyzz.execute-api.ap-southeast-2.amazonaws.com/api/health-check
واکنش:
"Hello to public API."
فعلاً همین است، بعداً در مورد لامبدا یا چیزهای دیگر در مورد AWS خواهم نوشت. امیدوارم که شما از آن لذت ببرید.