اگر تا به حال خواسته اید بدون ایجاد ارتباط با سرور ، یک برنامه وب یا API بنویسید ، لامبدا آمازون ممکن است همان چیزی باشد که شما به دنبال آن هستید.

Amazon Web Services (AWS) مجموعه ای از ابزارهای توسعه دهنده است که آمازون توسعه می دهد و به صورت عمومی ارائه می دهد. این مقاله شما را با Lambda ، ابزاری در مجموعه AWS ، فعال می کند. ما از Lambda برای ایجاد یک نقطه پایان HTTP GET استفاده خواهیم کرد که درخواست های شما را با استفاده از GitHub API برای برداشتن اطلاعات مخزن از GitHub و برگرداندن پاسخ JSON.

عنوان Lambda “اجرای کد بدون فکر کردن در مورد سرورها” است. در نگاه اول ، این ممکن است گیج کننده به نظر برسد. کد آن موقع کجا یا چگونه اجرا می شود؟ بیایید بفهمیم

برای پیگیری این مقاله ، به یک حساب AWS مخصوص خود نیاز دارید. می توانید یک حساب AWS رایگان در. ایجاد کنید aws.amazon.com.

با Node.js و AWS Lambda میکرو سرویس های بدون سرور ایجاد کنید

بدون سرور و توابع به عنوان یک سرویس

“Serverless” یک اصطلاح زیرساخت نرم افزاری است که ممکن است در مورد آن شنیده باشید. این یک راه حل برای اجرای کد درخواستی را توصیف می کند. اصطلاح “بدون سرور” می تواند گمراه کننده باشد زیرا در معادله هنوز سرورهایی وجود دارد. توصیف بهتر FaaS یا “عملکرد به عنوان یک سرویس” است.

هر دو تعریف تجربه جدید توسعه و استقرار را توصیف می کنند. این تجربه “بدون سرور” در نظر گرفته می شود زیرا شما به عنوان یک توسعه دهنده دیگر مجبور نیستید سرورهایی را که کد شما را اجرا می کنند مدیریت ، نظارت یا مقیاس بندی کنید. شما کد خود را در یک ارائه دهنده FaaS بارگذاری می کنید (در این حالت AWS Lambda) ، و ارائه دهنده FaaS آن را اجرا می کند و هر زیرساختی را برای شما در پشت صحنه مدیریت می کند.

جوانب مثبت و منفی معماری بدون سرور

با توجه به این تعریف گسترده از معماری “بدون سرور” ، بیایید به موارد مثبت و منفی هنگام کار با Lambda بپردازیم.

طرفداران

  • قیمت درخواستی مصرف
    میزبانی سنتی سرور از یک چرخه صورتحساب تکراری استفاده می کند. سرور شما همیشه فعال است و از منابع استفاده می کند و منتظر ورود است. برای ادامه کار در طول چرخه صورتحساب خود ، ماهیانه یا سالانه هزینه پرداخت می کنید. با استفاده از Lambda ، فقط برای منابع محاسباتی که استفاده می کنید و نه وقت بیکار ، صورتحساب دریافت می شود. Lambda دو مدل قیمت گذاری استفاده دارد: مدت زمان و همزمانی.

  • قیمت گذاری مدت زمان
    قیمت گذاری مدت زمان Lambda قیمت ها را بر اساس زمانی که عملکرد شروع به کار می کند تا زمان خاتمه محاسبه می کند. این محاسبه قیمت برای پروژه هایی که از منابع محاسباتی کوتاه مدت استفاده می کنند مفید است. شما می توانید مبلغ قابل توجهی از طریق راه حل های سنتی “بیکار” میزبانی کنید.

    قیمت لامبدا به شرح زیر است:

    • 0.20 دلار به ازای هر 1 میلیون درخواست
    • 0.00001667 دلار برای هر GB-ثانیه مدت زمان محاسبه ، با هر اجرا تا نزدیکترین 100ms

    قیمت گذاری مدت زمان بستگی به استفاده از حافظه از قبل پیکربندی شده در عملکرد مستقر شده شما دارد. این مدت زمان و تنوع حافظه یک ماتریس قیمت گذاری ایجاد می کند که جزئیات بیشتری در مورد آن ارائه می شود صفحه قیمت لامبدا.

  • قیمت گذاری همزمان
    قیمت گذاری حالت “پیش بینی شده هم زمان” قیمت را از زمان فعال بودن تا غیرفعال شدن محاسبه می کند. حالت همزمانی عملکردهای لامبدا را آماده نگه می دارد و هر زمان راه اندازی را از حالت مدت زمان حذف می کند.

    قیمت همزمان لامبدا به شرح زیر است:

    • ارز تأمین شده برای هر گیگابایت در ثانیه 0.0000041667 دلار است
    • درخواست ها 0.20 دلار به ازای هر 1 میلیون درخواست است
    • مدت زمان برای هر گیگابایت ثانیه 0.0000097222 دلار است

    صفحه قیمت گذاری AWS شامل جزئیات بیشتر و نمونه هایی از ماتریس قیمت گذاری است. در مورد بیشتر بیاموزید صفحه قیمت لامبدا.

  • داخلی مقیاس گذاری داخلی
    در یک زیرساخت میزبان سنتی ، زمانی فرا می رسد که ممکن است لازم باشد نگران عملکرد و مقیاس بندی باشید. با افزایش بازدید و استفاده از برنامه ، ممکن است لازم باشد سرورهای میزبان بیشتری را به زیرساخت خود اضافه کنید تا با تقاضا مطابقت داشته باشید. مقیاس گذاری خود مدیریت شده می تواند باعث خرابی ها و گلوگاه هایی برای کاربران شما شود. Lambda مراقبت از مقیاس گذاری را در صورت نیاز به طور خودکار انجام می دهد ، و هزینه اضافی شناختی را از بین می برد.

