1

我必须从 Rackspace 迁移到亚马逊。我有一个大型 Rails 应用程序,它在 Cloudfiles 上保存了很多文件,我必须将它们导出到 S3。您是否知道执行该迁移的任何脚本或过程?

谢谢

4

4 回答 4

4

提示:如果您有很多文件(或几个大文件),则为此租用一个 EC2 实例是有意义的。虽然您仍然需要为两端支付带宽,但 EC2 和 S3 之间的传输是免费的。这节省了服务器的带宽成本。

于 2011-02-09T00:29:14.667 回答
3

使用相应的 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 不提供任何类型的“发布到”服务(可以理解)。

于 2011-01-18T00:28:50.987 回答
2

这是我用的

  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
于 2014-09-17T17:50:58.660 回答
0

我最近不得不自己做这件事,并编写了一个很好的 Ruby 脚本来尽可能高效地完成它(分叉进程以避免 GIL)。我启动了一个 16 核 EC2 实例,并且能够在不到一个半小时的时间内传输 175,000 个文件。该实例的成本为 1.32 美元。https://github.com/cannikin/great-migration

于 2016-02-20T17:10:26.447 回答