برنامه نویسی

استفاده از ذخیره سازی زودگذر در AWS Lambda

Summarize this content to 400 words in Persian Lang

ذخیره سازی زودگذر در AWS Lambads؟

ذخیره سازی زودگذر در AWS Lambda یک ذخیره سازی موقت است که در قالب یک فهرست ارائه می شود(/tmp) در سیستم فایل لامبدا. این ذخیره سازی برای هر محیط اجرای لامبدا منحصر به فرد است.

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

به‌طور پیش‌فرض، همه لامبداها با 512 مگابایت حافظه موقت عرضه می‌شوند، با این حال، می‌توان فضای ذخیره‌سازی را تا 10240 مگابایت با افزایش 1 مگابایت افزایش داد. 512 مگابایت پیش فرض بدون هزینه اضافی برای لامبدا شما ارائه می شود.

چرا از Storage Ephemeral استفاده کنیم؟

خوب، آن را بدون جعبه در نمونه لامبدا شما در دسترس است، چرا از آن استفاده نکنید؟ 😄چندین مورد استفاده برای ذخیره سازی زودگذر در AWS Lambdas وجود دارد. به طور کلی، هر شکلی از عملیات لامبدا که می‌تواند از یک سیستم فایل یا اشتراک‌گذاری حالت‌های موقت در چندین فراخوانی لامبدا بهره‌مند شود (کش 👀) می‌تواند از ذخیره‌سازی زودگذر در لامبداهای AWS بهره‌مند شود.

مورد استفاده: فایل‌های S3 را زیپ کنید

فشرده سازی یک مورد رایج در بسیاری از برنامه های نرم افزاری است که فایل های انبوه را به طور کارآمد از طریق اینترنت به مشتریان/مشتریان تحویل می دهند. در این مقاله، نمونه‌ای عملی از استفاده از ذخیره‌سازی زودگذر در AWS لامبدا برای فشرده‌سازی فایل‌های S3 را بررسی می‌کنیم. نمونه لامبدا فهرستی از کلیدهای S3 را به عنوان ورودی دریافت می‌کند، فایل‌ها را فشرده می‌کند (با استفاده از فضای ذخیره‌سازی زودگذر)، و خروجی فشرده شده را در S3 آپلود می‌کند. در زیر کد منبع (نوشته شده در TypeScript) لامبدا آمده است.

import { GetObjectCommand, PutObjectCommand, S3Client } from ‘@aws-sdk/client-s3’;
import { createReadStream, createWriteStream } from ‘fs’;
import { mkdir, rm } from ‘fs/promises’;
import path from ‘path’;
import { Readable } from ‘stream’;
import archiver from ‘archiver’;
import { randomUUID } from ‘crypto’;

const s3Bucket = ‘zip-files-test’;
const s3Client = new S3Client({ region: process.env.AWS_REGION });

const streamS3ObjectToFile = async (s3Key: string, filePath: string) => {
const { Body } = await s3Client.send(new GetObjectCommand({
Bucket: s3Bucket,
Key: s3Key
}));
if (!Body) throw Error(`S3 object not found at: ${s3Key}`);
const writeStream = createWriteStream(filePath);
return new Promise((res, rej) => {
(Body as Readable)
.pipe(writeStream)
.on(‘error’, (error) => rej(error))
.on(‘close’, () => res(‘ok’));
})
}

const archiveFiles = (filePaths: string[], outputFilePath: string) => {
return new Promise((res, rej) => {
const output = createWriteStream(outputFilePath);
output.on(‘close’, () => {
console.log(archive.pointer() + ‘ total bytes’);
res(‘ok’);
});
const archive = archiver(‘zip’, { zlib: { level: 9 } });
archive.on(‘error’, (err) => rej(err));
archive.pipe(output);
filePaths.forEach(filePath => archive.file(filePath, { name: path.basename(filePath) }));
archive.finalize();
})
}