منفی ها

  • گردش کار توسعه محلی ناسازگار.

    می توانید کد عملکرد Lambda را به صورت محلی بنویسید و آن را جداگانه آزمایش کنید. هنوز هم بدون ایجاد نسخه هک شده Lambda قادر به شبیه سازی محلی برای تولید نیستید.

مفاهیم کلیدی Lambda: Code and Triggers

لامبدا دو مفهوم اصلی دارد: کد و محرک. کد خود توضیحی است. در مورد ما ، این کد JavaScript است که شما برای تولید رفتارهای مورد نظر خود می نویسید و آن را برای لامبدا بارگذاری می کنید.

پس از بارگذاری ، کد به خودی خود اجرا نمی شود. اینجاست که راه اندازها وارد می شوند. راه اندازها رویدادهایی هستند که توسط سایر سرویس های AWS شلیک می شوند و داده ها را برای اجرا به عملکرد Lambda منتقل می کنند.

برخی از نمونه های محرک در موارد زیر مشاهده می شوند:

  • درخواست HTTP به AWS API Gateway کد Lambda را آتش می زند
  • یک رویداد با فاصله زمانی مانند کار cron از CloudWatch Events اخراج می شود
  • یک جدول DynamoDB به روز شده و کد Lambda را تحریک می کند

امضای عملکرد کد Lambda

شما یک تابع Lambda را با صادر کردن یک تابع منظم از JavaScript متناسب با امضای مورد انتظار Lambda تعریف می کنید:

exports.myLambdaFunction = (event, context, callback) => {
   
}

این تابع سه آرگومان دریافت می کند:

  • event: یک فرهنگ لغت جفت مقدار کلیدی “داده های محرک” که Lambda به تابع منتقل می کند.

  • context: اطلاعات داخلی AWS مانند شناسه درخواست AWS ، مهلت انقضا Lambda و اطلاعات ورود به سیستم. برای اطلاعات بیشتر ، به اسناد لامبدا.

  • callback: یک کنترل کننده تماس با JavaScript async استاندارد. برای اطلاعات بیشتر به اسناد لامبدا

ساخت یک عملکرد Lambda

برای شروع ایجاد یک تابع Lambda جدید ، از اینجا بازدید کنید داشبورد لامبدا.

باید شبیه به این باشد:

داشبورد لامبدا

کلیک کنید بر روی ایجاد عملکرد دکمه برای شروع

ایجاد عملکرد

صفحه بعدی با چند گزینه برای ایجاد عملکرد Lambda از شما درخواست می کند.

Lambda گزینه هایی ایجاد می کند

