У меня есть статический веб-сайт, где в пользовательском интерфейсе я беру имя корзины, имя объекта из HTML-формы, размещенной в корзине S3.После нажатия кнопки эти параметры затем отправляются в шлюз API через POST, который, в свою очередь, передает его в Lambda.Затем Lambda генерирует предварительно заданный URL-адрес на основе этих параметров и отправляет его обратно в интерфейс пользователя.Когда я генерирую URL-адрес из Lambda, он работает, но я получаю отказ в доступе, когда пытаюсь получить доступ к объекту по URL-адресу, созданному пользовательским интерфейсом.Вот моя политика корзины, в которой хранится объект:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PresignedPermissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::12345678:role/accessS3"
},
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::testEXAMPLEbucket/*"
]
}
]
}
Моя конфигурация CORS для корзины, в которой хранится объект.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Лямбда-код:
'use strict';
const AWS = require('aws-sdk');
const s3 = new AWS.S3()
exports.handler = (event, context, callback) => {
// TODO implement
var params = {
'Bucket' : event['bucketName'],
'Key' : event['objectName'],
'Expires' : event['expiration']
};
s3.getSignedUrl('getObject', params, (error, url) => {
if (error) {
callback(error);
} else {
callback(null, {url: url});
}
});
};
Код HTML-скрипта:
var API_ENDPOINT_POST = "https://***.**-api.us-east-1.**.com/prod/"
//AJAX POST REQUEST
document.getElementById("getURL").onclick = function(){
var inputData = {
"bucketName":$('#bucketName').val(),
"objectName":$('#objectName').val(),
"expiration":$('#expiration').val()
};
$.ajax({
url: API_ENDPOINT_POST,
type: 'POST',
data: JSON.stringify(inputData) ,
contentType: 'application/json; charset=utf-8',
success: function (response) {
document.getElementById("showURL").value = response.url;
},
error: function () {
alert("error");
}
});
}
Роль, используемая в Lambda, имеет FULLS3ACCESS.Я прочитал большинство постов и внес в них изменения, но ни один из них не помог.Пожалуйста, дайте мне знать, если я что-то упустил.Я был бы очень признателен.