亚马逊Lambda @边缘响应

时间:2017-11-09 16:34:08

标签: amazon-web-services aws-lambda amazon-cloudfront

我正在使用AWS S3和cloudfront托管静态网站。当用户代理是whatsapp或其他时,我需要抓住......

所以,我正在使用与具有触发器的cloudfront关联的lambda@edge函数。然后,Tigger有4个选项(viewer_requestorigin_requestorigin_responseviewer_response)。我正在开发一个小脚本,在viewer_request上触发,如果用户代理是Whatsapp,则响应将是纯HTML,但如果用户代理是任何其他响应,则应该继续自然流,因此cloudfront应该响应index.html在cloudfront属性中配置。我无法继续使用index.html ...

我的代码:

let content = ``;

exports.handler = (event, context, callback) => {
   var response = event.Records[0].cf.response;

   const request = event.Records[0].cf.request;
   const headers = JSON.stringify(request.headers);

   if(headers.toUpperCase().indexOf("WHATSAPP")>0) {
    console.log("is whatsapp");

    var html = `
    <html prefix="og: http://ogp.me/ns#">
        <head>
            <meta property="og:url" 
            content="http://www.nytimes.com/2015/02/19/arts/international/when-
            great-minds-dont-think-alike.html" />
            <meta property="og:type" content="article" />
            <meta property="og:title" content="When Great Minds Don’t Think 
            Alike" />
            <meta property="og:description" content="How much does culture 
            influence creative thinking?" />
            <meta property="og:image" 
    content="http://static01.nyt.com/images/2015/02/19/arts/international/19iht-btnumbers19A/19iht-btnumbers19A-facebookJumbo-v2.jpg" />
        </head>
        <body>Whatsapp</body>
    </html>    
    `;

    response = {
        status: '200',
        statusDescription: 'OK',
        headers: {
            'cache-control': [{
                key: 'Cache-Control',
                value: 'max-age=100'
            }],
            'content-type': [{
                key: 'Content-Type',
                value: 'text/html'
            }],
            'content-encoding': [{
                key: 'Content-Encoding',
                value: 'UTF-8'
            }],
        },
        body: html,
    };
    context.succeed(response);    
   } else {  
    context.succeed(null);
   }

2 个答案:

答案 0 :(得分:0)

允许CloudFront的请求处理从查看者请求或源请求触发器继续:

return callback(null,request);

答案 1 :(得分:0)

我遇到了同样的问题,我通过分成2个lambda函数来修复我的问题,一个处理request,另一个处理response

  1. 在CloudFront行为设置中,为一个进程viewer request选择request。并为一个流程origin response选择response
  2. 对于request,请记得return callback(null, request)为@ michael-sqlbot提及。
  3. 注意:

    • viewer request包含来自请求标头的原始用户代理,例如"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
    • origin request包含CloudFront处理的标头,例如"Amazon CloudFront"

    希望这有帮助,如果有任何不妥,请纠正我。

    参考: