我必须从 Rackspace 迁移到亚马逊。我有一个大型 Rails 应用程序,它在 Cloudfiles 上保存了很多文件,我必须将它们导出到 S3。您是否知道执行该迁移的任何脚本或过程?
谢谢
我必须从 Rackspace 迁移到亚马逊。我有一个大型 Rails 应用程序,它在 Cloudfiles 上保存了很多文件,我必须将它们导出到 S3。您是否知道执行该迁移的任何脚本或过程?
谢谢
提示:如果您有很多文件(或几个大文件),则为此租用一个 EC2 实例是有意义的。虽然您仍然需要为两端支付带宽,但 EC2 和 S3 之间的传输是免费的。这节省了服务器的带宽成本。
使用相应的 gems 和 rake 任务来做这样的事情应该是相当简单的:
# 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
这样的最大缺点是您将每个文件都通过您的服务器/本地计算机传递。S3 允许您使存储桶可从其他来源写入,但 Rackspace CloudFiles API 不提供任何类型的“发布到”服务(可以理解)。
这是我用的
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
我最近不得不自己做这件事,并编写了一个很好的 Ruby 脚本来尽可能高效地完成它(分叉进程以避免 GIL)。我启动了一个 16 核 EC2 实例,并且能够在不到一个半小时的时间内传输 175,000 个文件。该实例的成本为 1.32 美元。https://github.com/cannikin/great-migration