AWS错误从S3下载对象,"配置文件不能为空"

时间:2017-01-22 21:27:47

标签: java amazon-web-services amazon-s3 amazon-ec2

我已经看过this,但没有答案可以解释我的问题。我首先使用了提供here(GetObject类)的示例,它立即在我的桌面上运行。但是,我的朋友无法让它在他的机器上工作,也不能在我们的EC2实例上工作。

有人提到指定了凭证文件,这是有道理的,但我从来没有这样做,我很确定默认权限设置为允许访问此存储桶。

这是堆栈跟踪:

Exception in thread "main" java.lang.IllegalArgumentException: profile file cannot be null
    at com.amazonaws.util.ValidationUtils.assertNotNull(ValidationUtils.java:37)
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:142)
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:133)
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:100)
    at com.amazonaws.auth.profile.ProfileCredentialsProvider.getCredentials(ProfileCredentialsProvider.java:135)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.java:1029)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1049)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:949)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:662)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:636)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:619)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$300(AmazonHttpClient.java:587)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:574)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:446)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4035)
    at com.amazonaws.services.s3.AmazonS3Client.getBucketRegionViaHeadRequest(AmazonS3Client.java:4474)
    at com.amazonaws.services.s3.AmazonS3Client.fetchRegionFromCache(AmazonS3Client.java:4448)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4020)
    at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1307)
    at GetObject.main(GetObject.java:26)

我可以保证GetObjectRequest中的bucketName和key params都不为null。这里的差异是什么?为什么它只能在我的电脑上成功?这完全与我不得不补充aws-sdk jar应该已经拥有的许多罐子这一事实有关(jackson-databind,jackson-core,jackson-annotations,httpclient,httpcore,commons-logging和joda-时间)?它看起来很相似,但在其他方面无法解释的错误(给出非空的参数,aws-sdk中的某些东西说它是空的)。

5 个答案:

答案 0 :(得分:32)

看起来你在评论中解决了这个问题,但我对此感到厌烦,并希望为未来的读者留下更明确的答案。要非常明确,此处的问题与S3 中的文件无关。此错误消息 nothing 与您的硬盘驱动器上的文件以及您尝试从S3推送/拉出的文件有关。问题是你用以下内容初始化S3:

AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider());

当您这样做时,它会在〜/ .aws / credentials中查找配置文件列表。这可能在您的计算机上运行良好,但在您通过IAM角色(例如Lambda,Docker,EC2实例等)获得AWS访问权限的任何地方都无法工作。修复方法是初始化AmazonS3Client,如:

AmazonS3 s3Client = new AmazonS3Client();

如果您正在使用需要某种凭据提供程序的代码,您还可以执行以下操作:

AmazonS3 s3Client = new AmazonS3Client(DefaultAWSCredentialsProviderChain.getInstance());

希望这有助于下一个人。就我而言,我使用的是DynamoDB和SQS,但我遇到了同样的错误。我最初忽略了这个问题,因为我认为你的问题与S3有关并且非常困惑。手腕打了一下。

答案 1 :(得分:4)

Ryan投票最多的答案使我走上了正确的轨道,但是由于AmazonS3Client现在已弃用,此代码已为我解决了问题

    AmazonS3 s3 = AmazonS3ClientBuilder.standard()
                  .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                  .build();

在Lambda中,该代码似乎可以正确承担起活跃的IAM角色。

答案 2 :(得分:2)

原因是您朋友的计算机没有“凭据”文件。

要解决此问题,请创建文件:

C:\Users\USERNAME \.aws\credentials"

for Windows,或创建文件:

~/.aws/credentials

适用于macOS,Linux或Unix。然后写

aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key"

进入文件。

或者,您也可以设置aws_access_key_idaws_secret_access_key的环境变量。

答案 3 :(得分:0)

我已使用以下代码为我工作,希望对您有所帮助

       BasicAWSCredentials credentials = new BasicAWSCredentials(accesskey, secretkey);

            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new AWSStaticCredentialsProvider(credentials))
                    .withRegion("ap-south-1")
                    .build();   

答案 4 :(得分:0)

BasicAWSCredentials可能需要全部三个组成部分;

BasicAWSCredentials credentials = new BasicAWSCredentials(accesskey, secretkey, accessToken);

还请考虑凭据是否来自您的 .aws 文件夹,或者您是否正在使用BasicCredentials行提供上述凭据。