下载整个S3存储桶?

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

有没有一种简单的方法来获取我的一个存储桶中的所有内容?我在考虑将根文件夹设为公共文件夹,使用wget来获取所有内容,然后再次将其设为私有,但我不知道是否有更简单的方法。

723471 次浏览

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

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

首先,从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之后,“下载整个存储桶”可以做你想做的事情。

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

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

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

rclone sync /home/local/directory remote:bucket

如果您将Firefox与S3Fox一起使用,这确实可以让您选择所有文件(Shift-选择第一个和最后一个)并右键单击并下载所有文件。

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

我使用了几种不同的方法将Amazon S3数据复制到本地机器,包括s3cmd,到目前为止最简单的方法是赛博鸭

您只需输入您的Amazon凭据,并使用简单的界面下载、上传、同步您的任何存储桶、文件夹或文件。

截图

对于Windows,s3浏览器是我找到的最简单的方法。它是优秀的软件,并且可以免费用于非商业用途。

AWS CLI

有关更多信息,请参阅“AWS CLI命令参考”。

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.txtdownload: s3://mybucket/test2.txt to test2.txt

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

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

看看留档及其他例子

虽然上面的示例是如何下载完整的存储桶,但您也可以通过执行递归下载文件夹

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

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

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

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

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

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

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

您可以使用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版本下发布。

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

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

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

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

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

桶选择屏幕

  1. 然后浏览文件夹以在特定位置下载存储桶

  2. 单击OK,您的下载将开始。

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

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

AWS同步是完美的解决方案。它不是双向的…它是从源到目标的单向。此外,如果您在桶中有很多项目,最好先创建s3端点,以便下载更快(因为下载不是通过互联网而是通过内部网进行的)并且不收费

要使用AWS S3 CLI下载:

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

要使用代码下载,请使用AWS SDK。

要使用GUI下载,请使用CyberDuck。

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

    //connection stringprivate 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())){//DOWNLOADtry{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 downloadpublic static void unzipBucket() throws IOException {unzip = new UnZipBuckets();unzip.unZipIt(app.getDownloadedBucket());System.out.println(CONST.getFileUnzippedMessage());}
//list all S3 bucketspublic 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 bucketpublic 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.");}

}

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

下面是一个走通:

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

  2. 配置AWS CLI:

    在此处输入图片描述

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

  3. 使用以下命令同步S3存储桶:

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

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

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

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

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

aws configure set default.s3.max_concurrent_requests 1000aws 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

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

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

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

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

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

aws configure

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

aws s3 sync <source> <destination>

示例:

1)AWS S3到本地存储

aws s3 sync <S3Uri> <LocalPath>

从本地存储到AWS S3

aws s3 sync <LocalPath> <S3Uri>

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

aws s3 sync <S3Uri> <S3Uri>

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

aws s3 sync s3://bucket-name .

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

aws s3 sync . s3://bucket-name

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

aws s3 presign s3://<your_bucket_name/>

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

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

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

aws s3 sync . s3://BucketName

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

aws s3 sync s3://BucketName .

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

试试这个命令:

aws s3 sync yourBucketnameDirectory yourLocalDirectory

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

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

有关awscli的更多信息,请查看此aws cli安装

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

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

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

  1. 安装AWS CLI。

  2. 配置AWS CLI以使用默认安全凭据和默认AWS区域。

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

    aws s3 sync s3://你的桶名本地路径

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

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

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

如果你看到这样的错误

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

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

将此标记与命令一起使用

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

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

将其安装在Debian上,如

apt install s4cmd

如果你有pip:

pip install s4cmd

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

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

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

如果您下载了大量数据(>1TB),请小心,这可能会影响您的账单,首先计算成本

你只需要传递--递归&--包括"*"

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

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

aws s3 sync s3://bucketname/ .

100%为我工作,我已经从aws s3 backet下载了所有文件。

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

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

在此处输入图片描述

  1. 运行config命令:aws configure

在此处输入图片描述

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

例如(WindowsOS):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

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

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

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

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

以下是复制整个存储桶所需执行的操作的摘要:

1.创建一个可以使用AWS s3存储桶操作的用户

关注这篇官方文章:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html别忘了:

  • 勾选“编程访问”,以便能够通过CLI与AWS打交道。
  • 为您的用户添加正确的IAM策略,以允许他与s3存储桶交互

2.下载、安装和配置AWS CLI

查看此链接允许配置它:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html

您可以使用以下命令来添加您在创建用户时获得的密钥:

$ aws configureAWS Access Key ID [None]: <your_access_key>AWS Secret Access Key [None]: <your_secret_key>Default region name [None]: us-west-2Default output format [None]: json

3.使用以下命令下载内容

您可以使用递归的cp命令,但aws sync命令是f:

aws s3 sync s3://your_bucket /local/path

例如,下面的命令将显示存储桶中呈现的所有.png文件。重放不带--dryrun的命令以下载生成的文件。

aws s3 sync s3://your_bucket /local/path --recursive --exclude "*" --include "*.png" --dryrun

使用boto3下载具有特定前缀的存储桶中的所有对象

import boto3
s3 = boto3.client('s3', region_name='us-east-1',aws_access_key_id=AWS_KEY_ID,aws_secret_access_key=AWS_SECRET)
def get_all_s3_keys(bucket,prefix):keys = []
kwargs = {'Bucket': bucket,Prefix=prefix}while True:resp = s3.list_objects_v2(**kwargs)for obj in resp['Contents']:keys.append(obj['Key'])
try:kwargs['ContinuationToken'] = resp['NextContinuationToken']except KeyError:break
return keys
def download_file(file_name, bucket,key):file=s3.download_file(Filename=file_name,Bucket=bucket,Key=key)return file
bucket="gid-folder"prefix="test_"keys=get_all_s3_keys(bucket,prefix):
for key in keys:download_file(key, bucket,key)   
 

您可以使用sync下载整个S3存储桶。例如,要在当前目录下下载名为bucket1的整个存储桶。

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

是一个很好的答案,但如果对象在储存类别Glacier Flexible Retriava中,即使文件已恢复,它也不会起作用。在这种情况下,您需要添加标志--force-glacier-Transfer。