در دنیای امروز توسعه نرمافزار، کانتینرها به دلیل سبکی، قابلیت حمل و سازگاری بالا، به یک فناوری محبوب تبدیل شدهاند. با این حال، انتخاب بهترین روش برای استقرار (Deploy) آنها، به ویژه برای موارد سادهای که تنها نیاز به اجرای یک کانتینر دارند، میتواند چالشبرانگیز باشد. بسیاری از راهحلهای موجود بر روی اورکستراسیون و مدیریت کانتینرهای متعدد متمرکز شدهاند. در این مقاله، ما به سراغ یک راهحل ساده و قدرتمند میرویم: استقرار یک کانتینر داکر با استفاده از سرویس سرورلس Lambda در سکوی ابری Amazon Web Services (AWS). این ترکیب به شما امکان میدهد تا بدون دغدغه مدیریت زیرساخت، بر روی منطق کسبوکار و بهبود عملکرد برنامه خود تمرکز کنید.
داکر (Docker) ابزاری است که به شما کمک میکند برنامهها یا نرمافزارها را در واحدهای قابل حمل، استاندارد و قابل اشتراکگذاری بستهبندی کنید. این واحدها که کانتینر نامیده میشوند، شامل تمامی ملزومات اجرای برنامه مانند کتابخانهها، محیط اجرا (Runtime)، ابزارهای سیستمی و کد برنامه هستند. این ویژگیها مزایای کلیدی زیر را به همراه دارند:
محاسبات سرورلس (Serverless) یک مدل اجرایی است که بار سنگین مدیریت سرورها، سیستمعامل و دیگر زیرساختهای پایه را از دوش توسعهدهندگان برمیدارد. در این مدل، شما فقط کد خود را نوشته و آن را اجرا میکنید، در حالی که ارائهدهنده سرویس ابری مانند AWS، به طور خودکار تمامی مسائل مربوط به مقیاسپذیری، در دسترس بودن و نگهداری سرور را مدیریت میکند. AWS Lambda یکی از ابزارهای پیشرو در این حوزه است. مزایای اصلی استفاده از Lambda عبارتند از:
حال، با ترکیب قدرت داکر و AWS Lambda، میتوانیم به یک راهحل بهینه دست یابیم. پشتیبانی Lambda از کانتینرها این امکان را فراهم میسازد که شما برنامه خود را با تمام وابستگیهایش درون یک تصویر داکر بستهبندی کنید و سپس آن را به عنوان یک تابع سرورلس در Lambda اجرا نمایید. این ترکیب مزایای زیر را ارائه میدهد:
در ادامه این مسیر، پس از ساختن و تست تصویر داکر به صورت محلی، آن را در رجیستری کانتینر Amazon ECR آپلود کرده و در نهایت به عنوان یک تابع Lambda مستقر خواهیم کرد تا قدرتمندی این ترکیب را در عمل مشاهده کنیم.
برای دنبال کردن این آموزش، نیاز به درک مفاهیم اولیه و نصب چند ابزار ضروری دارید. دانش اولیه در مورد داکر و نحوه عملکرد آن از ملزومات اصلی است. علاوه بر این، باید داکر را به صورت محلی روی سیستم خود نصب کرده باشید. همچنین، برای تعامل با سرویسهای ابری آمازون، لازم است AWS CLI (رابط خط فرمان AWS) نیز روی کامپیوتر شخصی شما نصب شده باشد. این ابزار امکان اجرای دستورات لازم برای ایجاد و مدیریت منابع در حساب AWS شما را فراهم میکند.
یک حساب کاربری AWS با مجوزهای لازم، رکن اصلی این فرآیند است. شما به یک حساب AWS نیاز دارید که دارای اعتبار (کلیدهای دسترسی) با امتیازات مدیریتی برای انجام فراخوانیهای API از طریق CLI باشد. بهترین روش این است که این مجوزها دقیقاً به مواردی محدود شود که برای انجام کار لازم است. این رویکرد اصل کمترین امتیاز را رعایت کرده و امنیت حساب شما را افزایش میدهد. پس از ایجاد این اعتبارها، باید با اجرای دستور aws configure و ارائه اطلاعات مورد نیاز، CLI را به صورت محلی پیکربندی کنید.
اگرچه برای هسته اصلی استقرار داکر در لامبدا ضروری نیست، اما بخشی از فرآیند شامل تست برنامه به صورت محلی است. برای این منظور، برنامه نمونه از یک فایل پایتون استفاده میکند. استفاده از مدیران محیط مجازی پایتون مانند uv (که در متن به عنوان گزینهای اختیاری ذکر شده) یا ابزارهای مشابه مانند venv بسیار توصیه میشود. این محیطهای مجازی با ایزوله کردن کتابخانهها و وابستگیهای پروژه از سیستم کلی، از بروز مشکلات ناشی از تضاد نسخههای مختلف کتابخانهها جلوگیری میکنند و تضمین میکنند که برنامه شما در یک محیط پایدار و قابل تکرار اجرا میشود.
به طور خلاصه، برای آغاز این مسیر باید موارد زیر را آماده کنید:
uv (اختیاری اما بسیار مفید).با فراهم آوری این پیشنیازها، پایه محکمی برای طی کردن مراحل بعدی، از ساخت تصویر داکر تا استقرار نهایی آن روی سرویس لامبدای AWS، خواهید داشت.
قبل از استقرار هر کانتینری در محیط ابری، مرحلهای حیاتی و ضروری وجود دارد: ساخت و تست محلی. این مرحله به شما اطمینان میدهد که تصویر داکر شما به درستی ساخته شده و برنامه درون کانتینر به شکلی که انتظار دارید عمل میکند. داکر با بستهبندی برنامه شما به همراه تمام وابستگیهایش در واحدهای قابل حمل به نام کانتینر، یک محیط یکسان و قابل اطمینان از مرحله توسعه تا استقرار فراهم میکند. تمرکز این بخش بر روی همین فرآیند ساخت تصویر، ایجاد کانتینر از روی آن و در نهایت آزمایش عملکرد برنامه قبل از ارسال به رجیستری کانتینر است.
اولین قدم برای اجرای یک کانتینر داکر، ساخت یک تصویر است. تصویر داکر به عنوان یک الگو یا قالب عمل میکند که شما از آن نمونههای کانتینر را ایجاد میکنید. برای این کار به یک فایل با نام `Dockerfile` نیاز دارید که نقشه راه ساخت تصویر را مشخص میکند. هر خط در این فایل یک "دستور" (Directive) نامیده میشود و دستورالعملهای خاصی را به موتور داکر ارائه میدهد. یک `Dockerfile` معمولاً با انتخاب یک تصویر پایه شروع میشود. برای مثال، اگر برنامه شما مبتنی بر پایتون است، تصویر پایه میتواند چیزی شبیه به `public.ecr.aws/lambda/python:3.12` باشد. دستور بعدی معمولاً کپی کردن فایلهای کد برنامه شما (مانند `lambda_function.py`) به یک مسیر مشخص درون تصویر پایه است. در نهایت، یک دستور برای راهاندازی برنامه هنگام اجرای کانتینر اضافه میشود. پس از آمادهسازی `Dockerfile`، میتوانید با اجرای دستور `docker build` از دایرکتوری ریشه پروژه، تصویر نهایی را بسازید.
پس از ساخت موفقیتآمیز تصویر، نوبت به ایجاد یک کانتینر در حال اجرا از روی آن میرسد. با استفاده از دستوری مانند `docker run` میتوانید کانتینر را به صورت تعاملی اجرا کنید تا لاگهای تولید شده توسط برنامه را به صورت زنده مشاهده کنید. در این دستور، اغلب یک پورت از میزبان (مانند پورت 8080) به پورت داخل کانتینر نگاشت میشود تا امکان ارتباط با برنامه فراهم شود. اکنون باید تأیید کنید که برنامه درون کانتینر میتواند درخواستها را دریافت و پردازش کند. برای این آزمایش، میتوانید از یک اسکریپت پایتون ساده با استفاده از کتابخانه `requests` استفاده کنید. بهتر است این آزمایش را درون یک محیط مجازی (Virtual Environment) مانند `uv` انجام دهید تا از بروز конфlicts نسخههای کتابخانهها جلوگیری شود. با ارسال یک درخواست POST حاوی یک payload ساده JSON به آدرس `localhost` و پورت مشخص شده، باید پاسخ مورد انتظار از برنامه را دریافت کنید. این پاسخ نشان میدهد که کانتینر به درستی ساخته شده و عملکرد برنامه محلی تأیید شده است.
در این بخش، شما به طور کامل فرآیند ساخت یک تصویر داکر از روی یک `Dockerfile`، اجرای یک کانتینر از آن تصویر و آزمایش نهایی برنامه را به صورت محلی پشت سر گذاشتید. این مرحله آزمون و خطا برای اطمینان از صحت عملکرد برنامه قبل از ارسال به محیط ابری بسیار حیاتی است. اکنون که یک تصویر داکر کاملاً کاربردی دارید، گام بعدی ارسال این تصویر به یک رجیستری کانتینر مانند Amazon ECR است تا آماده استقرار در یک سرویس بدون سرور مانند AWS Lambda شود. انجام دقیق این مراحل محلی، احتمال بروز خطا در مراحل بعدی را به شدت کاهش میدهد.
پس از اطمینان از عملکرد صحیح کانتینر در محیط لوکال، نوبت به انتقال تصویر ساختهشده به یک رجیستری کانتینر میرسد. برای این منظور و برای استفاده در سرویس AWS Lambda، تصویر شما باید در سرویس Amazon Elastic Container Registry یا ECR آپلود شود. اولین قدم در این فرآیند، تگگذاری صحیح تصویر داکر است. تصویر شما در حال حاضر با یک تگ ساده مانند lambda-docker:1.0.0 مشخص شده است. اما برای آپلود در ECR، باید آن را مطابق با استانداردهای AWS نامگذاری کنید. این نامگذاری شامل آدرس رجیستری، شناسه حساب AWS، نام مخزن و تگ تصویر میشود.
پیش از هر چیز، نیاز به یک مخزن (Repository) در ECR دارید. این کار را میتوان به سادگی و از طریق خط فرمان AWS CLI انجام داد. برای این کار، مطمئن شوید که AWS CLI به صورت محلی نصب شده و اعتبارنامههای حساب AWS شما با دستور aws configure تنظیم شدهاند. بهترین روش این است که مجوزهای این اعتبارنامه تنها به اقدامات لازم برای این آموزش محدود شده باشد. با تعریف متغیرهای محیطی مناسب برای منطقه (Region)، شناسه حساب (Account ID) و نام مخزن، دستور ایجاد مخزن را اجرا میکنید. پس از ایجاد مخزن، باید داکر کلاینت محلی شما برای ارسال تصویر به ECR احراز هویت شود. AWS CLI دستور خاصی برای دریافت توکن احراز هویت و ثبت آن در داکر ارائه میدهد که انجام این مرحله برای اجازه آپلود تصویر ضروری است.
اکنون با استفاده از دستور docker tag، تصویر موجود خود را با آدرس کامل مخزن ECRای که ایجاد کردید، تگ میکنید. این کار در واقع یک نام مستعار برای تصویر فعلی شما ایجاد میکند که آدرس مقصد را نشان میدهد. در نهایت، با استفاده از دستور استاندارد docker push و با مشخص کردن نام تگ جدید، تصویر را به مخزن ECR در cloud آپلود میکنید. با اتمام این فرآیند، تصویر داکر شما به طور ایمن در ECR ذخیره شده و برای استقرار در سرویسهای مختلف AWS مانند Lambda آماده است. این مرحله نقطه اتصال بین توسعه لوکال و اجرای سرورلس در cloud به شمار میرود.
با در دسترس بودن تصویر در ECR، میتوانید عملیات استقرار را در کنسول سرویس Lambda تکمیل کنید. با مراجعه به کنسول Lambda و انتخاب گزینه "Create a Function"، نوع منبع را "Container Image" انتخاب کنید. در این مرحله، میتوانید مخزن ECR خود را جستجو کرده و تصویر آپلودشده را انتخاب نمایید. پس از انتخاب، میتوانید با تنظیمات پیشفرض تابع را ایجاد کنید. ایجاد تابع ممکن است چند لحظه طول بکشد تا Lambda تصویر را از ECR بازیابی و محیط اجرا را آماده کند. پس از ایجاد، میتوانید از طریق زبانه تست درونساخت کنسول Lambda، درخواستی مشابه تست لوکال به تابع ارسال کرده و از صحت عملکرد آن اطمینان حاصل کنید.
پس از اینکه تصویر داکر خود را با موفقیت در ECR آپلود کردید، نوبت به ایجاد تابع Lambda میرسد. ابتدا وارد کنسول AWS Lambda شوید و روی گزینه 'Create a Function' کلیک کنید. در این مرحله، گزینه 'Container Image' را انتخاب نمایید تا بتوانید از تصویری که در مرحله قبل به ECR推送 کردید استفاده کنید.
در صفحه ایجاد تابع، باید مخزن ECR ای که ایجاد کردهاید را جستجو و انتخاب کنید. پس از انتخاب تصویر مربوطه، میتوانید سایر تنظیمات را به صورت پیشفرض نگه دارید. Lambda به طور خودکار تنظیمات لازم برای اجرای کانتینر را تشخیص میدهد. برای تأیید، روی دکمه 'Create' کلیک کنید تا تابع شما ساخته شود.
پس از ایجاد تابع، برای اطمینان از عملکرد صحیح، باید آن را تست کنید. به تب 'Test' در کنسول Lambda مراجعه کنید. یک رویداد تست جدید ایجاد نمایید و payload مورد نیاز برنامه که شامل کلید 'name' است را وارد کنید. با اجرای تست، باید پاسخ موفقیتآمیزی دریافت کنید که شامل سلام و نام وارد شده میباشد.
برای دسترسی به تابع از طریق اینترنت، میتوانید آن را با Amazon API Gateway یکپارچه کنید. این کار امکان فراخوانی تابع شما را از طریق endpointهای REST فراهم میسازد. این مرحله اختیاری است اما برای برنامههای کاربردی که نیاز به دسترسی از سوی کلاینتهای خارجی دارند، ضروری میباشد.
به یاد داشته باشید که پس از اتمام کار، منابع ایجاد شده شامل تابع Lambda و مخزن ECR را حذف کنید تا از هزینههای غیرضروری جلوگیری شود. این کار از طریق کنسول AWS یا CLI قابل انجام است. مدیریت صحیح منابع نه تنها در کنترل هزینهها مؤثر است، بلکه امنیت محیط کلود شما را نیز افزایش میدهد.
استقرار کانتینرهای داکر در AWS Lambda روشی کارآمد برای اجرای برنامههای شما بدون دردسر مدیریت زیرساخت است. این ترکیب قدرتمند، مزایای سرورلس را با انعطافپذیری داکر ادغام میکند. برای پروژههای جدید، حتماً محدودیتهای Lambda از نظر زمان اجرا و حافظه را در نظر بگیرید و از تصاویر پایه مناسب ارائه شده توسط AWS استفاده کنید. با رعایت بهترین روشهای امنیتی در مدیریت مجوزهای IAM، میتوانید سیستمهای مقیاسپذیر و مقرونبهصرفهای ایجاد نمایید.