گزینه ها عبارتند از:

  • نویسنده از ابتدا
  • از طرح اولیه استفاده کنید
  • تصویر ظرف
  • مخزن برنامه بدون سرور را مرور کنید

برای اهداف ما ، را انتخاب کنید نویسنده از ابتدا و بخش “اطلاعات اساسی” را پر کنید. نام تابع را اضافه کنید. (من از “GithubGet” در زیر استفاده کرده ام.) روی کلیک کنید ایجاد عملکرد دکمه برای ادامه

بررسی اجمالی عملکرد

اکنون در صفحه نمای کلی عملکرد هستیم.

نمای کلی عملکرد

پنجره نمای کلی عملکرد بالا شامل عملکردها ، عملکرد و مقصد است. پنجره پایین شامل کد کد و برگه ها برای سایر تنظیمات است. بعد ، ما یک ماشه را به عملکرد اضافه می کنیم. کلیک کنید بر روی ماشه را اضافه کنید دکمه.

ماشه را اضافه کنید

در صفحه افزودن ماشه ، موارد زیر را انجام دهید:

  1. “API Gateway” را از لیست کشویی انتخاب کنید
  2. از منوی کشویی API “ایجاد یک API” را انتخاب کنید
  3. گزینه HTTP API را انتخاب کنید
  4. “Open” را از لیست کشویی Security انتخاب کنید

پیکربندی ماشه نهایی باید به این شکل باشد:

صفحه افزودن ماشه را فشار دهید

کلیک کنید بر روی اضافه کردن دکمه برای ادامه

تعیین کد عملکرد Lambda

اکنون ما یک ماشه API Gateway قبل از عملکرد GithubGet در صفحه نمایشی عملکرد ثبت کرده ایم.

عملکرد با ماشه

در پنجره پایین ، برای مشاهده ویرایشگر کد ، روی برگه “کد” کلیک کنید. یک “سلام ، جهان” از قبل پیکربندی شده وجود دارد کد مثالی که به این شکل است:

