Caricare tramite Python un archivio su un bucket AWS S3 Glacier da Linux

Poniamo di aver creato un bucket S3 Glacier da console AWS e di avergli associato un utente IAM con policy di accesso pieno a S3 Glacier. Per questo utente dovremo avere una chiave key ID e una chiave secret.

Per caricare file archivio sul bucket, possiamo usare una libreria Python: boto. Questa libreria esiste in versione per Python2 e per Python3. Qui useremo quella relativa a Python3: https://github.com/boto/boto3

Sul sistema dovremmo avere, ovviamente, Python3 e useremo python3-pip (pip3).

pip3 install boto3

dentro .aws/config inseriamo le credenziali dell’utente AWS IAM e la regione a cui abbiamo associato il bucket.

[default]

aws_access_key_id= XXX

aws_secret_access_key=XXX

region=eu-west-1

Apriamo poi la shell python3 e usiamo:

import boto3

client = boto3.client(‘glacier’)

response = client.list_vaults()

print (response)

Questo stampa l’elenco dei vaults presenti, sotto forma di json. All’interno del Json troviamo una variabile VaultName, che è quella che dovremo usare per caricarci il file. In questo esempio vogliamo caricare il file “Immagini/foto-2016.zip” nel vault “Personale”.

file = open(‘Immagini/foto-2016.zip’,’rb’)

archive = client.upload_archive(vaultName=’Personale’,body=filearchive,Description=”NOMEFILE.ZIP”

print(archive)

Dovrebbe rispondere con la posizione dell’archivio, un checksum e l’id dell’archivio, che si può usare per recuperarlo. L’operazione è sincrona, quindi non avrete il prompt della shell finché non sarà terminata. Se non dà errori, il nostro file dovrebbe essere stato caricato su Glacier, anche se può volerci fino a qualche ora prima che sia visibile da console.

NOTA: direttamente su Glacier si possono uploadare solo file fino a 4GB. Se serve un file più grande, bisogna caricarlo prima su S3 come multivolume, e poi spostarlo su Glacier.

NOTA: Su S3 Glacier non viene memorizzato il nome del file! Bisogna memorizzare nel client l’ID dell’archivio per poterlo richiamare usando quello. Per questo nella descrizione archiveDescription va indicato di cosa si tratta.