Что такое приложение для использования предварительно назначенного URL-адреса AWS для PUT? - PullRequest
0 голосов
/ 27 июня 2018

Насколько я знаю, предопределенный URL-адрес - это способ предоставления разрешения посторонним лицам работать через определенный URL-адрес, но этот URL-адрес кажется очень строгим с точки зрения формирования. Любая разница при проверке подписи может привести к 403

Для загрузки это просто, а как насчет загрузки?

Допустим, я хочу создать URL, который загружает test.txt в testbucket, я мог бы использовать

s3.generate_presigned_url(ClientMethod='put_object', Params={'Bucket': 'testbucket', 'Key': 'test.txt'}, HttpMethod='PUT', ExpiresIn=120)

но это приводит к пустому файлу в моем буфере при вызове URL (requests.put(url))

Я должен указать содержимое как

with open(some_file, 'rb') as f:
    s3.generate_presigned_url(ClientMethod='put_object', Params={'Bucket': 'testbucket', 'Key': 'test.txt', 'Body': f.read()}, HttpMethod='PUT', ExpiresIn=120)

Для того, чтобы действительно получить значимую загрузку.

Но это побеждает цель? Этот URL-адрес должен быть отправлен другим пользователям для использования. Если я уже знаю все о файле, включая его содержимое, не означает ли это, что у меня уже есть файл? Что делать, если это неизвестный файл, который я могу получить только некоторую информацию, такую ​​как file_name и, возможно, content-length и content-type?

И даже если, скажем, я создаю конечную точку API и прошу пользователя передать данные (включая их содержимое, я полагаю), а затем я сгенерирую URL для пользователя, я мог бы также получить данные и загрузка напрямую, а не через предварительно подписанный URL, верно?

И это одна транзакция. Кажется, что это будет намного сложнее, когда я хочу сделать загрузку из нескольких частей. Нужно ли создавать несколько предварительно подписанных URL для такого пользователя? Я не могу найти в этом смысл. Может ли кто-нибудь научить меня?

1 Ответ

0 голосов
/ 28 июня 2018

Вы не снабжаете тело. Вы предоставляете корзину и ключ, SDK дает вам предварительно подписанный URL, и вы делитесь этим URL со своим клиентом. Ваш клиент затем загружает файл по этому URL. Вы диктуете ведро и ключ объекта, в то время как клиент предоставляет содержимое файла.

Вот пример того, как создать предварительно подписанный URL для загрузки:

import boto3

s3 = boto3.client('s3')
print s3.generate_presigned_url('put_object', { 'Bucket': 'xxx', 'Key': 'yyy' }, 3600)

Вот пример загрузки на предварительно подписанный URL:

import requests

payload = 'fred'
url = <whatever previous script returned>
r = requests.put(url, data=payload)
r.raise_for_status()
...