export const handler = async (event: { inputS3Keys: string[]; outputS3Key: string; }) => {
const { inputS3Keys, outputS3Key } = event;
// Basic validation of event data
if (!Array.isArray(inputS3Keys) || typeof outputS3Key !== ‘string’) {
throw Error(‘Provide list of s3 keys’);
}

// create a sub-directory in ephemeral storage(/tmp)
const tmpFolder = `/tmp/${randomUUID()}`;
await mkdir(tmpFolder);

// Stream S3 files to tmp storage
const tmpFiles: string[] = [];
const streamFilesAsynchronously = inputS3Keys.map(async (s3Key) => {
const fileName = path.basename(s3Key);
const filePath = `${tmpFolder}/${fileName}`;
await streamS3ObjectToFile(s3Key, filePath);
tmpFiles.push(filePath);
})
await Promise.all(streamFilesAsynchronously);

// Zip files
const zipFilePath = `${tmpFolder}/${path.basename(outputS3Key)}`;
await archiveFiles(tmpFiles, zipFilePath);

// Upload zip output
await s3Client.send(new PutObjectCommand({
Body: createReadStream(zipFilePath),
Bucket: s3Bucket,
Key: outputS3Key,
}));

// Remove all files written to /tmp
await rm(tmpFolder, { recursive: true, force: true });
console.log(‘Done!’);
};

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در کد منبع بالا، 3 تابع اصلی وجود دارد:

streamS3ObjectToFile: این تابع شی s3 تعریف شده توسط s3Key پارامتر به مسیر فایل تعریف شده توسط filePath پارامتر
archiveFiles: این تابع فهرستی از فایل های تعریف شده توسط را بایگانی می کند inputFilePaths پارامتر و خروجی فشرده به دست آمده را در فایلی که توسط outputFilePath پارامتر
handler: این تابع اصلی است که در فراخوانی لامبدا اجرا می شود. تابع ورودی ها را از شئ رویداد، فراخوانی استخراج می کند streamS3ObjectToFile برای استریم فایل های ورودی به حافظه موقت لامبدا، بایگانی فایل ها، ذخیره خروجی بایگانی شده در حافظه موقت، آپلود فایل فشرده در s3 و سپس حذف محتوای نوشته شده در /tmp پوشه

تست کردن:

فایل های ورودی در سطل S3:
شی رویداد – لامبدا از کنسول AWS فراخوانی شده است:
خروجی فایل فشرده آپلود شده در سطل S3:

جریان به فایل (ذخیره سازی زودگذر) در مقابل حافظه داخلی: برای به حداقل رساندن استفاده از حافظه در تابع Lambda، من تصمیم گرفتم به جای بارگیری در حافظه، تمام اشیاء S3 را به ذخیره سازی زودگذر در فهرست /tmp استریم کنم. حتی فرآیند بایگانی با پخش جریانی به ذخیره سازی زودگذر انجام شد. گزینه جایگزین – بارگیری اشیاء S3 و انجام عملیات بایگانی در حافظه با استفاده از بافرها – به میزان قابل توجهی نیاز به حافظه لامبدا را افزایش می دهد. برای زمینه، جریان به فایل‌ها به من این امکان را می‌دهد که مجموعه‌ای از فایل‌ها را با حجم حدود 300 مگابایت با استفاده از لامبدا با تنها 128 مگابایت رم (حداقل پیکربندی) فشرده کنم. در مقابل، مدیریت فایل‌های مشابه در حافظه حداقل به 300 مگابایت حافظه فقط برای بارگیری آن‌ها نیاز دارد، نه به حافظه اضافی مورد نیاز برای پردازش.

نکته حرفه ای – پاکسازی /tmp فایل ها: در حالی که /tmp پوشه موقتی است، هیچ تضمینی وجود ندارد که محتوای آن چه زمانی باشد /tmp پوشه از بین خواهد رفت وقتی لامبدا تمام شد، AWS محتوای ذخیره‌سازی زودگذر را به‌طور خودکار حذف نمی‌کند، در واقع، این /tmp پوشه در چندین فراخوان لامبدا که از یک زمینه اجرایی استفاده می کنند به اشتراک گذاشته می شود. به همین دلیل، توصیه می شود هر آنچه را که به آن می نویسید پاک کنید /tmp پوشه، مگر اینکه عمداً بخواهید داده ها را در چندین فراخوانی لامبدا به اشتراک بگذارید، به عنوان مثال برای ذخیره سازی.

نتیجه گیری:

ذخیره سازی زودگذر یک ویژگی قدرتمند است که در AWS Lambdas نباید نادیده گرفته شود. من آن را به ویژه برای پردازش داده های سنگین و وظایف پیچیده پردازش رسانه/گرافیک بسیار مفید یافتم.

آیا از ذخیره سازی زودگذر برای چیزی جالب استفاده می کنید، لطفاً در بخش نظرات به اشتراک بگذارید.

