こしあん
2024-12-22

DynamoDBのグローバルテーブルを試す


1{icon} {views}


Terraformを使ったDynamoDBグローバルテーブルで、複数リージョンへの自動同期を実装する方法を紹介します。例えば、東京とバージニア間でのリアルタイムなデータレプリケーションも簡単に実現できます。

はじめに

DynamoDBで複数のリージョンに対して同時に読み書きでき、同期の取れる「グローバルテーブル」を試してみました。Terraformで書く場合はreplicaを追加することで簡単に作成できます。

このように東京リージョンのDynamoDBに書き込むと、バージニアリージョンのDynamoDBに自動的に複製されるものです。もちろん逆向きに(バージニアに書き込み、東京で読み込み)やっても複製されます。

Terraformコード

以下のコードで簡単に作成できます。プロバイダーのデフォルトリージョンは東京(ap-northeast-1)とします。以下はバージニアに複製を作るコードです。

resource "aws_dynamodb_table" "my_global_table" {
  name           = "my_global_table"
  billing_mode   = "PAY_PER_REQUEST"
  hash_key       = "id"

  attribute {
    name = "id"
    type = "S"
  }

  replica {
    region_name = "us-east-1"
  }
}

replicaを追加するだけで簡単にクロスリージョンに複製できます。バージニアリージョンでマネジメントコンソールから見ると、東京リージョンにレプリケーションが作成されているのが確認できます(逆も然り)。

ローカルからアイテムを追加してみる

以下はローカルのPythonコードからDynamoDBにアイテムを追加する例です。東京リージョンに追加してみます。

import boto3
import decimal
from botocore.exceptions import ClientError

# テーブル名とリージョンを設定
TABLE_NAME = 'my_global_table'
REGION = 'ap-northeast-1'  # メインリージョン
PROFILE = "hogehoge"

# DynamoDBのリソースを作成
session = boto3.Session(profile_name=PROFILE)
dynamodb = session.resource('dynamodb', region_name=REGION)

# テーブルオブジェクトを取得
table = dynamodb.Table(TABLE_NAME)

def add_item(item):
    """
    DynamoDBテーブルにアイテムを追加します。

    :param item: 追加するアイテム(辞書形式)
    """
    try:
        response = table.put_item(Item=item)
        print(f"アイテムが正常に追加されました: {item}")
    except ClientError as e:
        print(f"アイテムの追加中にエラーが発生しました: {e.response['Error']['Message']}")

if __name__ == "__main__":
    # 追加するアイテムの例
    new_item = {
        'id': '123',               # パーティションキー
        'name': 'サンプルアイテム',
        'description': 'これはテスト用のアイテムです。',
        'price': decimal.Decimal('19.99'),  # Decimal型を使用,
        'in_stock': True
    }

    add_item(new_item)

結果をバージニアリージョンで見ると、ほとんど遅延なく反映されています。また、バージニアに対して書き込みをして東京で読んでも同様の結果が得られました。

まとめ

クロスリージョンのレプリケーションが簡単なDynamoDBめっちゃ便利!



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です