AWS Lambda将列出文件版本控制中的S3存储桶对象和子目录

时间:2018-11-01 21:32:02

标签: node.js amazon-s3 aws-lambda aws-sdk

我是lambda的新手,它试图列出具有嵌套子目录的S3存储桶对象,结构如下:

- mybucket/folder1/project1/samplev1.txt
- mybucket/folder1/project1/sampleVer2.txt
- mybucket/folder2/
- mybucket/folder3/

这是我的lambda代码:

const AWS = require('aws-sdk');
const s3 = new AWS.S3();

exports.handler = async (event) => {
  const allKeys = [];
  await getKeys({ Bucket: 'ru-mybucket' }, allKeys);
  console.log(allKeys)
  return allKeys;
};

async function getKeys(params, keys){
  const response = await s3.listObjectsV2(params).promise();
  response.Contents.forEach(obj => keys.push(obj.Key));

  if (response.IsTruncated) {
    const newParams = Object.assign({}, params);
    newParams.ContinuationToken = response.NextContinuationToken;
    await getKeys(newParams, keys); // RECURSIVE CALL
  }
}

该函数列出了存储桶中的所有对象键及其嵌套的子目录和文件,问题是如何列出嵌套的对象(包括其版本),我该如何实现?在我的代码中何处添加(listObjectVersions)以能够遍历具有版本的对象?

1 个答案:

答案 0 :(得分:1)

我已经为您完成了code,在本示例中,您可以看到单元测试及其实现(apigateway)。

基本上,我从存储桶中检索了所有密钥,然后对其进行迭代。最终我得到了所有对象,并通过两个参数bucket和key来查询 s3.listObjectsV2

在伪代码下方:

s3.listObjectsV2({ Bucket: your_bucket, MaxKeys: 1000 }).forEach( element => {
   s3.listObjectVersions({ Bucket: your_bucket, Prefix: element.Key})
})

为此,您可以运行代码示例,必须运行以下命令:

npm install
npm run deploy

为此,您可以测试代码:

npm run test

别忘了带上你的水桶:

./package.json
./tests/test.js

重要提示:我为此解决方案使用了serverless framework