AWS S3在两个存储桶之间复制文件和文件夹

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AWS S3在两个存储桶之间复制文件和文件夹相关的知识,希望对你有一定的参考价值。

我一直在寻找一种工具来帮助我将S3存储桶的内容复制到第二个存储桶中,而无需先将内容下载到本地系统。

我尝试过AWS S3控制台复制选项但导致一些嵌套文件丢失。

我曾尝试使用Transmit app(Panic),但duplicate命令首先将文件复制到本地系统,然后再复制到第二个存储桶

答案

在S3 Buckets之间复制

AWS(刚刚发布)发布了一个用于在存储桶之间进行复制的命令行界面。

http://aws.amazon.com/cli/

$ aws s3 sync s3://mybucket-src s3://mybucket-target --exclude *.tmp
..

这将从一个目标存储桶复制到另一个存储桶。

请参阅此处的文档:S3 CLI Documentation

另一答案

我写了一个备份S3存储桶的脚本:https://github.com/roseperrone/aws-backup-rake-task

#!/usr/bin/env python
from boto.s3.connection import S3Connection
import re
import datetime
import sys
import time

def main():
    s3_ID = sys.argv[1]
    s3_key = sys.argv[2]
    src_bucket_name = sys.argv[3]
    num_backup_buckets = sys.argv[4]
    connection = S3Connection(s3_ID, s3_key)
    delete_oldest_backup_buckets(connection, num_backup_buckets)
    backup(connection, src_bucket_name)

def delete_oldest_backup_buckets(connection, num_backup_buckets):
    """Deletes the oldest backup buckets such that only the newest NUM_BACKUP_BUCKETS - 1 buckets remain."""
    buckets = connection.get_all_buckets() # returns a list of bucket objects
    num_buckets = len(buckets)

    backup_bucket_names = []
    for bucket in buckets:
        if (re.search('backup-' + r'\d{4}-\d{2}-\d{2}' , bucket.name)):
            backup_bucket_names.append(bucket.name)

    backup_bucket_names.sort(key=lambda x: datetime.datetime.strptime(x[len('backup-'):17], '%Y-%m-%d').date())

    # The buckets are sorted latest to earliest, so we want to keep the last NUM_BACKUP_BUCKETS - 1
    delete = len(backup_bucket_names) - (int(num_backup_buckets) - 1)
    if delete <= 0:
        return

    for i in range(0, delete):
        print 'Deleting the backup bucket, ' + backup_bucket_names[i]
        connection.delete_bucket(backup_bucket_names[i])

def backup(connection, src_bucket_name):
    now = datetime.datetime.now()
    # the month and day must be zero-filled
    new_backup_bucket_name = 'backup-' + str('%02d' % now.year) + '-' + str('%02d' % now.month) + '-' + str(now.day);
    print "Creating new bucket " + new_backup_bucket_name
    new_backup_bucket = connection.create_bucket(new_backup_bucket_name)
    copy_bucket(src_bucket_name, new_backup_bucket_name, connection)


def copy_bucket(src_bucket_name, dst_bucket_name, connection, maximum_keys = 100):
    src_bucket = connection.get_bucket(src_bucket_name);
    dst_bucket = connection.get_bucket(dst_bucket_name);

    result_marker = ''
    while True:
        keys = src_bucket.get_all_keys(max_keys = maximum_keys, marker = result_marker)

        for k in keys:
            print 'Copying ' + k.key + ' from ' + src_bucket_name + ' to ' + dst_bucket_name

            t0 = time.clock()
            dst_bucket.copy_key(k.key, src_bucket_name, k.key)
            print time.clock() - t0, ' seconds'

        if len(keys) < maximum_keys:
            print 'Done backing up.'
            break

        result_marker = keys[maximum_keys - 1].key

if  __name__ =='__main__':main()

我在rake任务中使用它(对于Rails应用程序):

desc "Back up a file onto S3"
task :backup do
     S3ID = "AKIAJM3NRWC7STXWUWVQ"
     S3KEY = "0A5kuzV+E1dkaPjZxHQAezz1GlSddJd0iS5sNpry"
     SRCBUCKET = "primary-mzgd"
     NUM_BACKUP_BUCKETS = 2

     Dir.chdir("#{Rails.root}/lib/tasks")
     system "./do_backup.py #{S3ID} #{S3KEY} #{SRCBUCKET} #{NUM_BACKUP_BUCKETS}"
end
另一答案

如果你进入javascript:p,我听说有一个节点模块

来自knox-copy文档:

knoxCopy = require 'knox-copy'

