AWS S3文件(从AWS Lambda Function重定向)响应CORS preflight OPTIONS请求,并显示403错误

时间:2019-05-31 06:40:21

标签: amazon-web-services amazon-s3 cors

我将AWS S3存储桶配置为具有以下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>

我还有一个Lambda函数,可重定向到上述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);
}

我可以使用代码中的相同URL从浏览器直接访问S3 HTML页面。是的,API域不同于S3域:

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

服务器以403错误响应CORS飞行前选项请求,并且浏览器报告以下错误消息:

  

访问“ S3文件”中的XMLHttpRequest(从“ API端点”重定向)   来自来源“ null”的邮件已被CORS政策阻止:对   预检请求未通过访问控制检查:否   请求中存在“ Access-Control-Allow-Origin”标头   资源。

我最初通过在Serverless.yml中添加以下几行来使用Serverless Framework设置站点:

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}/*"

一旦通过无服务器框架创建了存储桶并看到了CORS错误,我就在S3上手动建立了CORS策略,但没有成功。

值得注意的是,S3站点是使用CloudFront Distribution设置的,但我不确定这是否有帮助。

这应该很容易解决,但事实证明这相当困难。请帮忙。

1 个答案:

答案 0 :(得分:0)

这不是应该包含正确的网址吗?

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

我认为将其更改为以下内容可能会解决您的问题:

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