【问题标题】:Downloading an entire S3 bucket?下载整个 S3 存储桶?
【发布时间】:2012-01-29 08:54:16
【问题描述】:

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

有没有一种简单的方法可以把我的一个桶里的所有东西都抓起来?我正在考虑将根文件夹公开,使用wget 将其全部获取,然后再次将其设为私有,但我不知道是否有更简单的方法。

【问题讨论】:

  • 正如这里的许多人所说,aws s3 sync 是最好的。但是没有人指出一个强大的选项:dryrun。当您使用sync 时,此选项允许您查看从 s3 下载/上传到 s3 的内容。当您不想覆盖本地或 s3 存储桶中的内容时,这非常有用。使用方法如下:aws s3 sync <source> <destination> --dryrun 在将新内容推送到存储桶之前,我一直使用它,以免上传不需要的更改。
  • 这是一个快速视频,展示了aws s3 sync 的实践:youtube.com/watch?v=J2aZodwPeQk
  • 查看2021/09完整答案:stackoverflow.com/a/68981037/8718377

标签: amazon-web-services amazon-s3 aws-cli


【解决方案1】:

AWS CLI

有关详细信息,请参阅“AWS CLI Command Reference”。

AWS 最近发布了他们的命令行工具,其工作方式与 boto 非常相似,可以使用

sudo easy_install awscli

sudo pip install awscli

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

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

例如:

aws s3 sync s3://mybucket .

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

并且会输出:

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

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

您还可以执行 S3 存储桶到 S3 存储桶,或本地到 S3 存储桶同步。

查看documentation and other examples

上面的例子是如何下载一个完整的bucket,你也可以通过执行递归下载一个文件夹

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

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

【讨论】:

  • 首先运行aws configure 并添加您的access keysecret access key,可以在here 中找到。
  • 转到此处获取 Windows 安装程序 aws.amazon.com/cli。它从环境变量“AWS_ACCESS_KEY_ID”中获取访问密钥 ID,并从“AWS_SECRET_ACCESS_KEY”中获取您的密钥。
  • 我试过 s3cmdCyberduck,但对我来说,awscli 是迄今为止从我的存储桶中下载约 70.000 个文件的最快方式。
  • 请注意,虽然问题仅询问下载,但我相信此命令将在您的目录和 S3 之间进行双向同步。如果您不尝试上传任何内容,请确保当前目录为空。
  • @JesseCrossen aws s3 sync 命令不会上传任何内容,但如果文件在 S3 上不存在,它将在本地删除文件。见the documentation
【解决方案2】:

您可以使用s3cmd 下载您的存储桶:

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

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

rclone sync /home/local/directory remote:bucket

