关于Amazon S3:要下载整个S3存储桶?

Downloading an entire S3 bucket?

我注意到似乎没有选择从AWS管理控制台下载整个S3存储桶的选项。

有没有一种简单的方法可以将所有东西都放在我的一个存储桶中? 我当时正在考虑将根文件夹设为公用,使用wget抓取所有内容,然后再次将其设为私有,但是我不知道是否有更简单的方法。


AWS CLI

AWS CLI的文档

AWS最近发布了他们的命令行工具。它的工作原理类似于boto,可以使用sudo easy_install awsclisudo pip install awscli安装

安装后,您可以简单地运行:

命令:

1
aws s3 sync s3://<source_bucket> <local_destination>

例如,

1
aws s3 sync s3://mybucket .

mybucket中的所有对象下载到当前目录。

输出:

1
2
download: s3://mybucket/test.txt to test.txt
download: s3://mybucket/test2.txt to test2.txt

这将下载您的所有文件(单向同步)。它将不会删除当前目录中的任何现有文件(除非您指定--delete),并且不会更改或删除S3上的任何文件。

您也可以将S3存储桶同步到S3存储桶,或在S3存储桶本地同步。

查看文档和其他示例:

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

从存储桶下载文件夹

尽管以上示例是如何下载完整存储桶的,但您也可以通过执行以下操作来递归下载文件夹

1
aws s3 cp s3://BUCKETNAME/PATH/TO/FOLDER LocalFolderName --recursive

这将指示CLI在BUCKETNAME存储桶的PATH/TO/FOLDER目录中以递归方式下载所有文件和文件夹密钥。


您可以使用s3cmd下载存储桶。

1
2
s3cmd --configure
s3cmd sync s3://bucketnamehere/folder /destination/folder

更新资料

您可以使用另一个名为Rclone的工具。下面是Rclone文档中的代码示例。

1
rclone sync /home/local/directory remote:bucket


我使用了几种不同的方法将Amazon S3数据复制到本地计算机(包括s3cmd),到目前为止,最简单的方法是Cyber??duck。您需要做的就是输入您的Amazon凭证,并使用简单的界面下载/上传/同步您的所有存储桶/文件夹/文件。

Screenshot


您基本上可以有很多选择,但是最好的选择是使用AWS CLI

这是一个演练

  • 第1步

在您的机器上下载并安装AWS CLI

使用MSI安装程序(Windows)安装AWS CLI

使用捆绑安装程序(Linux,OS X或Unix)安装AWS CLI

  • 第2步

配置AWS CLI

enter image description here

确保输入创建帐户时收到的有效访问密钥和秘密密钥

  • 第三步

使用以下命令同步s3存储桶

1
aws s3 sync s3://yourbucket /local/path

将以下命令替换为以下数据

yourbucket >>您要下载的s3存储桶

/ local / path >>您要在其中下载所有文件的本地系统中的路径

希望这可以帮助!


要使用AWS S3 CLI下载:

1
2
aws s3 cp s3://WholeBucket LocalFolder --recursive
aws s3 cp s3://Bucket/Folder LocalFolder --recursive

要使用代码下载,请使用AWS开发工具包。

要使用GUI下载,请使用Cyber??duck。

希望能帮助到你.. :)


S3浏览器是我找到的最简单的方法。它是出色的软件...它是免费的非商业用途。仅Windows。

http://s3browser.com/


如果您使用Visual Studio,请下载http://aws.amazon.com/visualstudio/

安装后,转到Visual Studio-AWS Explorer-S3-您的存储桶-双击

在窗口中,您将能够选择所有文件。右键单击并下载文件。


传输可以帮助某些osx用户的另一种选择。这是一个ftp程序,还可以让您连接到s3文件。并且它可以选择将任何ftp或s3存储作为文件夹挂载在finder中。但这只是有限的时间。


我已经对s3进行了一些开发,但还没有找到下载整个存储桶的简单方法。
如果要用Java编写代码,可以轻松使用jets3t lib创建存储桶列表并遍历该列表以下载它们。