exports.handler = async (event) => {
    
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

اکنون که ماشه API Gateway در دسترس است ، می توانیم به صورت عمومی به این عملکرد دسترسی پیدا کنیم. بر روی برگه “پیکربندی” و برگه “راه اندازها” کلیک کنید و ماشه “API Gateway” را گسترش دهید.

پیکربندی ماشه

شما باید ببینید نقطه پایانی API: ورودی با یک URL. روی آن URL کلیک کنید ، و باید صفحه ای را بزنید که “سلام از لامبدا!” پیام تبریک می گویم! شما یک نمونه ساده AWS Lambda تنظیم کرده اید. ویرایشگر داخلی برای راه اندازی کد Lambda به سربار کمی نیاز دارد ، اما ما قصد داریم کارهای پیشرفته تری را برای این آموزش انجام دهیم.

ایجاد توابع پیچیده با وابستگی ها

در بیشتر سناریوهای واقعی ، شما می خواهید عملکردهای پیچیده تری را با استفاده از کتابخانه های شخص ثالث نصب شده از طریق npm ایجاد کنید.

بیایید یک تابع سفارشی ایجاد کنیم که از وابستگی npm استفاده کند و آن را در Lambda بارگذاری کنیم. می توانید مراحل زیر را دنبال کنید یا در صورت تمایل کد را از آن بگیرید مخزن مثال.

ایجاد عملکرد جدید

بیایید یک پوشه برای عملکرد جدید خود تنظیم کنیم و از داخل ، npm را با پیش فرض مقدار دهی اولیه کنیم package.json فایل:

npm init -f

بعد ، مشتری رسمی GitHub را نصب خواهیم کرد:

npm install @octokit/rest

پرونده را ایجاد کنید index.js با کد زیر:

const { Octokit } = require("@octokit/rest");
const octokit = new Octokit();

exports.handler = async (event) => {
  try{
    const ghres = await octokit.rest.search.repos({
      q: "sitepoint",
      sort: "stars"
    });

    const result = ghres.data.items.map(function(repo){
      return { url: repo.html_url, "stars": repo.stargazers_count };
    });

    return {
      statusCode: 200,
      body: JSON.stringify(result)
    }

  }catch(error){
    return {
      statusCode: 500,
      body: {error: error}
    }
  }
};

در اینجا تجزیه و تحلیل عملکرد این کد وجود دارد:

  • این برنامه شامل API استراحت GitHub “Octokit” است.
  • این یک تابع را تعریف می کند handler که با امضای لامبدا مطابقت دارد.
  • چه زمانی handler فراخوانی می شود ، این درخواست جستجو برای GitHub برای همه repos های منطبق را ایجاد می کند sitepoint به عنوان یک پرس و جو
  • با پاسخ Github ، نقشه ای ایجاد می شود که شامل URL و تعداد ستاره برای هر repo است.
  • سرانجام ، یک پاسخ HTTP را مانند یک شی that منطبق با یکپارچه سازی مورد انتظار API Gateway.

بارگذاری در AWS Lambda

با استفاده از هر برنامه zip که با آن آشنا هستید ، یک فایل zip از پرونده های عملکرد ایجاد کنید. من از خط فرمان استفاده کردم zip ابزار در macOS ، مانند این:

zip -r lambdaupload.zip ./index.js ./node_modules/

برای بارگذاری کد در Lambda ، به ویرایشگر Code در نمای کلی عملکرد برگردید و روی آن کلیک کنید بارگذاری از انتخاب کنید و “.zip” را انتخاب کنید.

بارگذاری فشرده

سپس گزینه را انتخاب کنید lambdaupload.zip از رایانه خود پرونده بگیرید و آن را در AWS بارگذاری کنید. شما باید تازه سازی ویرایشگر کد را مشاهده کنید و مدیری که در بالا نوشتیم بارگذاری شود. اگر از URL نقطه پایانی API که از پیکربندی ماشه پیدا کردیم بازدید کنید ، باید به جای پاسخ “سلام از لامبدا!” پاسخ جدیدی را ببینید. پیام تبریک می گویم! شما کدی را با موفقیت در Lambda مستقر و فعال کردید.

گام های بعدی و آینده لامبدا

امیدوارم این پروژه زمینه خوبی برای کار با AWS Lambda به شما داده باشد. اگرچه ما از کد یک شخص ثالث (GitHub) در کد عملکرد خود استفاده کردیم ، این می تواند با هر API مشتری دیگر یا اتصال مشتری پایگاه داده جایگزین شود.

چارچوب های بدون سرور

این مقاله روند بسیار دستی و تا حدی زودگذر پیکربندی Lambda را نشان می دهد. روش های دیگری برای پیکربندی و راه اندازی اولیه Lambda که توسط AWS API رانده می شود وجود دارد.

برخی از ابزارها و چارچوب ها در بالای API AWS ساخته شده اند که به ساده سازی این روند کمک می کنند:

  • serverless.com: این بالاترین چارچوب FaaS است. این یک تجربه کاملاً جامع Lambda را ارائه می دهد و در مورد سایر ارائه دهندگان FaaS غیر AWS اعمال می شود. این یک تنظیم محلی برای توسعه محلی برای تکرار سریع ، استقرار خودکار کد Lambda ، چندین مرحله صحنه سازی استقرار و موارد دیگر را فراهم می کند.

  • terraform.io: این یک ابزار مدیریت زیرساخت به عنوان کد و پیکربندی گسترده است. Terraform به توسعه دهندگان اجازه می دهد تا بصورت واضحی پیکربندی های زیرساخت ابر را تعریف کرده و سپس به طور خودکار آن پیکربندی ها را مستقر و همگام سازی کنند. در تمرین قبلی Lambda ، ما از طریق UI مرورگر AWS پیکربندی دستی زیادی انجام دادیم. این کار نسبتاً طاقت فرسا بود و اگر ما نیاز به تغییر چیزی داشته باشیم ، باید کارهای بیشتری را در رابط کاربری AWS انجام دهیم. در عوض ، ما می توانیم منابعی را که در AWS استفاده کردیم با Terraform تعریف کنیم و از Terraform به طور خودکار عملکرد Lambda را مستقر کنیم.

شما چی فکر میکنید؟

آیا FaaS را برای پروژه های آینده در نظر خواهید گرفت؟ شاید شما قبلاً از Lambda به عنوان بخشی از معماری برنامه خود استفاده کرده اید؟ در هر صورت ، من دوست دارم نظر خود را بشنوید.