Я пытаюсь загрузить файл в 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?Пожалуйста, совет.
Спасибо!