从 S3 下载目录适用于 Java SDK 但不适用于 AWS CLI
Downloading a directory from S3 works with Java SDK but not AWS CLI
背景
我需要使用 AWS 命令行界面从 s3 下载目录。每当我尝试使用 CLI 下载文件时,都会收到拒绝访问错误。但是使用 Java SDK 可以很好地下载。我无法查看与密钥关联的权限,因此我必须将其作为黑框进行故障排除。我在下面包含了代码示例
AWS CLI
我在 PowerShell 中使用以下命令通过 AWS CLI 下载文件
aws s3 cp s3://ec-sis-integration-test/fiscal/ .\
此命令抛出以下错误
download failed: s3://ec-sis-integration-test/fiscal/ to ./ [WinError 5] Access is denied: 'C:\users\cmaggiul\Desktop\'
Java SDK
为了解决这个问题,我创建了一个示例 Java 应用程序,它尝试从 s3 下载目录。代码包含在下面
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
TransferManager transferManager = TransferManagerBuilder.standard().withS3Client(s3Client).build();
File desktop = new File(System.getProperty("user.home"), "/Desktop");
MultipleFileDownload download = transferManager.downloadDirectory(bucket, directory, desktop);
download.waitForCompletion();
此代码使用示例成功下载目录 AWS_PROFILE
故障排除步骤
我尝试了以下解决方案
- 试图下载空目录和非空目录
- 尝试将
--recursive
标志添加到 CLI 命令
- 尝试更改目录中文件的 ACL(当我尝试下载非空目录时)
- 试图用我用来下载的 AWS_PROFIlE 和不同的 AWS_PROFILE
创建目录
- 我设置了一个 docker 映像,下载并安装了 aws cli 并设置了环境变量。然后我运行
sudo aws s3 cp s3://ec-sis-integration-test/fiscal/ ./
并收到以下错误
download failed: s3://ec-sis-integration-test/fiscal/ to ./ [Errno 39] Directory not empty: '/root/aws-test/.9AA88F60' -> '/root/aws-test/'
但如果我尝试下载特定文件,效果很好
aws s3 cp s3://ec-sis-integration-test/fiscal/collections/COLL_20201228_1-EXP ./
如果我下载特定文件,它在 PowerShell 中也能正常工作
问题
为什么我可以使用 AWS_PROFILE 使用 Java SDK 而不是 CLI 下载文件?
[WinError 5] Access is denied: 'C:\users\cmaggiul\Desktop\
这与 AWS 无关。您的脚本没有写入该目录的权限。
背景
我需要使用 AWS 命令行界面从 s3 下载目录。每当我尝试使用 CLI 下载文件时,都会收到拒绝访问错误。但是使用 Java SDK 可以很好地下载。我无法查看与密钥关联的权限,因此我必须将其作为黑框进行故障排除。我在下面包含了代码示例
AWS CLI
我在 PowerShell 中使用以下命令通过 AWS CLI 下载文件
aws s3 cp s3://ec-sis-integration-test/fiscal/ .\
此命令抛出以下错误
download failed: s3://ec-sis-integration-test/fiscal/ to ./ [WinError 5] Access is denied: 'C:\users\cmaggiul\Desktop\'
Java SDK
为了解决这个问题,我创建了一个示例 Java 应用程序,它尝试从 s3 下载目录。代码包含在下面
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
TransferManager transferManager = TransferManagerBuilder.standard().withS3Client(s3Client).build();
File desktop = new File(System.getProperty("user.home"), "/Desktop");
MultipleFileDownload download = transferManager.downloadDirectory(bucket, directory, desktop);
download.waitForCompletion();
此代码使用示例成功下载目录 AWS_PROFILE
故障排除步骤
我尝试了以下解决方案
- 试图下载空目录和非空目录
- 尝试将
--recursive
标志添加到 CLI 命令 - 尝试更改目录中文件的 ACL(当我尝试下载非空目录时)
- 试图用我用来下载的 AWS_PROFIlE 和不同的 AWS_PROFILE 创建目录
- 我设置了一个 docker 映像,下载并安装了 aws cli 并设置了环境变量。然后我运行
sudo aws s3 cp s3://ec-sis-integration-test/fiscal/ ./
并收到以下错误
download failed: s3://ec-sis-integration-test/fiscal/ to ./ [Errno 39] Directory not empty: '/root/aws-test/.9AA88F60' -> '/root/aws-test/'
但如果我尝试下载特定文件,效果很好
aws s3 cp s3://ec-sis-integration-test/fiscal/collections/COLL_20201228_1-EXP ./
如果我下载特定文件,它在 PowerShell 中也能正常工作
问题
为什么我可以使用 AWS_PROFILE 使用 Java SDK 而不是 CLI 下载文件?
[WinError 5] Access is denied: 'C:\users\cmaggiul\Desktop\
这与 AWS 无关。您的脚本没有写入该目录的权限。