【问题标题】:AmazonS3Client(credentials) is deprecatedAmazonS3Client(credentials) 已弃用
【发布时间】:2017-06-16 13:24:56
【问题描述】:

我正在尝试阅读 Amazon S3 上可用的文件,因为问题说明了问题。我找不到已弃用的构造函数的替代调用。

代码如下:

private String AccessKeyID = "xxxxxxxxxxxxxxxxxxxx";
private String SecretAccessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
private static String bucketName     = "documentcontainer";
private static String keyName     = "test";
//private static String uploadFileName    = "/PATH TO FILE WHICH WANT TO UPLOAD/abc.txt";

AWSCredentials credentials = new BasicAWSCredentials(AccessKeyID, SecretAccessKey);

void downloadfile() throws IOException
{

    // Problem lies here - AmazonS3Client is deprecated
    AmazonS3 s3client = new AmazonS3Client(credentials);
        try {
        System.out.println("Downloading an object...");
        S3Object s3object = s3client.getObject(new GetObjectRequest(
                bucketName, keyName));
        System.out.println("Content-Type: "  +
                s3object.getObjectMetadata().getContentType());
        InputStream input = s3object.getObjectContent();

        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        while (true) {
            String line = reader.readLine();
            if (line == null) break;

            System.out.println("    " + line);
        }
        System.out.println();
    } catch (AmazonServiceException ase) {
          //do something
    } catch (AmazonClientException ace) {
        // do something
    }
 }

有什么帮助吗?如果需要更多解释,请提及。 我检查了SDK的.zip文件中提供的示例代码,它是一样的。

【问题讨论】:

  • 您必须使用AwsClientBuilder 类作为替代。
  • @franklinsijo 代码示例或要读取的源代码?
  • 您可以将其添加为答案吗?我会用一小段代码编辑你的答案并接受它。
  • 可以在这个文件中硬编码密钥对吗?当您公开部署 Web 应用程序时,此文件会在哪里?这不是安全问题吗?

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


【解决方案1】:

您可以使用AmazonS3ClientBuilderAwsClientBuilder 作为替代品。

对于 S3,最简单的方法是使用 AmazonS3ClientBuilder,

BasicAWSCredentials creds = new BasicAWSCredentials("access_key", "secret_key"); 
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(creds)).build();

【讨论】:

  • 这种弃用背后有什么原因吗,使用 AmazonS3ClientBuilder.standard() 与新的 AmazonS3Client(来自以前的 SDK)有什么好处
  • AmazonS3ClientBuilderAwsClientBuilder 都不存在于 .Net 4.0 的最新 NuGet 包中,但包括 StoredProfileAWSCredentials(我目前正在使用)在内的各种方法都已被贬值。有人知道.Net 4.0 的推荐方法吗?
  • 当您使用 AmazonS3ClientBuilder 时,myClient.setRegion() 不再起作用。您必须使用 AmazonS3ClientBuilder.standard().withCredential().withRegion("eu-west-1").build();
  • AWSStaticCredentialsProvider 也被贬低了@franklinsijo
  • @rockstarjindal 客户端构建器在以下方面优于旧构造器。使用构建器创建的客户端是不可变的。客户端必须有明确的区域。构建器提供了更简洁的链式 API。
【解决方案2】:

使用下面列出的代码创建一个没有凭据的 S3 客户端:

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();

一个使用示例是调用 S3 的 lambda 函数。

【讨论】:

  • 谢谢,但仅在我包含 withRegion() 时才对我有用
  • 通过构建器创建的客户端必须具有明确定义(即通过调用 withRegion)或作为 DefaultAwsRegionProviderChain 的一部分定义的区域。如果构建器无法确定客户端的区域,则会引发 SdkClientException。
【解决方案3】:

你需要通过区域信息传递

com.amazonaws.regions.Region object.

Use AmazonS3Client(credentials, Region.getRegion(Regions.REPLACE_WITH_YOUR_REGION))

【讨论】:

  • 我从哪里获得区域?它的一个例子是什么?为什么它需要一个区域?
  • 请查看此链接以在 AWS stackoverflow.com/questions/4249488/…中查找区域
  • 如果我以前有这个怎么办:AmazonS3Client s3Client = new AmazonS3Client(new AnonymousAWSCredentials());?它没有区域,不是吗?
【解决方案4】:

