برنامه نویسی

استقرار 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 خواهم نوشت. امیدوارم که شما از آن لذت ببرید.

نوشته های مشابه

دکمه بازگشت به بالا