2013-04-22 10 views

risposta

81

Se la chiave è leggibile al pubblico (come mostrato sopra) è possibile utilizzare Key.generate_url:

url = key.generate_url(expires_in=0, query_auth=False) 

Se la chiave è privata e si vuole generare un URL in scadenza di condividere il contenuto con una persona che non ha accesso diretto si potrebbe fare:

url = key.generate_url(expires_in=300) 

dove expires è il numero di secondi prima della scadenza del URL. Questi produrranno gli URL di HTTPS. Se si preferisce un URL HTTP, utilizzare questo:

url = key.generate_url(expires_in=0, query_auth=False, force_http=True) 
+13

Con boto 2.9.6 ho dovuto usare 'expires_in = 0 '. 'expires_in = None' mi ha dato un errore. – dirk

+2

Vale la pena notare che 'expires_in = 0' è" scade adesso! " in boto 2.3.0 –

+3

Se la chiave è pubblica (ad esempio, si chiama make_public()), expires_in = 0 non fa nulla -> l'url generato da generate_url non scadrà mai. In boto 2.2.2, generate_url (expires_in = None) genera un errore perché tenta di calcolare la data di scadenza come "expires = int (time.time() + expires_in)" –

8
import boto 
from boto.s3.connection import S3Connection 

conn = S3Connection('AWS_ACCESS_KEY', 'AWS_SECRET_KEY') 

secure_https_url = 'https://{host}/{bucket}/{key}'.format(
    host=conn.server_name(), 
    bucket='name-of-bucket', 
    key='name_of_key') 

http_url = 'http://{bucket}.{host}/{key}'.format(
    host=conn.server_name(), 
    bucket='name-of-bucket', 
    key='name_of_key') 

Ecco come ho fatto in boto 2.23.0 per un URL pubblico. Non sono riuscito a far funzionare l'argomento expires_in = None.

Si noti che per HTTPS non è possibile utilizzare un sottodominio.

+0

Funziona alla grande e non richiede una chiamata all'API S3. Grazie per aver incluso anche l'URL HTTPS. – Seth

+1

Nessuno degli approcci descritti qui richiede una chiamata all'API S3. Alcuni richiedono di avere installato boto e se l'oggetto a cui si sta collegando è pubblicamente accessibile, è possibile evitarlo utilizzando l'approccio mostrato sopra. – garnaat

+0

È possibile utilizzare un sottodominio se il nome del bucket corrisponde solo a un sottodominio valido: solo lettere minuscole, numeri e trattini. Nel tuo esempio, se il bucket fosse davvero "name-of-bucket", potresti usare lo stesso codice per 'http_url', basta scambiare https per http. –

19

Per Boto3, è necessario farlo nel modo seguente ...

import boto3 

s3 = boto3.client('s3') 
url = '{}/{}/{}'.format(s3.meta.endpoint_url, bucket, key) 
+0

Questo è perfetto per il mio caso d'uso, grazie! – Patrick

+1

Per boto3 vedere https://stackoverflow.com/questions/33549254/how-to-generate-url-from-boto3-in-amazon-web-services –