client = knoxCopy.createClient
  key: '<api-key-here>'
  secret: '<secret-here>'
  bucket: 'backups'

client.copyBucket
  fromBucket: 'uploads'
  fromPrefix: '/nom-nom'
  toPrefix: "/upload_backups/#{new Date().toISOString()}"
  (err, count) ->
     console.log "Copied #{count} files"
另一答案

我被告知您也可以在EMR集群上使用s3distcp执行此操作。对于包含大文件的数据,它应该更快。它在小型数据集上运行良好 - 但我会更喜欢另一种解决方案,因为它为这么少的数据设置了学习曲线(我之前从未使用过EMR)。

以下是AWS文档的链接:http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

更新:对于相同的数据集,s3s3mirror比s3distcp或AWS cli快得多。设置起来也容易得多。

另一答案

要从一个S3存储桶复制到相同或另一个S3存储桶而不下载到本地,它非常简单。使用以下shell命令。

hdfs dfs -cp -f "s3://AccessKey:SecurityKey@ExternalBucket/SourceFoldername/*.*" "s3://AccessKey:SecurityKey@ExternalBucket/TargetFoldername"

这会将源存储桶的SourceFoldername文件夹中的所有文件复制到目标存储桶的TargetFoldername文件夹中。在上面的代码中,请将AccessKeySecurityKeyExternalBucket替换为您的相应值。

另一答案

怎么样aws s3 sync cli命令。 aws s3 sync s3:// bucket1 / s3:// bucket2 /

另一答案

从AWS cli https://aws.amazon.com/cli/你可以做到

aws s3 ls - 这将列出所有S3存储桶

aws cp --recursive s3://<source bucket> s3://<destination bucket> - 这会将文件从一个存储桶复制到另一个存储桶

注意*在创建跨区域复制存储桶时非常有用,通过执行上述操作,您将跟踪所有文件,并将源区域文件的更新传播到复制存储桶。除了文件删除之外的所有内容都会同步。

对于CRR,请确保在存储桶上启用了版本控制。

另一答案

正如Neel Bhaat在此blog中所解释的那样,有许多不同的工具可用于此目的。有些是AWS提供的,其中大多数是第三方工具。所有这些工具都要求您在工具本身中保存您的AWS账户密钥和密钥。在使用第三方工具时要非常谨慎,因为您保存的凭据可能会花费您,您的全部价值并让您失去信心。

因此,我总是建议使用AWS CLI来实现此目的。你可以简单地从this link安装它。接下来,运行以下命令并在AWS CLI中保存密钥,机密值。

aws configure

并使用以下命令将AWS S3 Bucket同步到本地计算机。 (本地计算机应安装AWS CLI)

aws s3 sync <source> <destination>

例子:

1)对于AWS S3到本地存储

aws s3 sync <S3Uri> <LocalPath>

2)从本地存储到AWS S3

aws s3 sync <LocalPath> <S3Uri>

3)从AWS s3存储桶到另一个存储桶

aws s3 sync <S3Uri> <S3Uri> 
另一答案

复制S3存储桶的最佳方法是使用AWS CLI。

它涉及以下3个步骤:

  1. 在您的服务器上安装AWS CLI。
**https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html**
  1. 如果要在两个AWS账户之间复制存储桶,则需要为每个存储桶附加正确的策略。
  2. 在此之后使用此命令从一个存储桶复制到另一个存储桶。
aws s3 sync s3://sourcebucket s3://destinationbucket

此链接提供了步骤2和步骤3的详细信息:

https://aws.amazon.com/premiumsupport/knowledge-center/account-transfer-s3/

另一答案

使用aws-sdk gem的简化示例:

AWS.config(:access_key_id => '...', :secret_access_key => '...')
s3 = AWS::S3.new
s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key')

如果要在不同存储桶之间执行复制,请指定目标存储桶名称:

s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key', :bucket_name => 'target-bucket')
另一答案

您现在可以从S3管理界面执行此操作。只需进入一

以上是关于AWS S3在两个存储桶之间复制文件和文件夹的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用 boto3 Python 在 aws s3 存储桶之间递归复制文件和文件夹吗?

使用 boto3 在两个 AWS S3 存储桶之间移动文件

如何使用aws java sdk将文件从S3存储桶从一个区域复制到另一个区域?

使用 Node 将文件从一个 AWS S3 存储桶复制到另一个存储桶

如何使用angular js将aws s3文件复制到同一个存储桶中的特定文件夹

将文件从 AWS s3 (SSE) 存储桶复制到谷歌云