【AWS】Lambda S3 listobjects 超過1000筆 (二)

16 3月, 2020

【AWS】Lambda S3 listobjects 超過1000筆 (二)




暨之前s3取得1000筆以上數據的作法之後
目前有另一種繞s3數據的作法,listObjectV2



之前的做法是可以將數據完整跑完沒錯。

但是問題是在結合其他aws服務的時候,可能會有問題


譬如假設是以apigetway + lambda的方式,去取得所有s3物件列表。

以lambda來說是可以設置超時時間(可以設置很長)

是沒有什麼問題的。

但是會有問題的就出在apigetway,

因為apigetway的超時最大值,不能超過29秒

假設今天s3的list資料量已經很巨大。

又有需求需要透過apigetway+lambda的形式來獲取的話。

就會死在apigetway的超時配置。


不過這個問題,aws也有發覺到了。

上篇文章使用的是listobjects,這算是aws的第一代版本。

後面為了避免這種執行過久的問題。

由於v1版本的分頁,只能在lambda進行下一頁

後來Aws出了v2版本,可以藉由token分頁的形式,

當listobject respon時,可以使用IsTruncated來判斷是否有下一頁

並且可以取得token(NextContinuationToken)

來進行獲取下一頁"頁碼"的概念。

實做的方式如下:

/**
*
* @param {*} s3 S3主體
* @param {*} bucketName BucketName
* @param {*} prefix
* @param {*} maxKey 最高單頁幾筆(上限1000)
* @param {*} token 跳至哪一個頁碼,如果為null,則從頭開始
* @param {*} onSuccess callback成功 (取得的token為下一頁的頁碼)
* @param {*} onFail callback失敗
*/
module.exports.ListAllObject = function (s3, bucketName, prefix, maxKey, token, onSuccess, onFail) {
var opts = {
MaxKeys: maxKey,
Bucket: bucketName,
Prefix: prefix
};
if (token != undefined && token != null && token.length > 0) {
opts.ContinuationToken = token;
}
s3.listObjectsV2(opts, function (err, data) {
if (err) {
onFail(err);
}
else {
if (data.IsTruncated) {
onSuccess(data, data.NextContinuationToken);
}
else {
onSuccess(data, null);
}
}
});
}

方式變更為只取得該頁的資訊,不要全部一次繞完

否則資料量超過1萬6千筆以上時,可能會讓apigetway超時

改採用頁碼(nextToken)直接回應出去,

有需要去查找在用頁碼去指定就可以了。



張貼留言