我注意到似乎没有s3
从 AWS 管理控制台下载整个存储桶的选项。
有没有一种简单的方法可以抓住我的一个桶中的所有东西?我正在考虑将根文件夹公开,wget
用于全部抓取,然后再次将其设为私有,但我不知道是否有更简单的方法。
我注意到似乎没有s3
从 AWS 管理控制台下载整个存储桶的选项。
有没有一种简单的方法可以抓住我的一个桶中的所有东西?我正在考虑将根文件夹公开,wget
用于全部抓取,然后再次将其设为私有,但我不知道是否有更简单的方法。
有关更多信息,请参阅“ 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.txt
download: s3://mybucket/test2.txt to test2.txt
这将使用单向同步下载您的所有文件。除非您指定 ,否则它不会删除当前目录中的任何现有文件,也不会更改或删除 S3 上的任何文件。 --delete
您还可以执行 S3 存储桶到 S3 存储桶,或本地到 S3 存储桶同步。
查看文档和其他示例。
而上面的例子是如何下载一个完整的桶,你也可以通过执行递归下载一个文件夹
aws s3 cp s3://BUCKETNAME/PATH/TO/FOLDER LocalFolderName --recursive
这将指示 CLI在存储桶内的PATH/TO/FOLDER
目录中递归下载所有文件和文件夹密钥。BUCKETNAME
我使用了几种不同的方法将 Amazon S3 数据复制到本地机器,包括s3cmd
,到目前为止最简单的是Cyberduck。
您需要做的就是输入您的亚马逊凭证并使用简单的界面下载、上传、同步您的任何存储桶、文件夹或文件。
您有很多选择可以做到这一点,但最好的选择是使用 AWS CLI。
这是一个演练:
在您的机器上下载并安装 AWS CLI:
配置 AWS CLI:
确保输入您在创建帐户时收到的有效访问和密钥。
使用以下命令同步 S3 存储桶:
aws s3 sync s3://yourbucket /local/path
在上述命令中,替换以下字段:
yourbucket
>> 您要下载的 S3 存储桶。/local/path
>> 本地系统中要下载所有文件的路径。使用 AWS S3 CLI 下载:
aws s3 cp s3://WholeBucket LocalFolder --recursive
aws s3 cp s3://Bucket/Folder LocalFolder --recursive
要使用代码下载,请使用 AWS 开发工具包。
要使用 GUI 下载,请使用 Cyberduck。
@Layke 的回答很好,但是如果您有大量数据并且不想永远等待,您应该阅读“ AWS CLI S3 配置”。
以下命令将告诉 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
在具有 CPU 4 核和 16GB RAM 的系统上,对于像我这样的情况(3-50GB 文件),同步/复制速度从大约 9.5MiB/s 提高到 700+MiB/s,速度比默认配置提高了 70 倍。
如果您使用 Visual Studio,请下载“ AWS Toolkit for Visual Studio ”。
安装后,进入 Visual Studio - AWS Explorer - S3 - 你的存储桶 - 双击
在窗口中,您将能够选择所有文件。右键单击并下载文件。
对于 Windows,S3 浏览器是我发现的最简单的方法。它是一款优秀的软件,并且可以免费用于非商业用途。
将此命令与AWS CLI一起使用:
aws s3 cp s3://bucketname . --recursive
100% 对我有用,我已经从 aws s3 backet 下载了所有文件。
安装 aws cli(并选择您的操作系统,按照步骤操作) https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html
检查 aws 版本:aws --version
运行配置命令:aws configure
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
另一个可以帮助某些 OS X 用户的选项是 Transmit。
它是一个 FTP 程序,还可以让您连接到您的 S3 文件。而且,它可以选择将任何 FTP 或 S3 存储挂载为 Finder 中的文件夹,但仅限于有限的时间。
我已经为 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 后,“下载整个存储桶”可能会满足您的需求。
AWS sdk API 只会将整个文件夹和 repo 上传到 s3 并将整个 s3 存储桶下载到本地的最佳选择。
用于将整个文件夹上传到 s3
aws s3 sync . s3://BucketName
用于在本地下载整个 s3 存储桶
aws s3 sync s3://BucketName .
您还可以为 s3 中的特定文件夹分配路径,如 BucketName/Path 以进行下载
您可以使用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 版下发布。
如果您只想从 AWS 下载存储桶,请先在您的机器上安装 AWS CLI。在终端中将目录更改为要下载文件的位置并运行此命令。
aws s3 sync s3://bucket-name .
如果您还想同步本地和 s3 目录(如果您在本地文件夹中添加了一些文件),请运行以下命令:
aws s3 sync . s3://bucket-name
如果您将 Firefox 与 S3Fox 一起使用,那么您可以选择所有文件(shift-select first 和 last)并右键单击并下载所有文件。
我已经完成了 500 多个文件,没有任何问题。
要添加另一个 GUI 选项,我们使用WinSCP 的 S3 功能。它非常容易连接,只需要在 UI 中使用您的访问密钥和密钥。然后,您可以从任何可访问的存储桶中浏览和下载所需的任何文件,包括嵌套文件夹的递归下载。
由于通过安全性清除新软件可能是一项挑战,而且 WinSCP 相当普遍,因此仅使用它而不是尝试安装更专业的实用程序会非常有益。
AWS CLI 是在本地下载整个 S3 存储桶的最佳选择。
将 AWS cli 用于不同 AWS 服务的参考:https ://docs.aws.amazon.com/cli/latest/reference/
在 Windows 中,我首选的 GUI 工具是CloudBerry Explorer Freeware for Amazon S3。它有一个相当精致的文件浏览器和类似 FTP 的界面。
如果那里只有文件(没有子目录),一个快速的解决方案是选择所有文件(click
第一个文件,Shift+click
最后一个文件)并点击Enter
或right click
并选择Open
。对于大多数数据文件,这会将它们直接下载到您的计算机上。
试试这个命令:
aws s3 sync yourBucketnameDirectory yourLocalDirectory
例如,如果您的存储桶名称为myBucket
,本地目录为c:\local
,则:
aws s3 sync s3://myBucket c:\local
有关 awscli 的更多信息,请查看此 aws cli 安装
Windows 用户需要从此链接下载 S3EXPLORER,该链接也有安装说明:- http://s3browser.com/download.aspx
然后向您提供 AWS 凭证,如 s3explorer 的密钥、访问密钥和区域,此链接包含 s3explorer 的配置说明:在浏览器中复制粘贴链接:s3browser.com/s3browser-first-run.aspx
现在您的所有 s3 存储桶将在 s3explorer 的左侧面板上可见。
只需选择存储桶,然后单击左上角的存储桶菜单,然后从菜单中选择将所有文件下载到选项。以下是相同的屏幕截图:
然后浏览文件夹以下载特定位置的存储桶
单击确定,您的下载将开始。
aws sync 是完美的解决方案。它没有两种方式..它是从源到目的地的一种方式。此外,如果您的存储桶中有很多项目,最好先创建 s3 端点,以便下载速度更快(因为下载不是通过 Internet 而是通过 Intranet)并且不收费
正如@layke 所说,从 S3 cli 下载文件是安全可靠的最佳做法。但是在某些情况下,人们需要使用 wget 来下载文件,这里是解决方案
aws s3 presign s3://<your_bucket_name/>
这将为您提供临时公共 URL,您可以使用它使用 presign_url 从 S3 下载内容,在您的情况下使用 wget 或任何其他下载客户端。
你只需要通过 --recursive & --include "*"
aws --region "${BUCKET_REGION}" s3 cp s3://${BUCKET}${BUCKET_PATH}/ ${LOCAL_PATH}/tmp --recursive --include "*" 2>&1
使用 awscli 将文件下载/上传到 s3 总是更好。同步将帮助您轻松恢复。
aws s3 sync s3://bucketname/ .
除了对 的建议之外aws s3 sync
,我还建议您查看s5cmd
(https://github.com/peak/s5cmd)。
根据我的经验,我发现对于多次下载或大量下载,这比 AWS CLI 快得多。
s5cmd
支持通配符,所以这样的东西可以工作:
s5cmd cp s3://bucket-name/* ./folder
这里有一些东西可以下载所有存储桶,列出它们,列出它们的内容。
//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.");
}
}
您可以使用s3cmd命令简单地获取它:
s3cmd get --recursive --continue s3://test-bucket local-directory/
正如 Neel Bhaat 在此博客中所解释的,有许多不同的工具可用于此目的。有些是 AWS 提供的,其中大多数是第三方工具。所有这些工具都要求您将 AWS 账户密钥和秘密保存在工具本身中。使用第三方工具时要非常谨慎,因为您保存的凭据可能会花费您的全部价值并让您丧命。
因此,我始终建议为此目的使用AWS CLI 。您可以从这个链接简单地安装它。接下来,运行以下命令并将您的密钥、秘密值保存在 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>
如果存储桶很大,则有一个名为的命令s4cmd
可以进行并行连接并提高下载时间:
在Debian上安装它
apt install s4cmd
如果你有点子:
pip install s4cmd
如果存在,它将读取~/.s3cfg
文件(如果不安装s3cmd
并运行s3cmd --configure
),或者您可以--access-key=ACCESS_KEY --secret-key=SECRET_KEY
在命令中指定。
cli 类似于s3cmd
. 在您的情况下sync
,建议您使用 a,因为您可以取消下载并重新开始下载,而无需重新下载文件。
s4cmd [--access-key=ACCESS_KEY --secret-key=SECRET_KEY] sync s3://<your-bucket> /some/local/dir
如果您下载大量数据 (>1TB),请小心,这可能会影响您的账单,请先计算成本
以下是复制整个存储桶所需执行的操作的摘要:
关注这篇官方文章:https ://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html 不要忘记:
请参阅允许对其进行配置的链接:https ://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html
您可以使用以下命令来添加您在创建用户时获得的密钥:
$ aws configure
AWS Access Key ID [None]: <your_access_key>
AWS Secret Access Key [None]: <your_secret_key>
Default region name [None]: us-west-2
Default output format [None]: json
您可以递归cp
命令,但aws sync
命令是 f:
aws s3 sync s3://your_bucket /local/path
--dryrun
选项。max_concurrent_requests
和max_queue_size
属性。请参阅:http ://docs.aws.amazon.com/cli/latest/topic/s3-config.html--exclude
您可以使用和--include
选项排除/包含一些文件。请参阅:https ://docs.aws.amazon.com/cli/latest/reference/s3/例如,以下命令将显示.png
存储桶中存在的所有文件。重播命令而不--dryrun
下载生成的文件。
aws s3 sync s3://your_bucket /local/path --recursive --exclude "*" --include "*.png" --dryrun
您可以使用此 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)
--no-verify-ssl(布尔值)
默认情况下,AWS CLI 在与 AWS 服务通信时使用 SSL。对于每个 SSL 连接,AWS CLI 将验证 SSL 证书。此选项会覆盖验证 SSL 证书的默认行为。 参考
将此标签与命令--no-verify-ssl一起使用
aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl
使用 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)