从S3下载目录适用于Java SDK,但不适用于AWS CLI 出身背景

从S3下载目录适用于Java SDK,但不适用于AWS CLI 出身背景,java,amazon-web-services,amazon-s3,aws-cli,Java,Amazon Web Services,Amazon S3,Aws Cli,我需要使用AWS命令行界面从s3下载一个目录。每当我尝试使用CLI下载文件时,都会出现访问被拒绝错误。但是,它可以使用JavaSDK进行良好的下载。我无法查看与密钥关联的权限,因此我必须将其作为黑盒进行故障排除。我将代码示例包括在下面 AWS CLI 我正在PowerShell中使用以下命令通过AWS CLI下载该文件 aws s3 cp s3://ec-sis-integration-test/fiscal/ .\ 此命令引发以下错误 下载失败:s3://ec sis集成测试/fiscal/

我需要使用AWS命令行界面从s3下载一个目录。每当我尝试使用CLI下载文件时,都会出现访问被拒绝错误。但是,它可以使用JavaSDK进行良好的下载。我无法查看与密钥关联的权限,因此我必须将其作为黑盒进行故障排除。我将代码示例包括在下面

AWS CLI 我正在PowerShell中使用以下命令通过AWS CLI下载该文件

aws s3 cp s3://ec-sis-integration-test/fiscal/ .\
此命令引发以下错误

下载失败:s3://ec sis集成测试/fiscal/to./[WinError 5]访问被拒绝:“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\U配置文件成功下载目录

故障排除步骤 我尝试了以下解决方案

  • 试图下载空目录和非空目录
  • 试图将
    --recursive
    标志添加到CLI命令
  • 试图更改目录中文件的ACL(当我试图下载非空目录时)
  • 尝试使用我正在下载的相同AWS_配置文件和不同的AWS_配置文件创建目录
  • 我设置了一个docker映像,下载并安装了aws cli,并设置了环境变量。然后我跑了
  • sudo aws s3 cp s3://ec sis集成测试/fiscal/

    并收到以下错误

    下载失败:s3://ec sis集成测试/fiscal/to./[Errno 39]目录不为空:'/root/aws test/.9AA88F60'->'/root/aws test/'

    但是,如果我尝试下载一个特定的文件,效果会很好

    aws s3 cp s3://ec-sis-integration-test/fiscal/collections/COLL_20201228_1-EXP ./
    
    如果我下载特定的文件,它在PowerShell中也可以正常工作

    aws s3 cp s3://ec-sis-integration-test/fiscal/collections/COLL_20201228_1-EXP ./
    
    问题 为什么我可以使用相同的AWS_配置文件使用Java SDK而不是CLI下载文件

     [WinError 5] Access is denied: 'C:\users\cmaggiul\Desktop\
    

    这与AWS无关。您的脚本没有写入该目录的权限。

    您正在做两件不同的事情。awscli调用尝试复制单个对象(其键为
    fiscal/
    )。Java SDK调用尝试下载整个文件夹(严格来说,所有键都具有给定前缀
    fiscal/
    )。要告诉awscli下载
    fiscal/
    下的所有对象,请添加
    --recursive
    。另外,我只需使用
    作为目标。@jarmod当我添加--recursive键时,我得到以下错误致命错误:调用ListObjectsV2操作时发生错误(AccessDenied):拒绝访问。我需要添加该权限吗?请相信您需要在bucket上添加
    s3:ListBucket
    。好的,让我看看是否可以添加该权限,然后重试。如果有效,我会回答,你可以写一个答案,我会接受。看起来是这样,但我真的不认为这是问题所在。我正在以管理员身份打开Powershell并手动运行它。我只是在几个不同的位置运行它来验证(在根C中,在C:\users\administrator中,等等)是否尝试旋转linux虚拟机,并检查是否存在权限问题。我打赌它确实是一些Windows FS bs,因为它使用特殊的glovesOk处理C驱动器。我将在docker映像中设置参数,然后立即尝试。请查看我的更新。它在docker容器中也不起作用。但是,它确实会在windows和linux上使用相同的目录下载特定的文件。它也不会在linux中下载该目录,尽管它会抛出不同的错误。不过,它会将特定文件下载到我在windows和linux中使用的目录中