AWS S3 Bucket - доступ запрещен при попытке загрузить файл - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь загрузить файл в AWS S3 amazon из HTTP-запроса в моем приложении внешнего интерфейса, но в моем браузере появляется следующая ошибка: Response {type: "cors", url: "https://my -bucket.s3-sa-east-1.amazonaws.com / 08 … nedHeaders = host% 3Bx-amz-acl & x-amz-acl = public-read ", перенаправлено: false, статус: 403, нормально: false,…} На вкладке Сеть отображается сообщение об ошибке «Отказано в доступе»

Итак, я думаю, что есть проблема с Политикой моего сегмента: это то, что я настроил в Политике своего сегмента:

{
"Version": "2012-10-17",
"Id": "Policy1544564620007",
"Statement": [
    {
        "Sid": "Stmt1544564832145",
        "Effect": "Allow",
        "Principal": {
            "AWS": [
                "arn:aws:iam::<account-number>:root"
            ]
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::my-bucket"
    }
]

}

Кроме того, конфигурация пакета CORS выглядит следующим образом:

<CORSRule>
   <AllowedOrigin>http://localhost</AllowedOrigin>
   <AllowedOrigin>http://*</AllowedOrigin>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>PUT</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

Я использую ASW SDK на своем внутреннем сервере (узле.js используя экспресс), чтобы получить мой подписанный URL:

     var AWS = require('aws-sdk');
    .....
    app.post('/requestUploadURL', function(request, response) {
     var s3 = new AWS.S3(
        {accessKeyId: "<my AWS Access Key Id here>",
         secretAccessKey: "<my AWS Secret Key here>",
         endpoint: 's3-sa-east-1.amazonaws.com',
         signatureVersion: 'v4',
         region: 'sa-east-1'} 
       );

    var params = request.body;

    var s3Params = {
      Bucket: 'my-bucket', 
      Key:  params.name, //file name
      ContentType: params.type, // file type
      ACL: 'public-read'
    };

    var uploadURL = s3.getSignedUrl('putObject', s3Params);

    response.status(200).json({
         uploadURL: uploadURL
      })
 }

И в моем приложении переднего плана (vue.js) у меня есть этот код для загрузки файла с использованием предварительно подписанного URL, полученного из моего бэкэнда:

  ...
 submitFile(e){
   e.preventDefault();
   var file = this.$refs.file.files[0];
   var reader = new FileReader();
   reader.addEventListener('loadend', function(e) {
     axios.post("http://localhost:3000/requestUploadURL", {
          name: file.name,
          type: file.type
      }) // end Api().post
     .then(response => {
        console.log('Upload file to AWS ')
        console.log(response)
        console.log(reader)
        var url = response.data.uploadURL
        fetch(url, {
           method: 'PUT',
           body: new Blob([reader.result], {type: file.type})
        })
        .then(res => {
            console.log('Uploaded successfull ')
            console.log(res)
          }).catch((error) => {
            console.log('Upload error: ')
            console.log(error)
          })
      }) // end first .then(response =>
   }) // end reader.addEventListener

    reader.readAsArrayBuffer(file);
    return false
 } // end submit

Я должен открыть Chorme с помощью --args --disable-web-security, потому что, поскольку я запускаю локально приложение переднего плана (localhost: 8081), а такжебэкэнд (localhost: 3000).В противном случае Chrome не позволил отправить HTTP-запрос из-за проблемы CORS.

Итак, пожалуйста, примите во внимание, что я запускаю это локально, и я использую свою корневую учетную запись AWS KEY и Secret KEY в своем бэкэнде для настройки внутренних экспресс-серверов (для получения подписанного URL).Я не использую ПОЛЬЗОВАТЕЛЬ (IAM)

Знаете ли вы, в чем может быть моя проблема?Я неправильно устанавливаю Bucket Policy?Пожалуйста, совет.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...