ذخیره سازی زودگذر در AWS Lambads؟

ذخیره سازی زودگذر در AWS Lambda یک ذخیره سازی موقت است که در قالب یک فهرست ارائه می شود(/tmp) در سیستم فایل لامبدا. این ذخیره سازی برای هر محیط اجرای لامبدا منحصر به فرد است.

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

به‌طور پیش‌فرض، همه لامبداها با 512 مگابایت حافظه موقت عرضه می‌شوند، با این حال، می‌توان فضای ذخیره‌سازی را تا 10240 مگابایت با افزایش 1 مگابایت افزایش داد. 512 مگابایت پیش فرض بدون هزینه اضافی برای لامبدا شما ارائه می شود.

چرا از Storage Ephemeral استفاده کنیم؟

خوب، آن را بدون جعبه در نمونه لامبدا شما در دسترس است، چرا از آن استفاده نکنید؟ 😄
چندین مورد استفاده برای ذخیره سازی زودگذر در AWS Lambdas وجود دارد. به طور کلی، هر شکلی از عملیات لامبدا که می‌تواند از یک سیستم فایل یا اشتراک‌گذاری حالت‌های موقت در چندین فراخوانی لامبدا بهره‌مند شود (کش 👀) می‌تواند از ذخیره‌سازی زودگذر در لامبداهای AWS بهره‌مند شود.

مورد استفاده: فایل‌های S3 را زیپ کنید

فشرده سازی یک مورد رایج در بسیاری از برنامه های نرم افزاری است که فایل های انبوه را به طور کارآمد از طریق اینترنت به مشتریان/مشتریان تحویل می دهند. در این مقاله، نمونه‌ای عملی از استفاده از ذخیره‌سازی زودگذر در AWS لامبدا برای فشرده‌سازی فایل‌های S3 را بررسی می‌کنیم. نمونه لامبدا فهرستی از کلیدهای S3 را به عنوان ورودی دریافت می‌کند، فایل‌ها را فشرده می‌کند (با استفاده از فضای ذخیره‌سازی زودگذر)، و خروجی فشرده شده را در S3 آپلود می‌کند. در زیر کد منبع (نوشته شده در TypeScript) لامبدا آمده است.

import { GetObjectCommand, PutObjectCommand, S3Client } from '@aws-sdk/client-s3';
import { createReadStream, createWriteStream } from 'fs';
import { mkdir, rm } from 'fs/promises';
import path from 'path';
import { Readable } from 'stream';
import archiver from 'archiver';
import { randomUUID } from 'crypto';

const s3Bucket = 'zip-files-test';
const s3Client = new S3Client({ region: process.env.AWS_REGION });

const streamS3ObjectToFile = async (s3Key: string, filePath: string) => {
  const { Body } = await s3Client.send(new GetObjectCommand({
    Bucket: s3Bucket,
    Key: s3Key
  }));
  if (!Body) throw Error(`S3 object not found at: ${s3Key}`);
  const writeStream = createWriteStream(filePath);
  return new Promise((res, rej) => {
    (Body as Readable)
      .pipe(writeStream)
      .on('error', (error) => rej(error))
      .on('close', () => res('ok'));
  })
}

const archiveFiles = (filePaths: string[], outputFilePath: string) => {
  return new Promise((res, rej) => {
    const output = createWriteStream(outputFilePath);
    output.on('close', () => {
      console.log(archive.pointer() + ' total bytes');
      res('ok');
    });
    const archive = archiver('zip', { zlib: { level: 9 } });
    archive.on('error', (err) => rej(err));
    archive.pipe(output);
    filePaths.forEach(filePath => archive.file(filePath, { name: path.basename(filePath) }));
    archive.finalize();
  })
}

