如何在 AWS Java SDK v2 Apache 客户端上设置代理

use*_*545 6 java amazon-s3 amazon-web-services

看起来没有关于如何做到这一点的好来源,我找到的信息的两个地方如下:

第一个链接。这看起来是最新的版本。但是,software.amazon.awssdk.http.apache.ApacheHttpClient即使我有依赖项,我也无法在我的项目中找到任何地方。

 <groupId>software.amazon.awssdk</groupId>
  <artifactId>aws-sdk-java</artifactId>
  <version>2.3.2</version>
</dependency>
<dependency>
    <artifactId>aws-http-client-apache</artifactId>
    <groupId>software.amazon.awssdk</groupId>
    <version>2.0.0-preview-1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

第二个链接看起来要提供关于如何配置客户端版本已过时。示例中的以下代码看起来无效:

DynamoDBClient client =
        DynamoDBClient.builder()
                      .httpConfiguration(ClientHttpConfiguration.builder()
                                                                .httpClientFactory(apacheClientFactory)
                                                                .build())
                      .build();
Run Code Online (Sandbox Code Playgroud)

ClientHttpConfiguration 不可用且 httpConfiguration 方法在客户端上不可用。

试图一起破解一些东西给了我以下代码:

ProxyConfiguration proxyConfiguration = ProxyConfiguration.builder().endpoint(URI.create("host:port")).username("usr").password("pwd").build();

SdkHttpClient apacheClientFactory =
        ApacheSdkHttpClientFactory.builder()
                .socketTimeout(Duration.ofSeconds(10))
                .connectionTimeout(Duration.ofMillis(750))
                .proxyConfiguration(proxyConfiguration).build().createHttpClient();


this.s3client = S3Client.builder().httpClient(apacheClientFactory).build();
Run Code Online (Sandbox Code Playgroud)

这可以编译,但我遇到了很多java.lang.ClassNotFoundException: software.amazon.awssdk.http.ExecutableHttpRequest异常,我不明白它们来自哪里或如何修复。

所以我的问题是2.3.2为 AWS Java SDK v2 版本设置代理的正确方法是什么 ,为什么我的实现不起作用?

更新

当我添加以下依赖项时,我收到另一个错误:

<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>apache-client</artifactId>
  <version>2.3.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

错误:

Caused by: java.lang.ClassNotFoundException: software.amazon.awssdk.http.SdkHttpClient$Builder
Run Code Online (Sandbox Code Playgroud)

小智 7

要从代理防火墙后面的本地系统针对 dynamoDB 运行 Junit 测试,请使用以下代码片段。我使用了 java 8、aws sdk 2x、dynamodb 2.15.x、Maven 4.x 和 IntelliJ 2020.3。

 private DynamoDbClient createDynamoDbClient() {
    SdkHttpClient apacheClient = ApacheHttpClient.builder()
      .socketTimeout(Duration.ofSeconds(20))
      .connectionTimeout(Duration.ofSeconds(5))
      .proxyConfiguration(ProxyConfiguration.builder()
        .useSystemPropertyValues(false)
        .endpoint(URI.create("http://<proxyip>:<port>"))
        .username("<userId>")
        .password("<pwd>")
        .build())
      .build();

    DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
      .region(Region.US_EAST_1)      
      .httpClient(apacheClient)
      .credentialsProvider(ProfileCredentialsProvider.builder()
        .profileName("default")
        .build())
      .build();

    return dynamoDbClient;
  }
Run Code Online (Sandbox Code Playgroud)


Rya*_*ugh 6

您似乎引入了适用于 Java 的 AWS 开发工具包的多个版本。尝试使用“物料清单使用进口范围,像这样” BOM方法:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>bom</artifactId>
      <version>2.5.60</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)

定义好之后,带上你想要的特定部分:

<dependencies>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>iam</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>apache-client</artifactId>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

您无需指定版本,因为 BOM 涵盖了这些版本。正确设置依赖项后,您可以执行以下操作:

  final SdkHttpClient httpClient = ApacheHttpClient.builder()
            .proxyConfiguration(ProxyConfiguration.builder()
                    .useSystemPropertyValues(true)
                    .build())
            .build();
  this.s3client = S3Client.builder().httpClient(httpClient).build();
Run Code Online (Sandbox Code Playgroud)

我正在使用 useSystemPropertyValues 以便为了方便起见,它会选择标准系统属性来设置代理值。所有这些都对我们有用,并且代理被正确使用。