【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)
來進行獲取下一頁"頁碼"的概念。
實做的方式如下:
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
/** | |
* | |
* @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)直接回應出去,
有需要去查找在用頁碼去指定就可以了。
張貼留言