您可以按如下方式创建 S3 默认客户端(使用 aws-java-sdk-s3-1.11.232):

AmazonS3ClientBuilder.defaultClient();

【讨论】:

  • 从哪里获取凭据?
  • 来自 AWS 文档:docs.aws.amazon.com/sdk-for-java/v1/developer-guide/… 您可以通过以下方式执行此操作: 1.使用默认凭证提供程序链(推荐)。 2.使用特定的凭证提供者或提供者链。 3.自行提供凭证。建议使用 IAM 角色。例如。对于 AWS lambda,创建一个有权访问 S3 的 IAM 角色并在 lambda 代码中创建客户端。在配置您的 lambda 时提供此角色,对于 EC2 实例或 ECS 等类似。
  • 您能再解释一下吗? "1.使用默认的凭证提供者链"
【解决方案5】:

在构造函数中仅使用 creentials 已弃用,您可以使用如下内容:

 val awsConfiguration = AWSConfiguration(context)
 val awsCreds = CognitoCachingCredentialsProvider(context, awsConfiguration)
 val s3Client = AmazonS3Client(awsCreds, Region.getRegion(Regions.EU_CENTRAL_1))

【讨论】:

    【解决方案6】:
    implementation 'com.amazonaws:aws-android-sdk-s3:2.16.12'
    
    val key = "XXX"
    val secret = "XXX"
    val credentials = BasicAWSCredentials(key, secret)
    val s3 = AmazonS3Client(
        credentials, com.amazonaws.regions.Region.getRegion(
            Regions.US_EAST_2
        )
    )
    val expires = Date(Date().time + 1000 * 60 * 60)
    
    val keyFile = "13/thumbnail_800x600_13_photo.jpeg"
    val generatePresignedUrlRequest = GeneratePresignedUrlRequest(
        "bucket_name",
        keyFile
    )
    generatePresignedUrlRequest.expiration = expires
    val url: URL = s3.generatePresignedUrl(generatePresignedUrlRequest)
    
    GlideApp.with(this)
        .load(url.toString())
        .apply(RequestOptions.centerCropTransform())
        .into(image)
    

    【讨论】:

      【解决方案7】:

      使用适用于 Java 2.x 的 AWS 开发工具包,还可以像这样构建自己的 credentialProvider:

      // 凭证提供者

      package com.myproxylib.aws;
      
      import software.amazon.awssdk.auth.credentials.AwsCredentials;
      import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
      
      public class CustomCredentialsProvider implements AwsCredentialsProvider {
      
          private final String accessKeyId;
          private final String secretAccessKey;
      
          public CustomCredentialsProvider(String accessKeyId, String secretAccessKey) {
              this.secretAccessKey = secretAccessKey;
              this.accessKeyId = accessKeyId;
          }
      
          @Override
          public AwsCredentials resolveCredentials() {
              return new CustomAwsCredentialsResolver(accessKeyId, secretAccessKey);
          }
      
      }
      
      

      // 凭证解析器

      
      package com.myproxylib.aws;
      
      import software.amazon.awssdk.auth.credentials.AwsCredentials;
      
      public class CustomAwsCredentialsResolver implements AwsCredentials {
      
          private final String accessKeyId;
          private final String secretAccessKey;
      
          CustomAwsCredentialsResolver(String accessKeyId, String secretAccessKey) {
              this.secretAccessKey = secretAccessKey;
              this.accessKeyId = accessKeyId;
          }
      
          @Override
          public String accessKeyId() {
              return accessKeyId;
          }
      
          @Override
          public String secretAccessKey() {
              return secretAccessKey;
          }
      }
      
      

      // 提供者的使用情况

      
      package com.myproxylib.aws.s3;
      
      public class S3Storage implements IS3StorageCapable {
      
          private final S3Client s3Client;
      
          public S3Storage(String accessKeyId, String secretAccessKey, String region) {
      
              this.s3Client = S3Client.builder().credentialsProvider(new CustomCredentialsProvider(accessKeyId, secretAccessKey)).region(of(region)).build();
          }
      

      注意:

      1. 当然,库用户可以从他想要的任何地方获取凭据,在调用 S3 构造函数之前将其解析为 java 属性。

      2. 如果可能,支持其他答案和文档中提到的其他方法。我的用例对此很有必要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-12
        • 1970-01-01
        • 2016-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多