URL 연결 기반 HTTP 클라이언트 구성 - AWS SDK for Java 2.x

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

URL 연결 기반 HTTP 클라이언트 구성

는 기본값에 비해 더 가벼운 UrlConnectionHttpClient HTTP 클라이언트를 AWS SDK for Java 2.x 제공합니다. ApacheHttpClient UrlConnectionHttpClient는 Java의 URLConnection를 기반으로 합니다.

UrlConnectionHttpClient는 Apache 기반 HTTP 클라이언트보다 로드 속도가 빠르지만 기능이 더 적습니다. 로드 속도가 더 빠르기 때문에 Java AWS Lambda 함수에 적합한 솔루션입니다.

UrlConnectionHttpClient에는 액세스할 수 있는 여러 구성 가능한 옵션이 있습니다.

참고

UrlConnectionHttpClient에서는 HTTP PATCH 메서드를 지원하지 않습니다.

일부 AWS API 작업에는 PATCH 요청이 필요합니다. 이러한 작업 이름은 일반적으로 Update*로 시작합니다. 다음은 몇 가지 예제입니다.

를 사용할 수 있는 UrlConnectionHttpClient 경우 먼저 사용 중인 API 참조를 참조하십시오. AWS 서비스 필요한 작업이 PATCH 작업을 사용하는지 확인하세요.

UrlConnectionHttpClient 액세스

UrlConnectionHttpClient를 구성하고 사용하려면 pom.xml 파일의 url-connection-client Maven 아티팩트에 대한 종속성을 선언해야 합니다.

ApacheHttpClient와 달리 UrlConnectionHttpClient는 프로젝트에 자동으로 추가되지 않으므로 사용자는 이를 구체적으로 선언해야 합니다.

pom.xml 파일의 다음 예제는 HTTP 클라이언트를 사용하고 구성하는 데 필요한 종속성을 보여줍니다.

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.17.290</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- other dependencies such as s3 or dynamodb --> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>url-connection-client</artifactId> </dependency> </dependencies>

UrlConnectionHttpClient 사용 및 구성

서비스 클라이언트 구축과 함께 UrlConnectionHttpClient의 인스턴스를 구성하거나 여러 서비스 클라이언트에서 공유하도록 단일 인스턴스를 구성할 수 있습니다.

어느 방법을 사용하든, UrlConnectionHttpClient.Builder를 사용하여 URLConnection 기반 HTTP 클라이언트의 속성을 구성합니다.

모범 사례: 서비스 클라이언트 전용 UrlConnectionHttpClient 인스턴스 지정

UrlConnectionHttpClient의 인스턴스를 구성해야 하는 경우 전용 UrlConnectionHttpClient 인스턴스를 구축하는 것이 좋습니다. 서비스 클라이언트 빌더의 httpClientBuilder 메서드를 사용하면 됩니다. 이렇게 하면 SDK에서 HTTP 클라이언트의 수명 주기를 관리하므로 더 이상 필요하지 않을 때 UrlConnectionHttpClient 인스턴스를 종료하지 않을 경우 잠재적인 메모리 누수를 방지할 수 있습니다.

다음 예제에서는 S3Client 인스턴스를 생성하고 socketTimeoutproxyConfiguration 값과 함께 UrlConnectionHttpClient의 내장 인스턴스를 구성합니다. 이 proxyConfiguration 메서드는 Consumer<ProxyConfiguration.Builder> 유형의 Java 람다 표현식을 사용합니다.

가져오기

import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient; import java.net.URI; import java.time.Duration;

코드

// Singleton: Use the s3Client for all requests. S3Client s3Client = S3Client.builder() .httpClientBuilder(UrlConnectionHttpClient.builder() .socketTimeout(Duration.ofMinutes(5)) .proxyConfiguration(proxy -> proxy.endpoint(URI.create("http://proxy.mydomain.net:8888")))) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .build(); // Perform work with the s3Client. s3Client.close(); // Requests completed: Close the s3client.

대안 접근 방식: UrlConnectionHttpClient 인스턴스 공유

애플리케이션의 리소스 및 메모리 사용량을 낮추려면 UrlConnectionHttpClient를 구성하고 여러 서비스 클라이언트에서 공유할 수 있습니다. HTTP 연결 풀이 공유되므로 리소스 사용량이 줄어듭니다.

참고

UrlConnectionHttpClient 인스턴스를 공유한 경우 폐기할 준비가 되면 인스턴스를 닫아야 합니다. SDK는 서비스 클라이언트가 닫힐 때 인스턴스를 닫지 않습니다.

