본문 바로가기

DevOps/AWS

AWS DynamoDB - (3) AWS SDK for Java 설정하기

Overview

AWS SDK for Java는 Amazon Web Service를 위한 JAVA APi이다. 즉, Amazon S3, Amazon DyanmoDB의 서비스를 사용하는 Java application을 만들 때 사용하게 된다. 이번 포스팅의 목표는 EC2 Instance에서 실행하는 Spring Boot project가 DyanmoDB service를 사용할 수 있도록 AWS SDK를 설정하는 것이다. 아래의 그림은 해당 설정이 끝났을 때 요약도이다.




1. AWS SDK for JAVA 설치하기

build.gradle에 dependency를 추가해주자.
// AWS Dynamic DB
compile group: 'com.amazonaws', name: 'aws-java-sdk-dynamodb', version: '1.11.34'



2. Amazon Service를 호출하기 위한 준비

Amazon Web Service에 요청을 보내기 위해서는 service client object를 먼저 만들어 줘야 한다. AWS 문서에서 service client builder를 사용하라고 권장하고 있다.

AWS service 들은 각 서비스에 맞는 service interface를 가지고 있다. 예를 들어, 우리가 설정하려고 하는 DynamoDB의 경우 AmazonDynamoDB라는 객체가 있다. 그리고 DynamoDB를 위한 client build class는 AmazonDynamoDBClientBuilder가 있다.

Client Builder

 아래와 같이 builder API를 이용하여 region, credential 등을 커스터마이징할 수 있다.

AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard()
                        .withRegion(Regions.US_WEST_2)
                        .withCredentials(new ProfileCredentialsProvider("myProfile"))
                        .build();


AWS Credential 설정하기

Amazon Web Service에 요청을 날리려면, AWS SDK에 credentail을 설정해주어야 한다.

AWS SDK에 아무 설정도 해주지 않으면 아래와 같은 순서로 AWS Credentail을 탐색한다.  우리는 EC2 instance에 부여된 IAM Role을 사용하기 위해 5번 설정을 하면 된다. 


1. 환경 변수  AWS_ACCESS_KEY_ID  AWS_SECRET_ACCESS_KEY. AWS SDK for Java에서는 EnvironmentVariableCredentialsProvider 클래스를 사용하여 이러한 자격 증명을 로드한다.


2. Java 시스템 속성aws.accessKeyId  aws.secretKey. AWS SDK for Java에서는 SystemPropertiesCredentialsProvider 클래스를 사용하여 이러한 자격 증명을 로드한다.


3. 기본 자격 증명 프로필 파일– 일반적으로 ~/.aws/credentials(플랫폼마다 다를 수 있음)에 위치하며 여러 AWS SDK 및 AWS CLI에서 공유합니다. AWS SDK for Java에서는 ProfileCredentialsProvider 클래스를 사용하여 이러한 자격 증명을 로드한다.


AWS CLI에서 제공하는 aws configure 명령을 사용하여 자격 증명 파일을 생성하거나 텍스트 편집기에서 이 파일을 편집하여 새로 생성할 수 있습니다. 자격 증명 파일 형식에 대한 자세한 내용은 AWS 자격 증명 파일 형식을 참조


4. Amazon ECS 컨테이너 자격 증명– 환경 변수 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI가 설정된 경우 Amazon ECS에서 로드됩니다. AWS SDK for Java에서는 ContainerCredentialsProvider 클래스를 사용하여 이러한 자격 증명을 로드한다.


5. 인스턴스 프로파일 자격 증명– EC2 인스턴스에서 사용되며, Amazon EC2 메타데이터 서비스를 통해 전달됩니다. AWS SDK for Java에서는 InstanceProfileCredentialsProvider 클래스를 사용하여 이러한 자격 증명을 로드한다.


    @Configuration
    @Profile("staging")
    @EnableDynamoDBRepositories(basePackageClasses = {Your DB Repository}.class)
    public class DynamodbEC2Config {

    @Value("${amazon.dynamodb.endpoint}")
    private String amazonDynamoDBEndpoint;

    @Bean
    public AmazonDynamoDB amazonDynamoDB() {

    // Use IAM Role credentials of EC2 instance
    AmazonDynamoDB amazonDynamoDB = new AmazonDynamoDBClient(
    new InstanceProfileCredentialsProvider());

    amazonDynamoDB.setRegion(Region.getRegion(Regions.AP_NORTHEAST_2));

    if (!StringUtils.isEmpty(amazonDynamoDBEndpoint)) {
    amazonDynamoDB.setEndpoint(amazonDynamoDBEndpoint);
    }

    return amazonDynamoDB;
    }

    }


Credentials 생성 및 적용

위 예제에서 AWS SDK에 계정을 적용하는 방법에 대해 살펴보았다. 그 전에 우리는 Credential을 만들어 줘야 한다. AWS 문서를 참고해서 만들어보자. 


3. Amazon Service 호출하기

AWS SDK for JAVA API를 이용하여 Table에 있는 Item을 가져오는 예제이다.

private static void retrieveItem() { Table table = dynamoDB.getTable(tableName); try { Item item = table.getItem("Id", 120, "Id, ISBN, Title, Authors", null); System.out.println("Printing item after retrieving it...."); System.out.println(item.toJSONPretty()); } catch (Exception e) { System.err.println("GetItem failed."); System.err.println(e.getMessage()); } }

Request Format

아래 코드는 AWS SDK가 실제로 DynamoDB에  날릴 Request에 대한 것이다. Header에 dynamodb의 주소와, 계정 정보가 담겨있는 것을 볼 수 있다.

POST / HTTP/1.1 Host: dynamodb.<region>.<domain>; Accept-Encoding: identity Content-Length: <PayloadSizeBytes> User-Agent: <UserAgentString> Content-Type: application/x-amz-json-1.0 Authorization: AWS4-HMAC-SHA256 Credential=<Credential>, SignedHeaders=<Headers>, Signature=<Signature> X-Amz-Date: <Date> X-AMZ-Target: DynamoDB_20120810.GetItem { "TableName": "Pets", "Key": { "AnimalType": {"S": "Dog"}, "Name": {"S": "Fido"} } 

}



마무리하며

Java application을 개발할 때, Amazon Web Service를 어떻게 적용해야 하는지에 대해 살펴보았다. 이제 세부적인 API는 사용하고 싶은 서비스에 맞는 Documentation을 찾아보면 될 것이다.