자습서: 전역 테이블 생성
이 단원에서는 Amazon DynamoDB 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 전역 테이블을 생성하는 방법을 설명합니다.
주제
다음 단계에 따라 AWS Management Console을 사용하여 전역 테이블을 생성합니다. 다음 예제에서는 미국 및 유럽의 복제본 테이블로 전역 테이블을 생성합니다.
-
https://console.aws.amazon.com/dynamodb/home
에서 DynamoDB 콘솔을 엽니다. 이 예제의 경우 미국 동부(오하이오) 리전을 선택합니다. -
콘솔 왼쪽의 탐색 창에서 테이블을 선택합니다.
-
Create Table(테이블 생성)을 선택합니다.
-
테이블 생성 페이지에서 다음 작업을 수행합니다.
-
테이블 이름에
Music
을(를) 입력합니다. -
파티션 키(Partition key)에
Artist
를 입력합니다. -
정렬 키에는
SongTitle
을 입력합니다. -
파티션 키와 정렬 키 모두에 대해 기본 선택인 문자열을 그대로 사용합니다.
-
페이지에 있는 다른 기본 선택 항목을 그대로 두고 테이블 만들기를 선택합니다.
이 최신 테이블은 새로운 전역 테이블에서 첫 번째 복제본 테이블 역할을 합니다. 이는 나중에 추가하는 다른 복제본 테이블의 프로토타입입니다.
-
-
테이블 페이지에서 새로 만든 음악 테이블을 선택하고 다음을 수행하세요.
-
전역 테이블 탭을 선택한 다음 복제본 생성을 선택합니다.
-
사용 가능한 복제 리전 드롭다운 목록에서 미국 서부(오레곤) us-west-2를 선택합니다.
콘솔에서 선택한 리전에 이름이 동일한 테이블이 없는지 확인합니다. 이름이 동일한 테이블이 있는 경우 해당 리전에서 새 복제본 테이블을 생성하려면 먼저 기존 테이블을 삭제해야 합니다.
-
복제본 생성을 선택합니다. 그러면 미국 서부(오레곤) us-west-2 리전에서 테이블 생성 프로세스가 시작됩니다.
음악 테이블의 전역 테이블 탭 및 다른 복제본 테이블의 전역 테이블 탭은 테이블이 여러 리전에서 복제되었음을 나타냅니다.
-
다른 리전을 추가하여 전역 테이블이 미국과 유럽에 걸쳐 복제되고 동기화되도록 합니다. 이렇게 하려면 5.b단계를 반복하되, 이번에는 미국 서부(오레곤) us-west-2 대신 유럽(프랑크푸르트) eu-central-1을 지정합니다.
-
-
미국 동부(오하이오) 리전에서 AWS Management Console을 계속 사용해야 합니다. 뒤이어 다음과 같이 하세요.
-
테이블 항목 탐색을 선택합니다.
-
항목 생성을 선택합니다.
-
[Artist]에
item_1
를 입력합니다. -
[SongTitle]에
Song Value 1
를 입력합니다. -
해당 항목을 저장하려면 항목 만들기를 선택합니다.
-
-
잠시 후에 이 항목이 전역 테이블의 세 리전 모두에 복제됩니다. 제대로 되었는지 확인하려면 콘솔에서 오른쪽 상단 모서리에 있는 리전 선택기로 이동하고 Europe (Frankfurt)(유럽(프랑크푸르트))를 선택합니다. 유럽(프랑크푸르트)의 음악 테이블에 새 항목이 포함되어 있어야 합니다.
-
7단계를 반복하고 미국 서부(오레곤)를 선택하여 해당 리전의 복제를 확인합니다.
다음 단계에 따라 AWS CLI를 사용하여 Music
전역 테이블을 생성합니다. 다음 예제에서는 미국 및 유럽의 복제본 테이블로 전역 테이블을 생성합니다.
-
미국 동부(오하이오)에서 DynamoDB Streams를 활성화하고(
NEW_AND_OLD_IMAGES
) 새 테이블(Music
)을 생성합니다.aws dynamodb create-table \ --table-name Music \ --attribute-definitions \ AttributeName=Artist,AttributeType=S \ AttributeName=SongTitle,AttributeType=S \ --key-schema \ AttributeName=Artist,KeyType=HASH \ AttributeName=SongTitle,KeyType=RANGE \ --billing-mode PAY_PER_REQUEST \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \ --region us-east-2
-
동일한
Music
테이블을 미국 동부(버지니아 북부)에서 생성합니다.aws dynamodb update-table --table-name Music --cli-input-json \ '{ "ReplicaUpdates": [ { "Create": { "RegionName": "us-east-1" } } ] }' \ --region=us-east-2
-
유럽(아일랜드)(eu-west-1)에서 테이블을 생성하기 위해 2단계를 반복합니다.
-
describe-table
를 이용해 생성된 복제본 목록을 확인할 수 있습니다.aws dynamodb describe-table --table-name Music --region us-east-2
-
복제가 작동하는지 확인하려면 미국 동부(오하이오)의
Music
테이블에 새 항목을 추가합니다.aws dynamodb put-item \ --table-name Music \ --item '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \ --region us-east-2
-
몇 초 기다린 후 항목이 미국 동부(버지니아 북부) 및 유럽(아일랜드)에 성공적으로 복제되었는지 확인합니다.
aws dynamodb get-item \ --table-name Music \ --key '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \ --region us-east-1
aws dynamodb get-item \ --table-name Music \ --key '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \ --region eu-west-1
-
유럽(아일랜드) 리전에 있는 복제 테이블을 삭제합니다.
aws dynamodb update-table --table-name Music --cli-input-json \ '{ "ReplicaUpdates": [ { "Delete": { "RegionName": "eu-west-1" } } ] }'
다음 자바 코드 샘플은 유럽(아일랜드) 리전에 Music
테이블을 생성하고 아시아 태평양(서울) 리전에 복제본을 생성합니다.
package com.amazonaws.codesamples.gtv2 import java.util.logging.Logger; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException; import com.amazonaws.services.dynamodbv2.model.AttributeDefinition; import com.amazonaws.services.dynamodbv2.model.BillingMode; import com.amazonaws.services.dynamodbv2.model.CreateReplicationGroupMemberAction; import com.amazonaws.services.dynamodbv2.model.CreateTableRequest; import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest; import com.amazonaws.services.dynamodbv2.model.GlobalSecondaryIndex; import com.amazonaws.services.dynamodbv2.model.KeySchemaElement; import com.amazonaws.services.dynamodbv2.model.KeyType; import com.amazonaws.services.dynamodbv2.model.Projection; import com.amazonaws.services.dynamodbv2.model.ProjectionType; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughputOverride; import com.amazonaws.services.dynamodbv2.model.ReplicaGlobalSecondaryIndex; import com.amazonaws.services.dynamodbv2.model.ReplicationGroupUpdate; import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType; import com.amazonaws.services.dynamodbv2.model.StreamSpecification; import com.amazonaws.services.dynamodbv2.model.StreamViewType; import com.amazonaws.services.dynamodbv2.model.UpdateTableRequest; import com.amazonaws.waiters.WaiterParameters; public class App { private final static Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); public static void main( String[] args ) { String tableName = "Music"; String indexName = "index1"; Regions calledRegion = Regions.EU_WEST_1; Regions destRegion = Regions.AP_NORTHEAST_2; AmazonDynamoDB ddbClient = AmazonDynamoDBClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider("default")) .withRegion(calledRegion) .build(); LOGGER.info("Creating a regional table - TableName: " + tableName +", IndexName: " + indexName + " ....."); ddbClient.createTable(new CreateTableRequest() .withTableName(tableName) .withAttributeDefinitions( new AttributeDefinition() .withAttributeName("Artist").withAttributeType(ScalarAttributeType.S), new AttributeDefinition() .withAttributeName("SongTitle").withAttributeType(ScalarAttributeType.S)) .withKeySchema( new KeySchemaElement().withAttributeName("Artist").withKeyType(KeyType.HASH), new KeySchemaElement().withAttributeName("SongTitle").withKeyType(KeyType.RANGE)) .withBillingMode(BillingMode.PAY_PER_REQUEST) .withGlobalSecondaryIndexes(new GlobalSecondaryIndex() .withIndexName(indexName) .withKeySchema(new KeySchemaElement() .withAttributeName("SongTitle") .withKeyType(KeyType.HASH)) .withProjection(new Projection().withProjectionType(ProjectionType.ALL))) .withStreamSpecification(new StreamSpecification() .withStreamEnabled(true) .withStreamViewType(StreamViewType.NEW_AND_OLD_IMAGES))); LOGGER.info("Waiting for ACTIVE table status ....."); ddbClient.waiters().tableExists().run(new WaiterParameters<>(new DescribeTableRequest(tableName))); LOGGER.info("Testing parameters for adding a new Replica in " + destRegion + " ....."); CreateReplicationGroupMemberAction createReplicaAction = new CreateReplicationGroupMemberAction() .withRegionName(destRegion.getName()) .withGlobalSecondaryIndexes(new ReplicaGlobalSecondaryIndex() .withIndexName(indexName) .withProvisionedThroughputOverride(new ProvisionedThroughputOverride() .withReadCapacityUnits(15L))); ddbClient.updateTable(new UpdateTableRequest() .withTableName(tableName) .withReplicaUpdates(new ReplicationGroupUpdate() .withCreate(createReplicaAction.withKMSMasterKeyId(null)))); } }