Файл AWS S3 (перенаправленный из лямбда-функции AWS) отвечает на запрос предварительных полетов CORS с ошибкой 403 - PullRequest
0 голосов
/ 31 мая 2019

У меня AWS S3 bucket настроен как статический веб-сайт со следующей конфигурацией CORS:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>

У меня также есть лямбда-функция, которая перенаправляет на конкретную страницу в вышеупомянутой корзине S3. Вот суть кода:

module.exports.endPoint = (event, context, callback) => {
  // Do some cool processing and on success:
  redirectToUrl(303, 's3-bucket.amazon.com/page.html', callback);
}

function redirectToUrl(statusCode, url, callback) {
    const response = {
        statusCode: statusCode,
        headers: {
            Location: url,
            'Access-Control-Allow-Origin': '*',
            'Content-Type': 'application/json'
        },
        body: '',
    };

    console.log('Redirecting with status code ' + statusCode + ' to ' + url);

    callback(null, response);
}

Я могу получить доступ к странице S3 HTML напрямую из браузера, используя тот же URL в коде. Да, домен API отличается от домена S3:

api.domain.com --> initiates the request (redirection)
sub.domain.com/page.html --> requested resource (redirection target)

Сервер отвечает на запрос OPSS предварительной проверки CORS с ошибкой 403, а браузер сообщает следующее сообщение об ошибке:

Доступ к XMLHttpRequest в «Файл S3» (перенаправляется из «Конечной точки API») из источника 'null' был заблокирован политикой CORS: Ответ на предварительный запрос не проходит проверку контроля доступа: нет Заголовок «Access-Control-Allow-Origin» присутствует в запрошенном ресурс.

Первоначально я настроил сайт с помощью Serverless Framework, добавив следующие строки в мой serverless.yml:

SiteBucket:
      Type: AWS::S3::Bucket
      Properties:
        AccessControl: PublicRead
        BucketName: ${self:custom.siteName}
        WebsiteConfiguration:
          IndexDocument: index.html
          ErrorDocument: error.html
        CorsConfiguration:
          CorsRules:
            - AllowedMethods:
                - GET
                - HEAD
              AllowedOrigins:
                - "*"
              MaxAge: 3000
    SiteBucketPolicy:
      Type: "AWS::S3::BucketPolicy"
      DependsOn: "SiteBucket"
      Properties:
        Bucket: ${self:custom.siteName}
        PolicyDocument:
          Statement:
            - Effect: Allow
              Principal: "*"
              Action:
                - "s3:GetObject"
              Resource:
                - "arn:aws:s3:::${self:custom.siteName}/*"

Как только корзина была создана с помощью Serverless Framework и увидела ошибки CORS, я безуспешно определил политику CORS на S3.

Стоит также отметить, что сайт S3 настроен с CloudFront Distribution, но я не уверен, что это имеет значение.

Это должно быть легко исправить, но это оказывается довольно сложно. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 31 мая 2019

Разве это не должно включать правильный URL:

redirectToUrl(303, 's3-bucket.amazon.com/page.html');

Я думаю, что изменение его на следующее может решить вашу проблему:

redirectToUrl(303, 'https://s3-bucket.amazon.com/page.html');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...