首页 > 解决方案 > 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 代码来看,我可能遗漏了什么吗?

谢谢你。

标签: amazon-s3aws-lambdaamazon-cloudfrontaws-sdk-js

解决方案


这是因为 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
};

推荐阅读