AWS Lambda /tmp 文件夹不在执行之间共享

Kos*_*ika 1 javascript caching amazon-web-services node.js aws-lambda

我正在尝试临时缓存 AWS lambda 函数执行的一些数据,以省略该 lambda 现在每次执行的 HTTP 请求并优化其速度。

在“查看者请求”中,我有以下逻辑(示例是伪代码)-

exports.handler = async (event) => {
   // check /tmp folder for data
   const cachedData = await getDataFromCache();

   if (cachedData) {
     return cachedData;
   }

   const data = await getDataFromApi();
   
   // save data for 2 mins in /tmp for re-use in next executions
   await saveDataInCache(data);

   return data;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我尝试将数据保存在/tmp文件夹中几分钟,以便在下次执行中重复使用它并减少 API 请求的数量。

在“查看者请求”lambda 执行期间,当我将数据缓存在/tmp文件夹内时,我立即看到日志中提供了数据 -

async function saveDataInCache(data = {}) {
  // save data in tmp folder
  try {
    await fs.outputJson('/tmp/cache.json', {
      data,
      updatedAt: Date.now()
    });
  } catch (err) {
    console.log(`page data save cache error ${err}`);
  }

  // check that data is immediately available
  let fileData = {};
  try {
    fileData = await fs.readJson('/tmp/cache.json');
  } catch (err) {
    console.log(`page data read cache error ${err}`);
  }

  console.log(`check immediate value ${JSON.stringify(fileData)}`);
}
Run Code Online (Sandbox Code Playgroud)

然而,每次“查看器请求”在保存之前尝试读取数据时,它总是返回错误 - ENOENT: no such file or directory, open '/tmp/cache.json'-

async function getDataFromCache() {
  let fileData = {};

  try {
    fileData = await fs.readJson('/tmp/cache.json');
  } catch (err) {
    console.log(`page data read cache error ${err}`);
  }

  if (isEmpty(fileData)) {
    return undefined;
  }

  const { data = {}, updatedAt = 0 } = fileData;
  const maxCacheTime = updatedAt + DATA_TTL;
  const currentTime = Date.now();
  const isCacheExpired = currentTime > maxCacheTime;

  if (!isCacheExpired) {
    return data;
  }

  return undefined;
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着/tmp文件夹内容在执行之间不共享?谢谢!

Mau*_*ice 8

/tmp目录对于每个 Lambda 实例/执行上下文都是私有的,不会在所有 Lambda 实例之间共享。这意味着如果您的请求由不同的执行上下文处理,则数据将不会出现在那里。

不幸的是,您无法真正控制这些执行上下文的创建和删除方式,这是 Lambda 在后台为您处理的事情。