글로벌 테이블
- 일반 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()