【问题标题】:AWS Amazon S3 Java SDK - Refresh credentials / token when expired while uploading large fileAWS Amazon S3 Java SDK - 在上传大文件时刷新凭证/令牌
【发布时间】:2018-08-13 17:04:25
【问题描述】:

我正在尝试将一个大文件上传到使用令牌的服务器,并且令牌在 10 分钟后过期,所以如果我上传一个小文件,它会起作用,因此如果文件大,我会遇到一些问题并且将在访问被拒绝时一直尝试上传

所以我需要刷新 BasicAWSCredentials 中的令牌,而不是用于 AWSStaticCredentialsProvider 因此我不确定我该怎么做,请帮助 =)

值得一提的是,我们使用本地服务器(不是亚马逊云)来提供令牌,并且为了方便我们使用亚马逊的代码。

这是我的代码:

public void uploadMultipart(File file) throws Exception {
    //this method will give you a initial token for a given user, 
    //than calculates when a new token is needed and will refresh it just when necessary

    String token = getUsetToken();
    String existingBucketName = myTenant.toLowerCase() + ".package.upload";
    String endPoint = urlAPI + "s3/buckets/";
    String strSize = FileUtils.byteCountToDisplaySize(FileUtils.sizeOf(file));
    System.out.println("File size: " + strSize);

    AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(endPoint, null);//note: Region has to be null
    //AWSCredentialsProvider        
    BasicAWSCredentials sessionCredentials = new BasicAWSCredentials(token, "NOT_USED");//secretKey should be set to NOT_USED

    AmazonS3 s3 = AmazonS3ClientBuilder
            .standard()
            .withCredentials(new AWSStaticCredentialsProvider(sessionCredentials))
            .withEndpointConfiguration(endpointConfiguration)
            .enablePathStyleAccess()
            .build();

    int maxUploadThreads = 5;
    TransferManager tm = TransferManagerBuilder
            .standard()
            .withS3Client(s3)
            .withMultipartUploadThreshold((long) (5 * 1024 * 1024))
            .withExecutorFactory(() -> Executors.newFixedThreadPool(maxUploadThreads))
            .build();

    PutObjectRequest request = new PutObjectRequest(existingBucketName, file.getName(), file);
    //request.putCustomRequestHeader("Access-Token", token);
    ProgressListener progressListener = progressEvent -> System.out.println("Transferred bytes: " + progressEvent.getBytesTransferred());
    request.setGeneralProgressListener(progressListener);
    Upload upload = tm.upload(request);

    LocalDateTime uploadStartedAt = LocalDateTime.now();
    log.info("Starting upload at: " + uploadStartedAt);

    try {
        upload.waitForCompletion();
        //upload.waitForUploadResult();
        log.info("Upload completed. " + strSize);

    } catch (Exception e) {//AmazonClientException
        log.error("Error occurred while uploading file - " + strSize);
        e.printStackTrace();
    }
}

【问题讨论】:

  • 值得一读:thoughtworks.com/mingle/infrastructure/2015/06/15/…。尝试获取更长久的凭据。
  • @jarmod - 谢谢你的回复,很棒的帖子,这可能是一个选择,因此这篇文章大约有 3 年的历史了,我仍然希望使用 aws java sdk 可能有另一种解决方法跨度>
  • @jarmod 找到了解决办法请看一下,谢谢回复

标签: java amazon-web-services amazon-s3 aws-sdk aws-sdk-java-2.0


【解决方案1】:

找到解决方案!

我找到了一种让它工作的方法,老实说,我对结果感到非常满意,我已经用大文件 (50gd.zip) 进行了很多测试,并且在每种情况下都运行良好

我的解决方案是,删除该行: BasicAWSCredentials sessionCredentials = new BasicAWSCredentials(token, "NOT_USED");

AWSCredentials 是一个接口,所以我们可以用一些动态的东西来覆盖它,当 token 过期并且需要一个新的新令牌时的逻辑保存在 getToken() 方法意味着您可以每次调用都不会造成伤害

AWSCredentials sessionCredentials = new AWSCredentials() {
    @Override
    public String getAWSAccessKeyId() {
        try {
            return getToken(); //getToken() method return a string 
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public String getAWSSecretKey() {
        return "NOT_USED";
    }
};

【讨论】:

  • 我怀疑您不小心恢复使用一组不同的凭据,特别是长期使用的凭据,例如在您的环境中配置的 IAN 用户,这就是它现在正常工作的原因。
  • 我将试一试,因为它看起来完全符合我需要的更新,类似于在网页上使用滚动到期令牌。如果它不起作用,我将直接与 AWS 合作,看看他们是否可以修复它。
  • @justdan23 对我来说是有效的,事实上代码仍然每天运行到今天并且没有问题,我希望这对你也有用,一切顺利
【解决方案2】:

上传文件(或多部分文件的一部分)时,您使用的凭据必须持续足够长的时间才能完成上传。您无法刷新凭证,因为没有方法可以更新 AWS S3,您正在为已签名的请求使用新凭证。

您可以将上传文件分成更小的文件,以便更快地上传。然后只上传 X 部分。刷新您的凭据并上传 Y 部分。重复直到上传所有部分。然后你需要通过组合部件来完成(这是一个单独的命令)。这不是一个完美的解决方案,因为无法准确控制传输速度,这意味着您必须编写自己的上传代码(这并不难)。

【讨论】:

  • 嗨 @John Hanley 非常感谢您的帖子,我找到了一种方法来完成这项工作
猜你喜欢
  • 2014-05-07
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2019-01-12
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多