У меня есть сценарий использования для загрузки файлов с использованием S3 v4Signature . Эти загрузки должны быть выполнены с использованием python script .
S3 v4Signature передается нашим клиентам для загрузки n файлов в наше S3 ведро. Поскольку мы не знаем имени файла или числа, мы не можем сгенерировать подписанные URL для них.
Считайте, что это сгенерированная подпись V4. (Для простоты рассмотрим эту подпись, которую мы передали клиентам как печатную копию.)
key = "client/user_1/exec_1/",
s = {
"url": "https://s3.amazonaws.com/package-bucket",
"fields": {
"acl": "public-read",
"bucket": "package-bucket",
"X-Amz-Algorithm": "AWS4-HMAC-SHA256",
"X-Amz-Credential": "AKI****LV5P/20200115/us-east-1/s3/aws4_request",
"X-Amz-Date": "20200115T183407Z",
"Policy": "eyJleHBpcmF*******MTgzNDA3WiJ9XX0=",
"X-Amz-Signature": "128c4************0c8d9",
}
}
Теперь эта подпись должна использоваться сценарием Python для загрузки n файлов в клиент / user_1 / exec_1 / . Я пытался реализовать это с помощью запросов, но не повезло.
with open('index.js', 'rb') as data:
r = requests.put(s.get('url'), data=data, headers=s.get('fields'))
print(r)
Этот python скрипт выполняется на серверах нашего клиента. Предоставление им учетных данных для нашего s3 ведра невозможно.
Папки в нашем s3 выглядят так:
client/user_1/exec_1
client/user_1/exec_2
client/user_2/exec_1
client/user_2/exec_2
client/user_2/exec_3
client/user_2/exec_4
После загрузки файлов мы обрабатываем их на наших серверах.
Примечание: Внешний интерфейс не участвует во всем процессе.
Может кто-нибудь предложить функцию для загрузки файлов в s3?
Функция, используемая для генерации подписи.
function singleFilePublicUpload(key) {
console.log("singleFilePublicUpload | Signature Request", key);
const Bucket = 'package-bucket';
const acl = "public-read";
const params = {
Bucket, Fields: { acl }, Conditions: [['starts-with', '$key', key]]
};
const presignedPost = s3.createPresignedPost(params);
presignedPost.fields.key = key;
return presignedPost;
}
FAQ
Q: Где выполняется сценарий Python?
A: Python Сценарий загрузки выполняется на разных клиентских серверах.
В: Он выполняется вами, вашим пользователем или вашим клиентом?
A : Python Сценарий загрузки выполняется клиентами.
В: Или это бэкэнд веб-сайта, к которому ваши пользователи будут иметь доступ?
A: Нет. Веб-сайт не вовлечен в процесс.
В: Как вы хотите, чтобы они проходили аутентификацию, чтобы доказать, что им разрешено загружать на S3?
A: Мы хотим дать им доступ s в папку S3 с использованием подстановочной подписи.
В: Вы говорите, что не хотите sh использовать boto, потому что ему нужны разрешения AWS, так как вы собираетесь авторизовать загрузку на S3?
A: Мы хотим, чтобы наш клиент отправлял запрос POST непосредственно в S3, используя предоставленную подпись. Подпись V4 должна авторизовать прямую загрузку на S3.