DynamoDB

글로벌 테이블

  • 일반 DynamoDB 테이블은 여러 AZ에 저장되지만 글로벌 테이블은 여러 리젼에 걸쳐서 저장된다. 멀티리젼 – 멀티마스터 구조의 DynamoDB
  • 글로벌 테이블 자체로 추가 비용은 발생하지 않음. 복사되는 리젼의 데이터와 전송시 네트워크 비용만.
  • Local Table보다 조금 높은 Latency. 개인경험에 의해선 ~10ms 정도 차이가 있었다. 다른 리젼으로 복사를 포함하기 때문에 당연한 결과(2020년 6월 기준)
  • 유사하게 Cross-Region Replication이 있는데 이것은 Read-Only

로컬 개발환경

gradle task로 로컬에서 DynamoDB 구동하기. docker가 실행되 있어야 한다.

http://localhost:8000/shell/ 주소로 접근하면 커맨드를 테스트해 볼 수 있다. 그러기 위해선 -jar DynamoDBLocal.jar -sharedDb 옵션을 제공해줘야 한다. 그렇지 않으면 access key + region으로 접근이 나뉘어 지기 때문에 간단히 접근하기가 힘들어 진다. 참고

task runDynamo(type: Exec) {
    commandLine 'docker', 'run',
            '--name', 'beyond-price-dynamo',
            '--rm',
            '-d',
            '-p', '8000:8000',
            "amazon/dynamodb-local",
            '-jar',
            'DynamoDBLocal.jar', 
            '-sharedDb'
}
task stopDynamo(type: Exec) {
    commandLine 'docker', 'stop', 'local-dynamodb'
}

로컬에서 SDK로 테이블을 생성할 때 The number of attributes in key schema must match the number of attributesdefined 와 같은 에러를 만났다면 스키마 정의에서 키가 아닌 것을 전부 제거해준다. DynamoDB는 Schemaless이기 때문에 에러를 뱉는다. 아래 코드는 isbn 어트리뷰트가 키에 존재하지 않기 때문에 실행하면 예외가 발생한다.

        val createTableRequest = CreateTableRequest.builder()
            .attributeDefinitions(
                AttributeDefinition.builder().attributeName("bookId").attributeType(ScalarAttributeType.S).build(),
               AttributeDefinition.builder().attributeName("isbn").attributeType(ScalarAttributeType.S).build()
            )
            .keySchema(
               KeySchemaElement.builder().attributeName("bookId").keyType(KeyType.HASH).build()
            )
            .billingMode(BillingMode.PAY_PER_REQUEST)
            .tableName(tableName)
            .build()

DynamoDB Local Usage Notes