http://jets3t.s3.amazonaws.com/downloads.html

首先从AWS管理领事那里获取一个公共私钥集,以便您可以创建一个S3service对象...

1
2
AWSCredentials awsCredentials = new AWSCredentials(YourAccessKey, YourAwsSecretKey);
s3Service = new RestS3Service(awsCredentials);

然后获取您的bucket对象的数组...

1
S3Object[] objects = s3Service.listObjects(YourBucketNameString);

最后,使用此代码遍历该数组一次下载一个对象...

1
2
S3Object obj = s3Service.getObject(bucket, fileName);
            file = obj.getDataInputStream();

我将连接代码放在线程安全的单例中。出于明显的原因,省略了必要的try / catch语法。

如果您想用Python编写代码,则可以改用Boto。

PS环顾BucketExplorer后,我想做什么。
https://forums.aws.amazon.com/thread.jspa?messageID=248429


将此命令与AWS CLI结合使用:

1
aws s3 cp s3://bucketname. --recursive

@Layke的回答很好,但是如果您有大量数据并且不想永远等待,则应密切注意此文档,以了解如何获取AWS S3 CLI同步命令以使存储桶与大规模并行化同步。以下命令将告诉AWS CLI使用1,000个线程来执行作业(每个文件或一个多部分副本的一部分)并预执行100,000个作业:

1
2
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

运行这些命令后,可以使用简单的sync命令,如下所示:

1
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

要么

1
aws s3 sync s3://source-bucket/source-path c:\my\local\data\path

在具有CPU 4内核和16GB RAM的系统上,对于我的情况(3-50GB文件),同步/复制速度从大约9.5MiB / s变为700 + MiB / s,与默认配置相比,速度提高了70倍。


AWS sdk API将是上传整个文件夹并存储到s3并将整个s3存储桶下载到本地的最佳选择。

用于将整个文件夹上传到s3

1
aws s3 sync . s3://BucketName

本地下载整个s3存储桶

1
aws s3 sync s3://BucketName .

您还可以为s3中的特定文件夹分配路径(例如BucketName / Path),以进行下载


如果您将Firefox与S3Fox结合使用,则确实可以选择所有文件(首先选择并选择Shift和Shift),然后右键单击并下载所有文件...我已经完成了500多个文件,而没有任何问题


您可以使用https://github.com/minio/mc进行此操作:

1
mc cp -r https://s3-us-west-2.amazonaws.com/bucketName/ localdir

mc还支持会话,可恢复的下载,上载等等。 mc支持Linux,OS X和Windows操作系统。用Golang编写,并在Apache 2.0版下发布。


在Windows中,我首选的GUI工具是用于S3的Cloudberry Explorer,http://www.cloudberrylab.com/free-amazon-s3-explorer-cloudfront-IAM.aspx。具有相当完善的文件浏览器,类似ftp的界面。


要添加另一个GUI选项,我们使用WinSCP的S3功能。连接非常简单,只需要在UI中输入访问密钥和秘密密钥即可。然后,您可以从任何可访问的存储桶中浏览和下载所需的任何文件,包括递归下载嵌套文件夹。

由于通过安全清除新软件可能是一个挑战,并且WinSCP相当普遍,因此仅使用它而不是尝试安装一个更专用的实用程序确实是有益的。


