چگونه: عروسک گردانی در AWS Docker Lambda

Summarize this content to 400 words in Persian Lang
من از یک کتابخانه عالی دیگر به نام puck استفاده می کردم که اساساً یک ویرایشگر بسیار قابل تنظیم است که می تواند سایت ها / خبرنامه ها / فایل های PDF (چیزی بصری) ایجاد کند و به مرحله بعدی رسیدم که خروجی ویرایشگر را به PDF تبدیل کرد.
به نظر می رسد بهترین گزینه برای تولید PDF بر اساس HTML عروسک گردانی است. حالا من سروری نداشتم که در جایی اجرا شود، تا کنون بیشتر لامبداهای کوچک را برای هر عملکرد سمت سرور برای برنامه خود ایجاد می کردم، بنابراین می خواستم از لامبدا برای این مورد استفاده نیز استفاده کنم.
معلوم شد که آزمون و خطای آن کمی بیشتر از حد انتظار بوده است، زیرا عروسک گردان به کروم متکی است و در محیطهای بدون سرور به خوبی کار نمیکند، اما در اینجا نحوه کار کردن با آن است.
ابتدا وابستگی های مورد نیاز را در یک پروژه جدید Node.js نصب کنید (با استفاده از ابتدا npm init -y):
npm install puppeteer-core@23.9.0
npm install @sparticuz/chromium@131.0.1
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
از آنجایی که ما قصد داریم این را در یک محیط لامبدا نصب کنیم puppeteer بسته کار نخواهد کرد (حداقل برای من) بنابراین ما در حال نصب کتابخانه هسته به همراه نسخه ای از کروم هستیم که در لامبدا بهتر کار می کند.
در اینجا نسخه ها بسیار مهم هستند، بنابراین من آنها را قفل می کنم.
ایجاد کنید index.js فایل با محتویات زیر:
import puppeteer from “puppeteer-core”;
const chromium = require(“@sparticuz/chromium”); // this looks a bit odd with ‘import’ and ‘require’ statements but I was using TypeScript so everything compiled down to commonjs in the end. @sparticuz/chromium didn’t support ESM
chromium.setHeadlessMode = true;
chromium.setGraphicsMode = false;
const browser = await puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath(),
headless: chromium.headless,
});
const page = await browser.newPage();
await page.setContent(“Hello world”);
const pdf = await page.pdf({ format: “A4” });
await browser.close();
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در حال اجرا index.js به صورت محلی باید نتیجه مثبتی به همراه داشته باشد. اکنون با قرار دادن این کد در AWS lambda، باید ایجاد کنیم Dockerfile از آنجایی که ما یک داکر لامبدا ایجاد می کنیم که باید کارها را ساده تر کند. یک مزیت این است که ما نیازی به قرار دادن کد کرومیوم در لایه لامبدا نداریم، اما به غیر از این، واقعاً به شما به عنوان توسعهدهنده بستگی دارد که آیا ترجیح میدهید از رویکرد وانیلی لامبدا استفاده کنید یا لامبدا داکر.
در اینجا Dockerfile ساده ما است:
# Use the official Amazon Linux image for Lambda
FROM public.ecr.aws/lambda/nodejs:18
# Set working directory
WORKDIR ${LAMBDA_TASK_ROOT}
COPY . .
RUN npm install
RUN npm run build # i was using typescript so here i run the build command ‘tsc’, you can omit it if you’re doing JS
# Your CMD or ENTRYPOINT command
CMD [“index.handler”]
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
با داکرفایل و index.js فایل آماده است، میتوانیم تصویر Docker خود را با استفاده از دستور زیر بسازیم (مطمئن شوید که Docker نصب شده است):
docker build –platform linux/amd64 -t .
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
توجه داشته باشید که ما در حال هدف گذاری هستیم linux/amd64 که محیط لامبدا پیش فرض است. همچنین لازم به ذکر است که من از Macbook Pro M1 به صورت محلی استفاده می کنم، بنابراین این یک الزام است. اگر از لینوکس استفاده می کنید، شاید لازم نباشد این کار را انجام دهید، اما فقط مطمئن باشید.
مراحل بعدی شما را ملزم میکند که راهاندازی AWS lambda را در محل خود داشته باشید و در مورد راهاندازی ECR و Lambda اطلاعات داشته باشید، به این معنی که این راهنما میتواند طولانی شود، بنابراین من با چند کلمه توصیه در مورد مراحل بعدی آن را ترک میکنم:
پس از ساختن تصویر داکر، تصویر داکر را با استفاده از دستور تگ کنید:
docker tag :latest .dkr.ecr..com/:latest
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
تصویر داکر فشار
docker push .dkr.ecr..amazonaws.com/:latest
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
(این دستورات در هنگام ایجاد مخزن ECR شما در کنسول AWS نیز قابل مشاهده هستند)
لامبدا را با تصویر با استفاده از دستور زیر AWS CLI به روز کنید (فرض می کند AWS CLI روی دستگاه شما نصب شده است). همچنین در صورت تمایل می توانید به صورت دستی در کنسول به روز رسانی کنید:
aws lambda update-function-code \
–function-name \
–image-uri .dkr.ecr..amazonaws.com/:latest \
–profile default \
–region
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
اطمینان حاصل کنید که لامبدا حداقل 1024 مگابایت حافظه دارد و 30 ثانیه فاصله زمانی دارد.
امیدوارم این مفید بوده باشد!
من از یک کتابخانه عالی دیگر به نام puck استفاده می کردم که اساساً یک ویرایشگر بسیار قابل تنظیم است که می تواند سایت ها / خبرنامه ها / فایل های PDF (چیزی بصری) ایجاد کند و به مرحله بعدی رسیدم که خروجی ویرایشگر را به PDF تبدیل کرد.
به نظر می رسد بهترین گزینه برای تولید PDF بر اساس HTML عروسک گردانی است. حالا من سروری نداشتم که در جایی اجرا شود، تا کنون بیشتر لامبداهای کوچک را برای هر عملکرد سمت سرور برای برنامه خود ایجاد می کردم، بنابراین می خواستم از لامبدا برای این مورد استفاده نیز استفاده کنم.
معلوم شد که آزمون و خطای آن کمی بیشتر از حد انتظار بوده است، زیرا عروسک گردان به کروم متکی است و در محیطهای بدون سرور به خوبی کار نمیکند، اما در اینجا نحوه کار کردن با آن است.
ابتدا وابستگی های مورد نیاز را در یک پروژه جدید Node.js نصب کنید (با استفاده از ابتدا npm init -y
):
npm install puppeteer-core@23.9.0
npm install @sparticuz/chromium@131.0.1
از آنجایی که ما قصد داریم این را در یک محیط لامبدا نصب کنیم puppeteer
بسته کار نخواهد کرد (حداقل برای من) بنابراین ما در حال نصب کتابخانه هسته به همراه نسخه ای از کروم هستیم که در لامبدا بهتر کار می کند.
در اینجا نسخه ها بسیار مهم هستند، بنابراین من آنها را قفل می کنم.
ایجاد کنید index.js
فایل با محتویات زیر:
import puppeteer from "puppeteer-core";
const chromium = require("@sparticuz/chromium"); // this looks a bit odd with 'import' and 'require' statements but I was using TypeScript so everything compiled down to commonjs in the end. @sparticuz/chromium didn't support ESM
chromium.setHeadlessMode = true;
chromium.setGraphicsMode = false;
const browser = await puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath(),
headless: chromium.headless,
});
const page = await browser.newPage();
await page.setContent("Hello world
");
const pdf = await page.pdf({ format: "A4" });
await browser.close();
در حال اجرا index.js
به صورت محلی باید نتیجه مثبتی به همراه داشته باشد. اکنون با قرار دادن این کد در AWS lambda، باید ایجاد کنیم Dockerfile
از آنجایی که ما یک داکر لامبدا ایجاد می کنیم که باید کارها را ساده تر کند. یک مزیت این است که ما نیازی به قرار دادن کد کرومیوم در لایه لامبدا نداریم، اما به غیر از این، واقعاً به شما به عنوان توسعهدهنده بستگی دارد که آیا ترجیح میدهید از رویکرد وانیلی لامبدا استفاده کنید یا لامبدا داکر.
در اینجا Dockerfile ساده ما است:
# Use the official Amazon Linux image for Lambda
FROM public.ecr.aws/lambda/nodejs:18
# Set working directory
WORKDIR ${LAMBDA_TASK_ROOT}
COPY . .
RUN npm install
RUN npm run build # i was using typescript so here i run the build command 'tsc', you can omit it if you're doing JS
# Your CMD or ENTRYPOINT command
CMD ["index.handler"]
با داکرفایل و index.js
فایل آماده است، میتوانیم تصویر Docker خود را با استفاده از دستور زیر بسازیم (مطمئن شوید که Docker نصب شده است):
docker build --platform linux/amd64 -t .
توجه داشته باشید که ما در حال هدف گذاری هستیم linux/amd64
که محیط لامبدا پیش فرض است.
همچنین لازم به ذکر است که من از Macbook Pro M1 به صورت محلی استفاده می کنم، بنابراین این یک الزام است. اگر از لینوکس استفاده می کنید، شاید لازم نباشد این کار را انجام دهید، اما فقط مطمئن باشید.
مراحل بعدی شما را ملزم میکند که راهاندازی AWS lambda را در محل خود داشته باشید و در مورد راهاندازی ECR و Lambda اطلاعات داشته باشید، به این معنی که این راهنما میتواند طولانی شود، بنابراین من با چند کلمه توصیه در مورد مراحل بعدی آن را ترک میکنم:
- پس از ساختن تصویر داکر، تصویر داکر را با استفاده از دستور تگ کنید:
docker tag :latest .dkr.ecr..com/:latest
- تصویر داکر فشار
docker push .dkr.ecr..amazonaws.com/:latest
(این دستورات در هنگام ایجاد مخزن ECR شما در کنسول AWS نیز قابل مشاهده هستند)
- لامبدا را با تصویر با استفاده از دستور زیر AWS CLI به روز کنید (فرض می کند AWS CLI روی دستگاه شما نصب شده است). همچنین در صورت تمایل می توانید به صورت دستی در کنسول به روز رسانی کنید:
aws lambda update-function-code \
--function-name \
--image-uri .dkr.ecr..amazonaws.com/:latest \
--profile default \
--region
- اطمینان حاصل کنید که لامبدا حداقل 1024 مگابایت حافظه دارد و 30 ثانیه فاصله زمانی دارد.
امیدوارم این مفید بوده باشد!