export const handler = async (event: { inputS3Keys: string[]; outputS3Key: string; }) => {
  const { inputS3Keys, outputS3Key } = event;
  // Basic validation of event data
  if (!Array.isArray(inputS3Keys) || typeof outputS3Key !== 'string') {
    throw Error('Provide list of s3 keys');
  }

  // create a sub-directory in ephemeral storage(/tmp)
  const tmpFolder = `/tmp/${randomUUID()}`;
  await mkdir(tmpFolder);

  // Stream S3 files to tmp storage
  const tmpFiles: string[] = [];
  const streamFilesAsynchronously = inputS3Keys.map(async (s3Key) => {
    const fileName = path.basename(s3Key);
    const filePath = `${tmpFolder}/${fileName}`;
    await streamS3ObjectToFile(s3Key, filePath);
    tmpFiles.push(filePath);
  })
  await Promise.all(streamFilesAsynchronously);

  // Zip files
  const zipFilePath = `${tmpFolder}/${path.basename(outputS3Key)}`;
  await archiveFiles(tmpFiles, zipFilePath);

  // Upload zip output
  await s3Client.send(new PutObjectCommand({
    Body: createReadStream(zipFilePath),
    Bucket: s3Bucket,
    Key: outputS3Key,
  }));

  // Remove all files written to /tmp
  await rm(tmpFolder, { recursive: true, force: true });
  console.log('Done!');
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در کد منبع بالا، 3 تابع اصلی وجود دارد:

  1. streamS3ObjectToFile: این تابع شی s3 تعریف شده توسط s3Key پارامتر به مسیر فایل تعریف شده توسط filePath پارامتر

  2. archiveFiles: این تابع فهرستی از فایل های تعریف شده توسط را بایگانی می کند inputFilePaths پارامتر و خروجی فشرده به دست آمده را در فایلی که توسط outputFilePath پارامتر

  3. handler: این تابع اصلی است که در فراخوانی لامبدا اجرا می شود. تابع ورودی ها را از شئ رویداد، فراخوانی استخراج می کند streamS3ObjectToFile برای استریم فایل های ورودی به حافظه موقت لامبدا، بایگانی فایل ها، ذخیره خروجی بایگانی شده در حافظه موقت، آپلود فایل فشرده در s3 و سپس حذف محتوای نوشته شده در /tmp پوشه

تست کردن:

  1. فایل های ورودی در سطل S3:
    سطل S3 با فایل های ورودی

  2. شی رویداد – لامبدا از کنسول AWS فراخوانی شده است:
    شی رویداد

  3. خروجی فایل فشرده آپلود شده در سطل S3:
    سطل S3 با فایل خروجی

جریان به فایل (ذخیره سازی زودگذر) در مقابل حافظه داخلی: برای به حداقل رساندن استفاده از حافظه در تابع Lambda، من تصمیم گرفتم به جای بارگیری در حافظه، تمام اشیاء S3 را به ذخیره سازی زودگذر در فهرست /tmp استریم کنم. حتی فرآیند بایگانی با پخش جریانی به ذخیره سازی زودگذر انجام شد. گزینه جایگزین – بارگیری اشیاء S3 و انجام عملیات بایگانی در حافظه با استفاده از بافرها – به میزان قابل توجهی نیاز به حافظه لامبدا را افزایش می دهد. برای زمینه، جریان به فایل‌ها به من این امکان را می‌دهد که مجموعه‌ای از فایل‌ها را با حجم حدود 300 مگابایت با استفاده از لامبدا با تنها 128 مگابایت رم (حداقل پیکربندی) فشرده کنم. در مقابل، مدیریت فایل‌های مشابه در حافظه حداقل به 300 مگابایت حافظه فقط برای بارگیری آن‌ها نیاز دارد، نه به حافظه اضافی مورد نیاز برای پردازش.

نکته حرفه ای – پاکسازی /tmp فایل ها: در حالی که /tmp پوشه موقتی است، هیچ تضمینی وجود ندارد که محتوای آن چه زمانی باشد /tmp پوشه از بین خواهد رفت وقتی لامبدا تمام شد، AWS محتوای ذخیره‌سازی زودگذر را به‌طور خودکار حذف نمی‌کند، در واقع، این /tmp پوشه در چندین فراخوان لامبدا که از یک زمینه اجرایی استفاده می کنند به اشتراک گذاشته می شود. به همین دلیل، توصیه می شود هر آنچه را که به آن می نویسید پاک کنید /tmp پوشه، مگر اینکه عمداً بخواهید داده ها را در چندین فراخوانی لامبدا به اشتراک بگذارید، به عنوان مثال برای ذخیره سازی.

نتیجه گیری:

ذخیره سازی زودگذر یک ویژگی قدرتمند است که در AWS Lambdas نباید نادیده گرفته شود. من آن را به ویژه برای پردازش داده های سنگین و وظایف پیچیده پردازش رسانه/گرافیک بسیار مفید یافتم.

آیا از ذخیره سازی زودگذر برای چیزی جالب استفاده می کنید، لطفاً در بخش نظرات به اشتراک بگذارید.

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

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