代码之家  ›  专栏  ›  技术社区  ›  Kent Wood

有没有办法在lambda@edge中加载外部数据

  •  1
  • Kent Wood  · 技术社区  · 7 年前

    我试图使用lambda@edge在我的站点中处理A/B测试。 我想知道有没有办法让lambada@edge函数从一个url加载一个外部配置数据,例如,我创建了一个api来返回a/b通道的流量,我想要控制外部的配置数据,这样我就可以动态地将流量调整到a或b通道,而无需修改lambda函数。 我现在做的是

    var versions = [];
    var isLoadingVersionData = false;
    const https = require('https');
    function loadVersions() {
    if (isLoadingVersionData)
        return null;
    
    isLoadingVersionData=true;
    
    https.get('https://example.com/getAbTestConfig', (res) => {
        res.on('data', (d) => {
            var parsedBody = JSON.parse(d);
            if (parsedBody.status)
                versions = parsedBody.data;
    
        });
    
        }).on('error', (e) => {
           console.log(e);
        });
    }
    
    //and load the function in handler
    exports.handler = (event, context, callback) => {
        context.callbackWaitsForEmptyEventLoop = false;
        loadVersions();
    }
    

    我想知道这个变量“versions”是否可以正确加载并在以后的每个请求中共享

    你有更有效的解决办法吗?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Mr.Ocean    7 年前

    为什么不在s3中维护这些数据并使用lambda@edge从中获取配置呢?为了进一步减少延迟,您可以使用cloudfront将包含流量比的s3 bucket前置,让l@e调用cloudfront并获得所需的值。

        2
  •  0
  •   Lucas Santos    7 年前

    我也面临同样的问题,但不是A/B测试。我刚刚在lambda函数中创建了一个json文件,以避免在lambda函数中进行http调用的延迟。它可以工作,但维护不是很好,因为每次需要更改json文件时,我都需要再次部署lambda函数。

    当我在寻找它的时候,我找到了上面描述给Ocean先生的同样的解决方案,听起来是在S3中维护数据的一个很好的选择。

    推荐文章