【讨论】:

  • 这很慢。特别是如果您尝试增量使用它。有没有多线程的解决方案可以使带宽饱和?
  • 下面的方案更好,更标准,对更多平台开放
  • 这不适用于请求者支付桶(请参阅arxiv.org/help/bulk_data_s3):-(
  • 如果我必须为下载执行模式匹配,我该如何使用您的解决方案?我的问题:stackoverflow.com/questions/25086722/…
【解决方案3】:

我使用了几种不同的方法将 Amazon S3 数据复制到本地计算机,包括 s3cmd,目前最简单的是 Cyberduck

您需要做的就是输入您的亚马逊凭证并使用简单的界面下载、上传、同步您的任何存储桶、文件夹或文件。

【讨论】:

  • 效果很好!适用于 Windows 和 Mac (GPL)。
  • Cyber​​duck 还可以轻松匿名下载公共文件 - s3cmd 似乎需要凭据
  • 与 Transmit 一起使用也很好。
  • 当我试图保存我的存储桶时,CLI 给了我一个错误,这非常有效!
  • 哦,出乎意料。我之前使用cyberduck 进行FTP,但从没想过它有S3 连接。感谢您的精彩提示!
【解决方案4】:

您有很多选择,但最好的选择是使用 AWS CLI。

这是一个演练:

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

  2. 配置 AWS CLI:

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

  3. 使用以下方式同步 S3 存储桶:

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

    在上述命令中,替换以下字段:

    • yourbucket >> 您要下载的 S3 存储桶。
    • /local/path >> 本地系统中您要下载所有文件的路径。

【讨论】:

  • 我用这个代替了cyberduck,因为cyberduck在开始下载之前需要“准备”文件。对于似乎需要很长时间的大量文件,我找不到有关“准备”实际作用的信息。 CLI 立即开始下载
  • 确保您在存储桶名称中有 s3:// 前缀!!!使用aws s3 ls,您不需要s3:// 前缀,但需要cp 命令。
【解决方案5】:

使用 AWS S3 CLI 下载:

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

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

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

【讨论】:

  • 如何忽略某些文件或文件夹?
  • @Nabin 您可以使用 --include & --exclude 和通配符来排除某些文件或文件夹,例如:aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt"
【解决方案6】:

@Layke 的回答很好,但是如果您有大量数据并且不想永远等待,您应该阅读“AWS CLI S3 Configuration”。

以下命令将告诉 AWS CLI 使用 1,000 个线程来执行作业(每个是一个小文件或多部分副本的一部分)并提前 100,000 个作业:

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

运行这些之后,您可以使用简单的sync 命令:

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

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

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

【讨论】:

  • 这是真正的答案。刚刚测试它,从 ec2 传输大约 2.3GB/分钟。没有大约 1GB/分钟的并发选项。救命稻草。
【解决方案7】:

如果您使用 Visual Studio,请下载“AWS Toolkit for Visual Studio”。

安装后,进入Visual Studio - AWS Explorer - S3 - 你的bucket - 双击

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

【讨论】:

    【解决方案8】:

    对于 Windows,S3 Browser 是我找到的最简单的方法。它是一款优秀的软件,并且可以免费用于非商业用途。

    【讨论】:

    • 我刚刚尝试了“将所有文件下载到...”选项(我认为这相当于“下载整个 s3 存储桶”,它说我需要专业版。
    • 更新:但我能够下载存储桶中的整个文件夹,这足以满足我的需求......
    • 是的,免费版本非常有限,您可以选择全部,然后下载,但仅限同时传输 2 个
    • 在 Ubuntu 17.1 和 s3cmd 上遇到一些 python3 支持错误后正在寻找一个 windows 简单版本,这很好。
    【解决方案9】:

    将此命令与AWS CLI 一起使用:

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

    【讨论】:

      【解决方案10】:

      100% 适合我,我已经从 aws s3 backet 下载了所有文件。

      1. 安装 aws cli(并选择您的操作系统,按照步骤操作) https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

      2. 查看 aws 版本:aws --version

      3. 运行配置命令:aws configure

      4. aws s3 cp s3://yourbucketname your\local\path --recursive

      例如(Windows):aws s3 cp s3://yourbucketname C:\aws-s3-backup\project-name --recursive

      查看此链接: https://www.edureka.co/community/32955/how-to-download-an-entire-bucket-from-s3-to-local-folder

      【讨论】:

      • 谢谢,会维护bucket内的文件夹结构吗?
      • 谢谢!像魅力一样工作。
      【解决方案11】:

      另一个可以帮助某些 OS X 用户的选项是 Transmit。

      它是一个 FTP 程序,还可以让您连接到您的 S3 文件。而且,它可以选择将任何 FTP 或 S3 存储作为文件夹挂载到 Finder 中,但仅限于有限的时间。

      【讨论】:

        【解决方案12】:

        我已经为 S3 做了一些开发,但我还没有找到一个简单的方法来下载整个存储桶。

        如果您想用 Java 编写代码,jets3t 库很容易用于创建存储桶列表并遍历该列表以下载它们。

        首先,从 AWS 管理控制台获取一个公共私有密钥集,以便您可以创建一个 S3service 对象:

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

        然后,获取存储桶对象的数组:

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

        最后,遍历该数组以一次下载一个对象:

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

        我将连接代码放在线程安全的单例中。由于显而易见的原因,必要的 try/catch 语法已被省略。

        如果您更愿意使用 Python 编写代码,则可以使用 Boto。

        查看 BucketExplorer 后,“Downloading the whole bucket”可能会为所欲为。

        【讨论】:

        • 除非您需要 Java 解决方案,否则请使用上面的 aws cli 答案。
        • 新建一个文件夹等等
        【解决方案13】:

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

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

        aws s3 sync . s3://BucketName
        

        用于在本地下载整个 s3 存储桶

        aws s3 sync s3://BucketName . 
        

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

        【讨论】:

          【解决方案14】:

          您可以使用https://github.com/minio/mc 做到这一点:

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

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

          【讨论】:

            【解决方案15】:

            如果您只想从 AWS 下载存储桶,请先在您的机器上安装 AWS CLI。在终端中将目录更改为您要下载文件的位置并运行此命令。

            aws s3 sync s3://bucket-name .
            

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

            aws s3 sync . s3://bucket-name
            

            【讨论】:

              【解决方案16】:

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

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

              【讨论】:

                【解决方案17】:

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

                1. InstallAWS CLI。

                2. ConfigureAWS CLI 用于使用默认安全凭证和默认 AWS 区域。

                3. 要下载整个 S3 存储桶,请使用命令

                  aws s3 sync s3://yourbucketname localpath

                针对不同 AWS 服务使用 AWS cli 的参考:https://docs.aws.amazon.com/cli/latest/reference/

                【讨论】:

                  【解决方案18】:

                  如果您将 Firefox 与 S3Fox 一起使用,则可以选择所有文件(shift-select first 和 last)并右键单击并下载所有文件。

                  我已经完成了 500 多个文件,没有任何问题。

                  【讨论】:

                  • 这不适用于存储桶中的子文件夹,即使“伪文件夹”是在 AWS 控制台中创建的。 (截至撰写此评论时)
                  • 确认不工作,我有大约 12k 顶级密钥 = 子文件夹),S3Fox 甚至没有启动。还要坚持列出所有桶的权限!
                  【解决方案19】:

                  在 Windows 中,我首选的 GUI 工具是 CloudBerry Explorer Freeware for Amazon S3。它有一个相当精致的文件浏览器和类似 FTP 的界面。

                  【讨论】:

                    【解决方案20】:

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

                    【讨论】:

                      【解决方案21】:

                      试试这个命令:

                      aws s3 sync yourBucketnameDirectory yourLocalDirectory

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

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

                      有关 awscli 的更多信息,请查看这里 aws cli installation

                      【讨论】:

                      • 这件艺术品!这个答案链接,我马上收藏了。谢谢!
                      【解决方案22】:
                      1. Windows 用户需要从此链接下载 S3EXPLORER,该链接也有安装说明:- http://s3browser.com/download.aspx

                      2. 然后为您提供AWS凭证,如secretkey,accesskey和区域给s3explorer,此链接包含s3explorer的配置说明:在浏览器中复制粘贴链接:s3browser.com/s3browser-first-run.aspx

                      3. 现在您的所有 s3 存储桶都将显示在 s3explorer 的左侧面板上。

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

                      Bucket Selection Screen

                      1. 然后浏览文件夹下载特定位置的bucket

                      2. 单击“确定”即可开始下载。

                      【讨论】:

                        【解决方案23】:

                        aws 同步是完美的解决方案。它没有两种方式..它是从源到目的地的一种方式。此外,如果您的存储桶中有很多项目,最好先创建 s3 端点,以便下载速度更快(因为下载不是通过 Internet 而是通过 Intranet 进行的)并且不收取任何费用

                        【讨论】:

                          【解决方案24】:

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

                          aws s3 presign s3://<your_bucket_name/>
                          

                          这将为您提供临时公共 URL,您可以使用该 URL 使用 presign_url 从 S3 下载内容,在您的情况下使用 wget 或任何其他下载客户端。

                          【讨论】:

                            【解决方案25】:

                            你只需要传递 --recursive & --include "*"

                            aws --region "${BUCKET_REGION}" s3 cp s3://${BUCKET}${BUCKET_PATH}/ ${LOCAL_PATH}/tmp --recursive --include "*" 2&gt;&amp;1

                            【讨论】:

                              【解决方案26】:

                              最好使用 awscli 将文件下载/上传到 s3。同步将帮助您轻松恢复。

                              aws s3 sync s3://bucketname/ .
                              

                              【讨论】:

                              • 这个答案有什么新的?
                              【解决方案27】:

                              除了对aws s3 sync 的建议,我还建议查看s5cmd (https://github.com/peak/s5cmd)。

                              根据我的经验,对于多次下载或大量下载,我发现这比 AWS CLI 快得多。

                              s5cmd 支持通配符,所以这样的东西可以工作:

                              s5cmd cp s3://bucket-name/* ./folder

                              【讨论】:

                              • s5cmd 使用 golang 比 awscli joshua-robinson.medium.com/… 快 10 倍
                              • 是的,我不完全理解 AWS CLI 中的限制因素,或者为什么 Golang 比 Python 快得多(Python GIL 可能限制多线程?)
                              【解决方案28】:

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

                                  //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());
                              }
                              

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

                              //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.");
                              }
                              

                              }

                              【讨论】:

                                【解决方案29】:

                                您可以通过s3cmd 命令简单地获取它:

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

                                【讨论】:

                                  【解决方案30】:

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

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

                                  aws configure
                                  

                                  并使用以下命令将您的 AWS S3 存储桶同步到您的本地计算机。 (本地机器应该安装了 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> 
                                  

                                  【讨论】:

                                  • 例如3,我可以将一个Bucket文件夹指向另一个bucket文件夹吗?实际上,我想将一个存储桶文件夹同步到另一个存储桶文件夹。
                                  • @lukai 是的。这就是我在示例 3 中给出的内容。您只需要拥有源和目标的 s3 存储桶 URI
                                  猜你喜欢
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2017-05-05
                                  • 1970-01-01
                                  • 2019-02-16
                                  • 2017-02-16
                                  • 2013-10-15
                                  相关资源
                                  最近更新 更多