【发布时间】:2018-07-20 12:00:45
【问题描述】:
我有一个 lambda 函数,它使用 S3.listObjects 返回目录列表。列表有时(并非总是!)过时 - 它不包含最近上传的对象,并且它拥有的对象具有旧的修改日期。
当我在本地运行相同的代码时,它总是可以正常工作。
显然是某种缓存,但我不明白在哪里......
以下是相关代码:
function listFiles() {
return new Promise(function (resolve, reject) {
const params = {
Bucket: "XXXXX",
Prefix: "YYYYY"
};
s3.listObjects(params, function (err, data) {
if (err) reject(err);
else resolve(data.Contents);
});
})
}
【问题讨论】:
-
虽然最终一致性确实适用于对象列表,但长时间延迟并不典型,并且不应有来自任何其他来源的缓存。您是否通过存储桶日志验证了您的函数实际上是在函数运行时发出列表对象请求?长时间的延迟表明,在调用此函数的任何内容中都可能存在错误,导致结果被重用,直到容器被销毁并且下一次调用得到一个新容器。
-
要观察容器生命周期,定义一个全局变量,例如
var container_id。然后在处理程序内部,container_id = container_id ? container_id : context.invokeid;和console.log('this container is ' + container_id);(context.invokeid 没有实际意义,它恰好是 UUID 的一个很好的来源。我们仅在未设置时将其设置在变量中。变量是全局的,因此它在调用过程中保持其价值。在本地,可能没有像这样的重用。)您应该会在几分钟内看到相同的 ID(假设流量较低),然后它最终会改变。
标签: amazon-s3 lambda aws-lambda aws-sdk