AWS SDK for Java 2.x를 사용하여 AWS 서비스 요청하기
서비스 클라이언트를 사용하여 요청 만들기
SDK 설정의 단계를 완료하고 서비스 클라이언트를 구성하는 방법을 알면 Amazon S3, Amazon DynamoDB, AWS Identity and Access Management, Amazon EC2 등의AWS 서비스에 요청할 준비가 된 것입니다.
서비스 클라이언트 생성
AWS 서비스에 요청하려면 먼저 정적 팩토리 메서드인 builder()를 사용하여 해당 서비스의 서비스 클라이언트를 인스턴스화해야 합니다. 이 builder() 메서드는 서비스 클라이언트를 사용자 지정할 수 있는 builder 객체를 반환합니다. 유용한 setter 메서드는 builder 객체를 반환해 읽기 쉽고 편리하도록 메서드 호출을 묶을 수 있게 도와줍니다. 원하는 속성을 구성한 후에는 build() 메서드를 호출하여 클라이언트를 생성할 수 있습니다.
예를 들어, 이 코드 조각은 Ec2Client 객체를 Amazon EC2용 서비스 클라이언트로 인스턴스화합니다.
Region region = Region.US_WEST_2; Ec2Client ec2Client = Ec2Client.builder() .region(region) .build();
참고
SDK의 서비스 클라이언트는 스레드 세이프입니다. 최상의 성능을 위해 수명이 긴 객체로 처리합니다. 각 클라이언트마다 클라이언트에서 가비지가 수집될 때 릴리스되는 고유한 연결 풀 리소스가 있습니다.
서비스 클라이언트 객체는 변경할 수 없으므로 요청하는 각 서비스에 대해 또는 동일한 서비스에 대한 요청을 위해 다른 구성을 사용하려는 경우 새 클라이언트를 만들어야 합니다.
모든 AWS 서비스에 대해 서비스 클라이언트 빌더에서 Region를 지정할 필요는 없지만 애플리케이션에서 수행하는 API 호출에 대해 리전을 설정하는 것이 가장 좋습니다. 자세한 내용은 AWS 리전 선택을 참조하세요.
기본 클라이언트 구성
클라이언트 빌더에는 create()라는 또 다른 팩토리 메서드가 있습니다. 기본 구성을 사용해 서비스 클라이언트를 생성하는 메서드입니다. 기본 공급자 체인을 사용하여 자격 증명과 기본값 AWS 리전 공급자 체인을 로드합니다. 애플리케이션이 실행되는 환경에서 자격 증명이나 리전을 확인할 수 없는 경우 create 에 대한 호출이 실패합니다. SDK가 사용할 자격 증명 및 리전을 결정하는 방법에 대한 자세한 내용은 자격 증명 사용 및 리전 선택을 참조하세요.
예를 들어, 이 코드 조각은 DynamoDbClient 객체를 Amazon DynamoDB용 서비스 클라이언트로 인스턴스화합니다.
DynamoDbClient dynamoDbClient = DynamoDbClient.create();
서비스 클라이언트 구성
서비스 클라이언트를 구성하는 방법에 대한 자세한 내용은 외부에서 클라이언트 구성 및 코드의 클라이언트 구성 섹션을 참조하세요.
서비스 클라이언트 닫기
가장 좋은 방법은 애플리케이션 수명 동안 여러 API 서비스 호출에 서비스 클라이언트를 사용하는 것입니다. 하지만 일회용으로 사용할 서비스 클라이언트가 필요하거나 더 이상 필요 없는 서비스 클라이언트는 닫으세요.
리소스를 확보하는 데 서비스 클라이언트가 더 이상 필요하지 않을 때 close() 메서드를 호출하세요.
ec2Client.close();
일회용으로 사용할 서비스 클라이언트가 필요한 경우 try-with-resources 문을 사용하여 서비스 클라이언트를 리소스로 인스턴스화할 수 있습니다. 서비스 클라이언트가 Autoclosable 인터페이스를 구현하므로 JDK는 명령문 끝에서 close() 메서드를 자동으로 호출합니다.
다음 예제에서는 서비스 클라이언트를 사용하여 일회성 호출을 실행하는 방법을 보여줍니다. AWS Security Token Service를 호출하는 StsClient는 계정 ID를 반환한 후 종료됩니다.
import software.amazon.awssdk.services.sts.StsClient; String getAccountID() { try (StsClient stsClient = StsClient.create()) { return stsClient.getCallerIdentity().account(); } }
요청을 생성
서비스 클라이언트를 사용하여 해당 AWS 서비스에 요청합니다.
예를 들어, 이 코드 조각은 RunInstancesRequest 객체를 생성하여 새 Amazon EC2 인스턴스를 생성하는 방법을 보여줍니다.
// Create the request by using the fluid setter methods of the request builder. RunInstancesRequest runInstancesRequest = RunInstancesRequest.builder() .imageId(amiId) .instanceType(InstanceType.T1_MICRO) .maxCount(1) .minCount(1) .build(); // Use the configured request with the service client. RunInstancesResponse response = ec2Client.runInstances(runInstancesRequest);
요청을 만들고 인스턴스를 전달하는 대신 SDK는 요청을 만드는 데 사용할 수 있는 유용한 API를 제공합니다. 유용한 API를 사용하면 Java lambda 표현식을 사용하여 요청을 '인라인'으로 만들 수 있습니다.
다음 예제에서는 빌더를 사용runInstances 메서드의 버전을 사용하여 이전 예제를 다시 작성합니다.
// Create the request by using a lambda expression. RunInstancesResponse response = ec2.runInstances(r -> r .imageId(amiId) .instanceType(InstanceType.T1_MICRO) .maxCount(1) .minCount(1));
요청을 사용하여 클라이언트 구성 재정의
서비스 클라이언트는 변경할 수 없지만 요청 수준에서 많은 해당 설정을 재정의할 수 있습니다. 요청을 구축할 때 AwsRequestOverrideConfiguration
-
apiCallAttemptTimeout -
apiCallTimeout -
credentialProvider -
compressionConfiguration -
putHeader
클라이언트 설정을 요청으로 재정의하는 예제의 경우 기본 설정을 사용하는 다음 S3 클라이언트가 있다고 가정합니다.
S3Client s3Client = S3Client.create();
대용량 파일을 다운로드하고 다운로드가 완료되기 전에 요청의 제한 시간이 초과되지 않도록 하려고 합니다. 이렇게 하려면 다음 코드와 같이 단일 GetObject 요청의 제한 시간 값만 늘립니다.
응답 처리
SDK는 대부분의 서비스 작업에 대한 응답 객체를 반환합니다. 코드는 필요에 따라 응답 객체의 정보를 처리할 수 있습니다.
예를 들어 다음 코드 조각은 이전 요청에서 RunInstancesResponse
RunInstancesResponse runInstancesResponse = ec2Client.runInstances(runInstancesRequest); System.out.println(runInstancesResponse.instances().get(0).instanceId());
그러나 일부 작업은 서비스별 데이터가 포함된 응답 객체를 반환하지 않습니다. 이러한 상황에서는 HTTP 응답 상태를 쿼리하여 작업이 성공했는지 확인할 수 있습니다.
예를 들어 다음 코드 조각의 코드는 HTTP 응답을 확인하여 Amazon Simple Email Service의 DeleteContactList
SesV2Client sesv2Client = SesV2Client.create(); DeleteContactListRequest request = DeleteContactListRequest.builder() .contactListName("ExampleContactListName") .build(); DeleteContactListResponse response = sesv2Client.deleteContactList(request); if (response.sdkHttpResponse().isSuccessful()) { System.out.println("Contact list deleted successfully"); } else { System.out.println("Failed to delete contact list. Status code: " + response.sdkHttpResponse().statusCode()); }