다음 예제는 두 서비스 클라이언트가 사용하는 URLConnection 기반 HTTP 클라이언트를 구성합니다. 구성된 UrlConnectionHttpClient 인스턴스는 각 빌더의 httpClient 메서드로 전달됩니다. 서비스 클라이언트와 HTTP 클라이언트가 더 이상 필요하지 않으면 코드가 명시적으로 닫습니다. 코드는 HTTP 클라이언트를 마지막으로 닫습니다.

가져오기

import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode; import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.urlconnection.ProxyConfiguration; import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.s3.S3Client; import java.net.URI; import java.time.Duration;

코드

SdkHttpClient urlHttpClient = UrlConnectionHttpClient.create(); // Singletons: Use the s3Client and dynamoDbClient for all requests. S3Client s3Client = S3Client.builder() .httpClient(urlHttpClient) .defaultsMode(DefaultsMode.IN_REGION) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .build(); DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .httpClient(urlHttpClient) .defaultsMode(DefaultsMode.IN_REGION) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .build(); // Perform work with the s3Client and dynamoDbClient. // Requests completed: Close all service clients. s3Client.close(); dynamoDbClient.close(); urlHttpClient.close();

애플리케이션에서 UrlConnectionHttpClient를 사용하는 경우 서비스 클라이언트 빌더의 httpClientBuilder 메서드를 사용하여 각 서비스 클라이언트에 URLConnectionHttpClient 인스턴스 또는 ApacheHttpClient 인스턴스를 제공해야 합니다.

프로그램에서 여러 서비스 클라이언트를 사용하고 다음 두 가지 조건을 모두 만족할 때 예외가 발생합니다.

  • 한 서비스 클라이언트가 UrlConnectionHttpClient 인스턴스를 사용하도록 구성되어 있습니다.

  • 다른 서비스 클라이언트는 httpClient() 또는 httpClientBuilder() 메서드로 명시적으로 빌드하지 않고 기본값 ApacheHttpClient을 사용합니다.

예외는 클래스 경로에서 여러 HTTP 구현이 발견되었음을 나타냅니다.

다음 예제 코드 조각은 예외로 이어집니다.

// The dynamoDbClient uses the UrlConnectionHttpClient DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .httpClient(UrlConnectionHttpClient.create()) .build(); // The s3Client below uses the ApacheHttpClient at runtime, without specifying it. // An SdkClientException is thrown with the message that multiple HTTP implementations were found on the classpath. S3Client s3Client = S3Client.create(); // Perform work with the s3Client and dynamoDbClient. dynamoDbClient.close(); s3Client.close();

S3ClientApacheHttpClient로 명시적으로 구성하여 예외를 방지하세요.

DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .httpClient(UrlConnectionHttpClient.create()) .build(); S3Client s3Client = S3Client.builder() .httpClient(ApacheHttpClient.create()) // Explicitly build the ApacheHttpClient. .build(); // Perform work with the s3Client and dynamoDbClient. dynamoDbClient.close(); s3Client.close();
참고

ApacheHttpClient를 명시적으로 만들려면 Maven 프로젝트 파일의 apache-client아티팩트에 대한 종속성을 추가해야 합니다.

프록시 구성 예제

다음 코드 조각은 URL 연결 HTTP 클라이언트용 프록시 구성 빌더를 사용합니다.

SdkHttpClient urlHttpClient = UrlConnectionHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .endpoint(URI.create("http://example.com:1234")) .username("username") .password("password") .addNonProxyHost("localhost") .addNonProxyHost("host.example.com") .build()) .build();

프록시 구성에 해당하는 Java 시스템 속성은 다음 명령줄 코드 조각에 나와 있습니다.

$ java -Dhttp.proxyHost=example.com -Dhttp.proxyPort=1234 -Dhttp.proxyUser=username \ -Dhttp.proxyPassword=password -Dhttp.nonProxyHosts=localhost|host.example.com -cp ... App

환경 변수를 사용하는 동일한 설정은 다음과 같습니다.

// Set the following environment variables. // $ export HTTP_PROXY="http://username:password@example.com:1234" // $ export NO_PROXY="localhost|host.example.com" // Set the 'useSystemPropertyValues' to false on the proxy configuration. SdkHttpClient apacheHttpClient = UrlConnectionHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .useSystemPropertyValues(Boolean.FALSE) .build()) .build(); // Run the application. // $ java -cp ... App
참고

URL 연결 기반 HTTP 클라이언트는 현재 HTTPS 프록시 시스템 속성이나 HTTPS_PROXY 환경 변수를 지원하지 않습니다.