【AWS】Lambda S3 listobjects 超過1000筆

24 8月, 2018

【AWS】Lambda S3 listobjects 超過1000筆




最近有遇到一個案例,用戶數據存放在AWS的S3上。
在統計數據資料數量的時候,
透過Lambda的listobjects去將 S3的檔案全部列出。
但是卻遇到了Lambda的listobjects鎖死在1000筆的問題


也就是不論bucket超過1000筆以上的數據資料,
最後回來的array物件資料都會鎖死在1000筆。


而解決方式如下:

Lambda的listobjects 有一個屬性max-keys 
是用來控制list回來的物件數量,初始預設值為1000。
可以配置這個屬性來控制listobjects 



設置好max-keys後,配置如下:

const AWS = require('aws-sdk');
const S3 = new AWS.S3({
signatureVersion: 'v4',
});
//取得環境參數
const BUCKET = process.env['BUCKET'];
const FOLDER = process.env['FOLDER'];
const PAGE_MAX_COUNT = process.env['PAGE_MAX_COUNT'];//超過1000會被鎖死在1000
//listObject option
var params = {
MaxKeys:PAGE_MAX_COUNT, //list回來的陣列長度
Bucket: BUCKET, //目標Bucket
Prefix: FOLDER //目錄
};
S3.listObjects(params, function (err, data) {
if (err) console.log(err, err.stack);
else console.log(data.Contents.Key); //成功打印檔案路徑
});
view raw s3listObject.js hosted with ❤ by GitHub


但發現運行後,還是鎖死在1000...
查找文檔後才發現,
max-keys 最大值也是1000....

這個問題就大條了,
後來終於找到一個正規的方式來解決這個問題。

Lambda listobjects 是有提供「分頁機制」

也就是listobjects 並不是鎖死在1000筆,
而是一頁的最大Key值數量為1000。

分頁機制的寫法如下:

const AWS = require('aws-sdk');
const S3 = new AWS.S3({
signatureVersion: 'v4',
});
//取得環境參數
const BUCKET = process.env['BUCKET'];
const FOLDER = process.env['FOLDER'];
const PAGE_MAX_COUNT = process.env['PAGE_MAX_COUNT'];//超過1000會被鎖死在1000
//listObject option
var params = {
MaxKeys:PAGE_MAX_COUNT, //list回來的陣列長度
Bucket: BUCKET, //目標Bucket
Prefix: FOLDER //目錄
};
//列出列表,每一個分頁最多一千筆,採用分頁方式加載。
S3.listObjects(params).on('success', function handlePage(res) {
//每頁
console.log("Contents:"+res.data.Contents);
//將分頁資料倒出(最多1000)
res.data.Contents.forEach(function(content) {
console.log("content.Key:"+content.Key);
}
});
//如果有下一個分頁
if(res.hasNextPage()) {
//換頁動作
res.nextPage().on('success', handlePage).send();
} else {
// 完成頁面動作
}
}).
on('error', function(err) {
// 如果錯誤
console.log(err, err.stack);
}).send();
view raw listObjects2.js hosted with ❤ by GitHub

加上分頁以後,就可以全數地將list跑過一次。

就可以解決1000筆的數量問題。

張貼留言