자습서: 전역 테이블 생성 - Amazon DynamoDB

자습서: 전역 테이블 생성

이 단원에서는 Amazon DynamoDB 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 전역 테이블을 생성하는 방법을 설명합니다.

주제

    다음 단계에 따라 AWS Management Console을 사용하여 전역 테이블을 생성합니다. 다음 예제에서는 미국 및 유럽의 복제본 테이블로 전역 테이블을 생성합니다.

    1. https://console.aws.amazon.com/dynamodb/home에서 DynamoDB 콘솔을 엽니다. 이 예제의 경우 미국 동부(오하이오) 리전을 선택합니다.

    2. 콘솔 왼쪽의 탐색 창에서 테이블을 선택합니다.

    3. Create Table(테이블 생성)을 선택합니다.

    4. 테이블 생성 페이지에서 다음 작업을 수행합니다.

      1. 테이블 이름Music을(를) 입력합니다.

      2. 파티션 키(Partition key)Artist를 입력합니다.

      3. 정렬 키에는 SongTitle을 입력합니다.

      4. 파티션 키정렬 키 모두에 대해 기본 선택인 문자열을 그대로 사용합니다.

      5. 페이지에 있는 다른 기본 선택 항목을 그대로 두고 테이블 만들기를 선택합니다.

        이 최신 테이블은 새로운 전역 테이블에서 첫 번째 복제본 테이블 역할을 합니다. 이는 나중에 추가하는 다른 복제본 테이블의 프로토타입입니다.

    5. 테이블 페이지에서 새로 만든 음악 테이블을 선택하고 다음을 수행하세요.

      1. 전역 테이블 탭을 선택한 다음 복제본 생성을 선택합니다.

      2. 사용 가능한 복제 리전 드롭다운 목록에서 미국 서부(오레곤) us-west-2를 선택합니다.

        콘솔에서 선택한 리전에 이름이 동일한 테이블이 없는지 확인합니다. 이름이 동일한 테이블이 있는 경우 해당 리전에서 새 복제본 테이블을 생성하려면 먼저 기존 테이블을 삭제해야 합니다.

      3. 복제본 생성을 선택합니다. 그러면 미국 서부(오레곤) us-west-2 리전에서 테이블 생성 프로세스가 시작됩니다.

        음악 테이블의 전역 테이블 탭 및 다른 복제본 테이블의 전역 테이블 탭은 테이블이 여러 리전에서 복제되었음을 나타냅니다.

      4. 다른 리전을 추가하여 전역 테이블이 미국과 유럽에 걸쳐 복제되고 동기화되도록 합니다. 이렇게 하려면 5.b단계를 반복하되, 이번에는 미국 서부(오레곤) us-west-2 대신 유럽(프랑크푸르트) eu-central-1을 지정합니다.

    6. 미국 동부(오하이오) 리전에서 AWS Management Console을 계속 사용해야 합니다. 뒤이어 다음과 같이 하세요.

      1. 테이블 항목 탐색을 선택합니다.

      2. 항목 생성을 선택합니다.

      3. [Artist]에 item_1를 입력합니다.

      4. [SongTitle]에 Song Value 1를 입력합니다.

      5. 해당 항목을 저장하려면 항목 만들기를 선택합니다.

    7. 잠시 후에 이 항목이 전역 테이블의 세 리전 모두에 복제됩니다. 제대로 되었는지 확인하려면 콘솔에서 오른쪽 상단 모서리에 있는 리전 선택기로 이동하고 Europe (Frankfurt)(유럽(프랑크푸르트))를 선택합니다. 유럽(프랑크푸르트)의 음악 테이블에 새 항목이 포함되어 있어야 합니다.

    8. 7단계를 반복하고 미국 서부(오레곤)를 선택하여 해당 리전의 복제를 확인합니다.

    다음 단계에 따라 AWS CLI를 사용하여 Music 전역 테이블을 생성합니다. 다음 예제에서는 미국 및 유럽의 복제본 테이블로 전역 테이블을 생성합니다.

    1. 미국 동부(오하이오)에서 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
    2. 동일한 Music 테이블을 미국 동부(버지니아 북부)에서 생성합니다.

      aws dynamodb update-table --table-name Music --cli-input-json \ '{ "ReplicaUpdates": [ { "Create": { "RegionName": "us-east-1" } } ] }' \ --region=us-east-2
    3. 유럽(아일랜드)(eu-west-1)에서 테이블을 생성하기 위해 2단계를 반복합니다.

    4. describe-table를 이용해 생성된 복제본 목록을 확인할 수 있습니다.

      aws dynamodb describe-table --table-name Music --region us-east-2
    5. 복제가 작동하는지 확인하려면 미국 동부(오하이오)의 Music 테이블에 새 항목을 추가합니다.

      aws dynamodb put-item \ --table-name Music \ --item '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \ --region us-east-2
    6. 몇 초 기다린 후 항목이 미국 동부(버지니아 북부) 및 유럽(아일랜드)에 성공적으로 복제되었는지 확인합니다.

      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
    7. 유럽(아일랜드) 리전에 있는 복제 테이블을 삭제합니다.

      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)))); } }