将Lamda Edge与CloudFront一起使用时,访问被拒绝

时间:2019-11-04 12:19:07

标签: amazon-s3 aws-lambda amazon-cloudfront

我有一个CloudFront设置,我想从中提供放置在S3存储桶(将有很多子文件夹)中的静态文件内容。

我想基于查询字符串将请求路由到存储桶中的其他文件夹。
在我添加为CloudFront触发器的Lamda Edge函数中,我遵循

const request = event.Records[0].cf.request;
request.origin.s3.path = "/" + folderName + request.uri
callback(null, request);

但是当我通过其URL访问CloudFront时,出现“ AccessDenied”错误。不知道如何调试它。 我的S3存储桶文件是公开的,我可以使用正确的s3网址进行访问。

这里的任何帮助都会很棒。

谢谢

1 个答案:

答案 0 :(得分:1)

您可以check the docs for this,您需要生成另一个指向s3的响应。

这是文档中的一个示例,可能对您的情况有用:

'use strict';

 const querystring = require('querystring');

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

     /**
      * Reads query string to check if S3 origin should be used, and
      * if true, sets S3 origin properties.
      */

     const params = querystring.parse(request.querystring);

     if (params['useS3Origin']) {
         if (params['useS3Origin'] === 'true') {
             const s3DomainName = 'my-bucket.s3.amazonaws.com';

             /* Set S3 origin fields */
             request.origin = {
                 s3: {
                     domainName: s3DomainName,
                     region: '',
                     authMethod: 'none',
                     path: '',
                     customHeaders: {}
                 }
             };
             request.headers['host'] = [{ key: 'host', value: s3DomainName}];
         }
     }

    callback(null, request);
};

您需要更改逻辑,以将s3DomainName替换为代码的路径,例如代码:

             /* Set S3 origin fields */
             request.origin = {
                 s3: {
                     domainName: <yourS3Domain>,
                     region: '',
                     authMethod: 'none',
                     path: folderName+ / + request.uri,
                     customHeaders: {}
                 }
             };
             request.headers['host'] = [{ key: 'host', value: <yourS3Domain>}];