【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後,配置如下:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); //成功打印檔案路徑 | |
}); | |
但發現運行後,還是鎖死在1000...
查找文檔後才發現,
max-keys 最大值也是1000....
這個問題就大條了,
後來終於找到一個正規的方式來解決這個問題。
Lambda listobjects 是有提供「分頁機制」
也就是listobjects 並不是鎖死在1000筆,
而是一頁的最大Key值數量為1000。
分頁機制的寫法如下:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); |
加上分頁以後,就可以全數地將list跑過一次。
就可以解決1000筆的數量問題。
張貼留言