如果那里只有文件(没有子目录),一个快速的解决方案是选择所有文件(第一个为click,最后一个为Shift+click)并按Enterright click并选择Open。对于大多数数据文件,这会将它们直接下载到您的计算机上。


  • Windows用户需要从此链接下载S3EXPLORER,该链接也具有安装说明:-http://s3browser.com/download.aspx

  • 然后为您提供AWS凭证,例如s3explorer的密钥,访问密钥和区域,此链接包含s3explorer的配置说明:复制浏览器中的粘贴链接:s3browser.com/s3browser-first-run.aspx

  • 现在,您的所有s3存储桶将在s3explorer的左侧面板上可见。

  • 只需选择存储桶,然后单击左上角的存储桶菜单,然后从菜单中选择将所有文件下载到选项。下面是相同的屏幕截图:

  • 铲斗选择屏幕

  • 然后浏览文件夹以将存储桶下载到特定位置

  • 单击确定,您的下载将开始。


  • 这里有一些东西可以下载所有存储桶,列出它们,列出它们的内容。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
        //connection string
        private static void dBConnection() {
        app.setAwsCredentials(CONST.getAccessKey(), CONST.getSecretKey());
        conn = new AmazonS3Client(app.getAwsCredentials());
        app.setListOfBuckets(conn.listBuckets());
        System.out.println(CONST.getConnectionSuccessfullMessage());
        }

        private static void downloadBucket() {

        do {
            for (S3ObjectSummary objectSummary : app.getS3Object().getObjectSummaries()) {
                app.setBucketKey(objectSummary.getKey());
                app.setBucketName(objectSummary.getBucketName());
                if(objectSummary.getKey().contains(CONST.getDesiredKey())){
                    //DOWNLOAD
                    try
                    {
                        s3Client = new AmazonS3Client(new ProfileCredentialsProvider());
                        s3Client.getObject(
                                new GetObjectRequest(app.getBucketName(),app.getBucketKey()),
                                new File(app.getDownloadedBucket())
                                );
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    do
                    {
                         if(app.getBackUpExist() == true){
                            System.out.println("Converting back up file");
                            app.setCurrentPacsId(objectSummary.getKey());
                            passIn = app.getDataBaseFile();
                            CONVERT= new DataConversion(passIn);
                            System.out.println(CONST.getFileDownloadedMessage());
                        }
                    }
                    while(app.getObjectExist()==true);

                    if(app.getObjectExist()== false)
                    {
                        app.setNoObjectFound(true);
                    }
                }
            }
            app.setS3Object(conn.listNextBatchOfObjects(app.getS3Object()));
        }
        while (app.getS3Object().isTruncated());
    }

    / ----------------------------扩展方法------------------- ------------------ /

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    //Unzip bucket after download
    public static void unzipBucket() throws IOException {
        unzip = new UnZipBuckets();
        unzip.unZipIt(app.getDownloadedBucket());
        System.out.println(CONST.getFileUnzippedMessage());
    }

    //list all S3 buckets
    public static void listAllBuckets(){
        for (Bucket bucket : app.getListOfBuckets()) {
            String bucketName = bucket.getName();
            System.out.println(bucketName +"\t" + StringUtils.fromDate(bucket.getCreationDate()));
        }
    }

    //Get the contents from the auto back up bucket
    public static void listAllBucketContents(){    
        do {
            for (S3ObjectSummary objectSummary : app.getS3Object().getObjectSummaries()) {
                if(objectSummary.getKey().contains(CONST.getDesiredKey())){
                    System.out.println(objectSummary.getKey() +"\t" + objectSummary.getSize() +"\t" + StringUtils.fromDate(objectSummary.getLastModified()));
                    app.setBackUpCount(app.getBackUpCount() + 1);  
                }
            }
            app.setS3Object(conn.listNextBatchOfObjects(app.getS3Object()));
        }
        while (app.getS3Object().isTruncated());
        System.out.println("There are a total of :" + app.getBackUpCount() +" buckets.");
    }

    }


    您可以使用s3cmd命令简单地获取它:

    1
    s3cmd get --recursive --continue s3://test-bucket local-directory/

    正如Neel Bhaat在此博客中解释的那样,有许多不同的工具可用于此目的。 AWS提供了一些工具,其中大多数是第三方工具。所有这些工具都要求您在工具本身中保存您的AWS账户密钥和机密。使用第三方工具时要格外小心,因为您保存的凭据可能会花费您,花费全部金钱并让您丧命。

    因此,我始终建议为此目的使用AWS CLI。您可以从此链接简单地安装它。接下来,运行以下命令并将您的密钥秘密值保存在AWS CLI中。

    1
    aws configure

    并使用以下命令将您的AWS S3存储桶同步到本地计算机。 (本地计算机应已安装AWS CLI)

    1
    aws s3 sync <source> <destination>

    例子:

    1)对于AWS S3到本地存储

    1
    aws s3 sync <S3Uri> <LocalPath>

    2)从本地存储到AWS S3

    1
    aws s3 sync <LocalPath> <S3Uri>

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

    1
    aws s3 sync <S3Uri> <S3Uri>


    如果您只想从AWS下载存储桶,请首先在计算机中安装AWS CLI。在终端中,将目录更改为要下载文件的目录,然后运行此命令。

    1
    aws s3 sync s3://bucket-name .

    如果您还想同步本地目录和s3目录(如果您在本地文件夹中添加了一些文件),请运行以下命令:

    1
    aws s3 sync . s3://bucket-name

    我的评论并没有真正添加新的解决方案。正如这里许多人所说的,aws s3 sync是最好的。但是没有人指出一个强大的选项:dryrun。使用此选项,您可以查看使用sync时从s3下载/上传的内容。当您不想覆盖本地或s3存储桶中的内容时,这确实很有用。使用方法如下:

    aws s3 sync --dryrun

    在将新内容推送到存储桶之前,我一直都在使用它,以便不上载不想要的更改。


    aws sync是完美的解决方案。它不做两种方式..它是从源到目标的一种方式。另外,如果您有很多物品在存储桶中,则最好先创建s3端点,这样下载速度会更快(因为下载不是通过Internet而是通过Intranet进行)


    如果存储桶很大,则有一个名为s4cmd的命令可以建立并行连接并缩短下载时间:

    要像在Debian上安装它

    1
    apt install s4cmd

    如果您有点子:

    1
    pip install s4cmd

    如果存在,它将读取~/.s3cfg文件(如果未安装s3cmd并运行s3cmd --configure),或者您可以在命令中指定--access-key=ACCESS_KEY --secret-key=SECRET_KEY

    cli与s3cmd相似。在您的情况下,建议使用sync,因为您可以取消下载并重新启动它,而不必重新下载文件。

    1
    s4cmd [--access-key=ACCESS_KEY --secret-key=SECRET_KEY] sync s3://<your-bucket> /some/local/dir

    请注意,如果下载大量数据(> 1TB),这可能会影响您的账单,请先计算出这笔费用


    正如@layke所说,从S3 cli下载文件是一种安全可靠的最佳做法。但是在某些情况下,人们需要使用wget下载文件,这是解决方案

    1
    aws s3 presign s3://<your_bucket_name/>

    此presign将为您提供临时的公共URL,您可以使用presign_url从w3中下载内容,如果使用wget或任何其他下载客户端,则可以使用presign_url。


    试试这个命令:

    aws s3 sync yourBucketnameDirectory yourLocalDirectory

    例如,如果您的存储桶名称为myBucket,本地目录为c:\local,则:

    aws s3 sync s3://myBucket c:\local

    有关awscli的更多信息,请检查此
    AWS CLI安装


    AWS CLI是在本地下载整个S3存储桶的最佳选择。

  • 安装AWS CLI。

  • 配置AWS CLI以使用默认安全凭证和默认AWS区域。

  • 要下载整个S3存储桶使用命令

    aws s3同步s3:// yourbucketname localpath

  • 将AWS cli用于不同的AWS服务的参考:https://docs.aws.amazon.com/cli/latest/reference/


    您可以使用此AWS cli命令将整个S3存储桶内容下载到本地文件夹

    1
    aws s3 sync s3://your-bucket-name"Local Folder Path"

    如果看到这样的错误

    1
    fatal error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

    --no-verify-ssl(布尔值)

    默认情况下,与AWS服务通信时,AWS CLI使用SSL。对于每个SSL连接,AWS CLI将验证SSL证书。此选项将覆盖验证SSL证书的默认行为。
    参考

    将此标签与--no-verify-ssl命令一起使用

    1
    aws s3 sync s3://your-bucket-name"Local Folder Path" --no-verify-ssl