Доступ запрещен при использовании Lamda Edge с CloudFront для доступа к S3 - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть установка CloudFront, из которой я хочу обслуживать статическое содержимое файла, помещенное в сегменты S3 (будет иметь много подпапок).

Я хочу направить запрос в разные папки в пределах сегмента на основе строки запроса.
В моей функции Lamda Edge, которую я добавил в качестве триггера для CloudFront, я делаю следующее

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

Но когда я получаю доступ к CloudFront через его URL, я получаю ошибку «AccessDenied». Не уверен, как отладить это. Мои файлы S3 bucket общедоступны, и я могу получить к ним доступ, используя соответствующие URL-адреса s3.

Любая помощь здесь будет отличной.

спасибо

1 Ответ

1 голос
/ 05 ноября 2019

Вы можете проверить документы для этого , вам нужно сгенерировать другой ответ, который указывает на 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>}];
...