amazon-s3 - Cloudfront createInvalidation 不会被 Lambda 随机触发
问题描述
我面临着从 AWS Lambda 创建 Cloudfront 失效的问题。
我的案例非常基本:我设置了一个 Lambda 处理程序,由特定 S3 对象的创建和删除触发,以便在我的 Cloudfront 分发版上执行缓存版本的失效。这是使用nodejs编写的功能代码:
const AWS = require('aws-sdk');
exports.handler = async function (event, context) {
const cloudFront = new AWS.CloudFront();
const invalidationParams = {
DistributionId: "XXXX",
InvalidationBatch: {
CallerReference: Date.now().toString(),
Paths: {
Quantity: 2,
Items: [
"/index.html",
"/service-worker.js"
]
}
}
};
cloudFront.createInvalidation(invalidationParams, (error, data) => {
if (error) {
console.log(error, error.stack);
} else {
console.log("Invalidation results", data);
}
});
};
如您所见,没有什么太复杂的。现在,大多数情况下,处理程序执行时不执行任何操作,我正在查看日志,除了请求 ID 和开始和结束时间戳之外什么都没有打印,甚至没有 Cloudfront 错误,这让我想知道发生了什么。在连续执行四到五次手动测试后,会正确创建失效,但日志不会报告它。再次触发它,然后打印上一次运行的失效结果。我觉得这很奇怪和令人困惑。
从上下文和 Lambda 代码来看,我可能遗漏了什么吗?
谢谢你。
解决方案
这是因为 Lambda 运行时模型。当您使用异步函数作为处理程序时,Lambda 执行在返回时被视为“完成”(返回的 Promise 已结算)。在您的代码中,您创建了一个失效,但处理函数在失效完成之前返回。
当函数被认为“完成”时,Lambda 会冻结该函数,并且它不会等待createInvalidation
完成。有时它起作用而有时不起作用的原因是因为 Lambda 冻结函数和失效请求之间存在竞争条件。我写了一篇文章有更深入的解释
解决方案很简单:在完成处理程序之前等待 createInvalidation 完成:
const AWS = require('aws-sdk');
exports.handler = async function (event, context) {
const cloudFront = new AWS.CloudFront();
const invalidationParams = {
DistributionId: "XXXX",
InvalidationBatch: {
CallerReference: Date.now().toString(),
Paths: {
Quantity: 2,
Items: [
"/index.html",
"/service-worker.js"
]
}
}
};
await cloudFront.createInvalidation(invalidationParams).promise();
// by the time the handler reaches this point the invalidation made it through
};
推荐阅读
- c++ - 具有多行选择的 QListWidget,看起来像一个表格
- android - 当应用程序关闭或在后台时对本机商店通知数据做出反应
- nlp - 命名实体识别相对日期
- vue.js - Vue js数据未显示在模板上
- javascript - 如果点匹配除换行符以外的所有 ASCII 字符,而 \n 匹配换行符,为什么 `"a\r\nb".match(/a(.|\n)*b/)` 不匹配?
- latex - 将 LaTeX 中的引文编译为 Markdown 文本
- javascript - 保存 JavaScript 文件后,如何使控制台日志自动显示在 Visual Studio Code 中的 Toggle Developer Tools 上?
- c# - C# - 有一个带有类级别属性的空接口来指定常见行为是否有意义?
- c++ - C++ 中的对象组合
- ajax - 通知 Laravel