2010-12-14 11 views
1

Ich muss von Rackspace zu Amazon migrieren. Ich habe eine große Rails-App, die viele Dateien auf Cloudfiles gespeichert hat und ich muss sie nach S3 exportieren. Kennen Sie ein Skript oder einen Prozess für diese Migration?Port-Dateien von Cloudfiles zu S3

Danke

Antwort

3

sollte ziemlich einfach sein, so etwas wie dies mit den jeweiligen Edelsteine ​​und eine Harke Aufgabe zu tun:

# connect to cloudfiles & aws 
cf_container.objects.each do |object_name| 
    cf_object = cf_container.object object_name 
    AWS::S3::S3Object.store(object_name, cf_object.data, 'name_of_s3_bucket') 
end 

Der größte Nachteil an so etwas wie das ist, dass Sie jede Datei, die durch Ihr Ihr Server/lokale Maschine. Mit S3 können Sie einen Bucket schreiben, der aus einer anderen Quelle beschreibbar ist. Die Rackspace CloudFiles-API bietet jedoch (verständlicherweise) keinen Post-to-Service an.

4

Nur ein Tipp: Wenn Sie viele Dateien haben (oder ein paar große), ist es sinnvoll, eine EC2-Instanz dafür zu mieten. Während Sie an beiden Enden noch Bandbreite bezahlen müssen, ist die Übertragung zwischen EC2 und S3 kostenlos. Dies spart die Bandbreitenkosten des Servers.

2

Hier ist, was ich

verwendet
def move_to_s3_from_rackspace() 
    cf_connection = Fog::Storage.new({ 
     :provider   => 'Rackspace', 
     :rackspace_username => USERNAME, 
     :rackspace_api_key => RACKSPACE_API_KEY, 
     :rackspace_region => RACKSPACE_REGION 
    }) 
    s3_connection = Fog::Storage.new({ 
     :provider => 'AWS', 
     :aws_access_key_id => AWS_ACCESS_KEY_ID, 
     :aws_secret_access_key => AWS_SECRET_ACCESS_KEY 
    }) 
    cf_directory = cf_connection.directories.get(RACKSPACE_CONTAINER_NAME) 
    s3_directory = s3_connection.directories.get(S3_BUCKET_NAME) 
    s3_file_keys = s3_directory.files.map { |file| file.key } 
    cf_directory.files.each do |file| 
     if s3_file_keys.include?(file.key) # already exists 
     p "file already exists, skipping: '#{file.key}'" 
     next 
     end 
     s3_directory.files.create(key: file.key, body: file.body) 
    end 
    end 
0

ich mich vor kurzem dies zu tun hatte, und einen schönen Ruby-Skript schrieb es so effizient zu tun, wie ich kann (Prozesse Forking die GIL zu vermeiden). Ich habe eine 16-Core-EC2-Instanz erstellt und konnte 175.000 Dateien in knapp anderthalb Stunden übertragen. Kostet 1,32 für die Instanz. https://github.com/cannikin/great-migration