このセクションでは、Amazon DynamoDB コンソールまたは AWS Command Line Interface (AWS CLI) を使用してグローバルテーブルを作成する方法について説明します。
トピック
AWS Management Console を使用してグローバルテーブルを作成するには、次の手順に従います。以下の例では、レプリカテーブルを持つグローバルテーブルを米国およびヨーロッパに作成します。
-
DynamoDB コンソール (https://console.aws.amazon.com/dynamodb/home
) を開きます。この例では、[米国東部 (オハイオ)] リージョンを選択します。 -
コンソールの左側のナビゲーションペインで、[テーブル] を選択します。
-
[Create Table] (テーブルの作成) を選択します。
-
[Create table] (テーブルを作成) ページで、次の操作を行います。
-
[テーブル名] に
Music
と入力します。 -
[パーティションキー] に
Artist
と入力します。 -
[ソートキー] に
SongTitle
と入力します。 -
[パーティションキー] と [ソートキー] の [文字列] セクションをデフォルトのままにします。
-
ページのすべての設定をデフォルトままにして、[テーブルの作成] を選択します。
この新しいテーブルは、新しいグローバルテーブルの最初のレプリカテーブルとして機能します。これは、後で追加する他のレプリカテーブルのプロトタイプです。
-
-
[テーブル] ページで、新しく作成した [Music] テーブルを選択し、以下の操作を行います。
-
[グローバルテーブル] タブを選択して、[レプリカを作成] を選択します。
-
[利用できるレプリケーションリージョン] ドロップダウンリストで、[米国西部 (オレゴン) us-west-2] を選択します。
コンソールは、選択したリージョンに同一名のテーブルが存在しないことを確認します。同一名のテーブルが存在する場合は、そのリージョンで新しいレプリカテーブルを作成する前に既存のテーブルを削除する必要があります。
-
レプリカの作成を選択します。これで、米国西部 (オレゴン) us-west-2 リージョンでテーブル作成プロセスが開始されます。
[Music] テーブル (およびその他すべてのレプリカテーブル) の [グローバルテーブル] タブに、テーブルが複数のリージョンでレプリケートされたことが示されます。
-
別のリージョンを追加して、グローバルテーブルがレプリケートされ、米国およびヨーロッパに同期されるようにします。これを行うには、ステップ 5.b を繰り返しますが、今回は [米国西部 (オレゴン) us-west-2] の代わりに [欧州 (フランクフルト) eu-central-1] を指定します。
-
-
米国東部 (オハイオ) リージョンで AWS Management Console を使用し続けていることを確認してください。次に、以下の操作を実行します。
-
[テーブルアイテムの探索] を選択します。
-
[項目を作成] を選択します。
-
[Artist] に
item_1
と入力します。 -
[SongTitle] に
Song Value 1
と入力します。 -
[項目の作成] を選択して、項目を保存します。
-
-
間もなくすると、この項目は、グローバルテーブルの 3 つのすべてのリージョンにレプリケートされます。これを確認するには、コンソールの右上隅にあるリージョンセレクターで、[Europe (Frankfurt) (欧州 (フランクフルト))] を選択します。欧州 (フランクフルト) の [Music] テーブルに新しい項目が表示されます。
-
ステップ 7 を繰り返し、米国西部 (オレゴン) を選択して、そのリージョンでのレプリケーションを確認します。
Music
を使用してグローバルテーブル AWS CLI を作成するには、次の手順に従います。以下の例では、米国およびヨーロッパのレプリカテーブルを使用して、グローバルテーブルを作成します。
-
DynamoDB Streams を有効にして (
Music
)、米国東部 (オハイオ) で新規テーブル (NEW_AND_OLD_IMAGES
) DynamoDB Streams を作成します。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
-
ステップ 2 を繰り返して、欧州 (アイルランド) (eu-west-1) にテーブルを作成します。
-
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" } } ] }'
次の Java コード例は、欧州 (アイルランド) リージョンに 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))));
}
}