2013-06-10 8 views
7

Attualmente sto usando Amazon Web Services (AWS) e per aprire un bucket S3, salvare il suo contenuto in una directory in un EC2, quindi creare un file tar da tutto ciò che è in quella directory e spingere quel file tar su AWS Glacier. L'ultimo passaggio che stavo cercando di realizzare era terminare lo script quando il file tar è stato caricato correttamente su AWS Glacier (che richiede 3-5 ore).Usare Boto per dire quando un file è stato caricato con successo su Glacier

Attualmente sono perplesso su come prendere l'archive_id e chiedere al vault se il file tar è stato caricato correttamente.

Per interagire con AWS Glacier, ho utilizzato lo strumento boto python. Ho incluso il codice python \ boto che carica il file sul ghiacciaio e alcuni dei test rapidi che ho provato a eseguire per capire se il codice è stato caricato con successo o meno. Finora tutti i test restituiscono false.

Ho escluso alcuni test sullo status_code che restituiva anche false per tutto e quando provo a stampare uno di questi solo il non completato e in corso (As expect) stampa nulla, eppure quando provo per abbinare l'archive_id o il retrieve_job a ciò che viene restituito nell'elenco dei lavori non ottengo corrispondenze. Una nota aggiuntiva è le liste in cui vengono salvate quando sono stampate tutte uguali (Lavoro (arn: aws: glacier: us-east-1: 232412618534: vaults/glacier-poc))

Come restituire vero quando il lavoro è completato?

import boto 
    import sys 

    ACCESS_KEY_ID = "..." 
    SECRET_ACCESS_KEY = "..." 
    FILENAME = sys.argv[1] 
    GLACIER_VAULT_NAME = sys.argv[2] 

    connection = boto.connect_glacier(aws_access_key_id=ACCESS_KEY_ID, aws_secret_access_key=SECRET_ACCESS_KEY) 

    vault = connection.get_vault(GLACIER_VAULT_NAME) 

    archive_id = vault.upload_archive(FILENAME) 

    open("glacier.txt", "a").write(FILENAME + " " + archive_id + "\n") 

    retrieve_job = vault.retrieve_archive(archive_id) 

    a = vault.list_jobs(completed=True) 
    b = vault.list_jobs(completed=False) 

    print "Is In Completed List" 
    print archive_id in a 
    print "Is In NOT Completed List" 
    print archive_id in b 

    print "Is In Completed List" 
    print retrieve_job in a 
    print "Is In NOT Completed List" 
    print retrieve_job in b 

risposta

4

Date un'occhiata a questo Boto and Glacier guide, è possibile interrogare manualmente dalla boto o è possibile impostare Amazon Simple Notification Service per informare l'utente quando il lavoro è fatto.

archive_id = vault.upload_archive("mybackup.tgz") 
retrieve_job = vault.retrieve_archive(archive_id) 

# if the job is in progress 
job_id = retrieve_job.id 
retrieve_job = vault.get_job(job_id) 

if retrieve_job.completed: 
    job.download_to_file("mybackup.tgz") 

È possibile utilizzare boto è set_vault_notifications funzione impostare le notifiche SNS.

notification_config = {'SNSTopic': 'my_notification_topic', 
         'Events': ['ArchiveRetrievalCompleted', 
            'InventoryRetrievalCompleted']} 
vault.set_vault_notifications(vault, notification_config) 

Here è un ampio esempio di attesa per un upload attraverso la creazione di sottoscrizioni di notifica SNS al servizio di coda SQS.

+0

Quindi non sono sicuro del perché, ma sto avendo problemi con questo. Quando ho provato a verificare se è completo, l'ho inserito in un ciclo while per continuare a controllare fino a quando non è stato restituito true retrieve_job.completed. Finora ho provato 3 o 4 modi diversi e non ho avuto alcun successo. Qualche suggerimento utile? Non sto cercando di scaricarlo, basta controllare per vedere se è ancora lì –