PolarDB for PostgreSQL は DynamoDB API をサポートしており、DynamoDB 互換のクライアントや SDK を直接 PolarDB クラスターに接続できます。標準的な DynamoDB の操作であれば、コードの変更は不要です。
このガイドでは、以下の 5 つのステップでセットアップ全体を説明します。
バージョン要件の確認
DynamoDB 互換機能の有効化
DynamoDB エンドポイントの設定
DynamoDB アカウントの作成
ネットワークアクセスの設定と接続の確認
前提条件
開始する前に、ご利用のクラスターが以下の要件を満たしていることを確認してください。
カーネルバージョン:PostgreSQL 14、リビジョンバージョン 2.0.14.17.35.0 以降
データベースプロキシバージョン:2.3.59 以降
クラスタータイプ:標準クラスターのみ。PolarDB for PostgreSQL 分散版およびサーバーレスクラスターはサポートされていません
クラスターのバージョンを確認するには、PolarDBコンソールで、[設定と管理][バージョン管理]マイナーバージョンをスペックアップしてください。
DynamoDB 互換機能の有効化
既存のクラスターでこの機能を有効にするか、新規クラスターの作成時に選択します。
既存のクラスターの場合
クラスターの[基本情報]ページで、[DynamoDB 互換性]設定項目を見つけ、[オン]をクリックします。

新規クラスターの作成
PolarDB クラスターのカスタム購入ページに移動します。
[データベースエンジン] を PostgreSQL 14 に設定し、[DynamoDB 互換性] を選択します。
必要に応じて、リージョン、ゾーン、ノードスペックを設定します。

DynamoDB エンドポイントの設定
この機能を有効化すると、システムにより、[基本情報] ページの [データベース接続] セクションにデフォルトの DynamoDB エンドポイントが自動的に作成されます。

(任意) [カスタムクラスターエンドポイントの作成] をクリックし、[エンドポイントタイプ] を [DynamoDB エンドポイント] に設定します。カスタムエンドポイントを使用すると、アタッチするノードおよび読み取り整合性レベルを事前に指定できます。
カスタムエンドポイントで設定された整合性レベルは、そのエンドポイントへのすべての読み取りリクエストに適用されます。個別の API リクエスト内の ConsistentRead=true パラメーターでは、事前に設定された整合性レベルをオーバーライドできません。
DynamoDB アカウントの作成
DynamoDB API へのアクセスには、標準のデータベースアカウントではなく、専用の DynamoDB アカウントを使用します。アカウント名がアクセスキー ID として機能し、生成されたキーがシークレットアクセスキーとして機能します。
[設定と管理] > [アカウント] に移動し、[アカウントの作成] をクリックします。
[アカウントの種類] を [DynamoDB アカウント] に設定し、アカウント名とパスワードを入力します。
パスワードはコンソールでアカウントを管理するためにのみ使用され、API 認証には適用されません。

アカウントが作成された後、アカウント一覧でそのアカウントを探します。アカウント名は、お客様の AccessKey ID です。 [View] を [Key] 列でクリックして、Secret Access Key を取得します。

ネットワークアクセスの設定と接続の確認
ネットワークアクセスの設定
アプリケーションが実行されている場所に基づいて接続方法を選択します。
プライベート接続 (推奨):アプリケーションが PolarDB クラスターと同じ Virtual Private Cloud (VPC) 内の Alibaba Cloud Elastic Compute Service (ECS) インスタンスで実行されている場合は、ECS インスタンスの IP アドレスまたはセキュリティグループをクラスターのホワイトリストに追加します。
インターネット接続: ローカル開発およびテスト用に、[データベース接続] セクションの [基本情報] ページで DynamoDB エンドポイントのインターネットエンドポイントをリクエストします。
インターネット経由でクラスターにアクセスすると、セキュリティリスクが生じます。インターネットエンドポイントは、一時的な開発およびテスト目的でのみ使用し、完了したらリリースしてください。

Python (Boto3) での接続確認
次の例では、Alibaba Cloud Linux 3.2104 LTS 64 ビットを実行している ECS インスタンスで Boto3 SDK を使用して接続を確認します。
PolarDB の DynamoDB 互換機能に接続する場合、region_nameは空文字列 ("") に設定する必要があります。
プロジェクトディレクトリを作成します。
mkdir /home/testDynamoDB cd /home/testDynamoDB仮想環境を作成してアクティブ化し、プロジェクトの依存関係を分離します。
python3 -m venv myenv source myenv/bin/activateBoto3 をインストールします。
pip3 install boto3次のコードで
main.pyを作成します。endpoint_url、aws_access_key_id、およびaws_secret_access_keyを、ご利用の PolarDB クラスターのエンドポイントと DynamoDB アカウントの詳細に置き換えます。import boto3 from botocore.exceptions import ClientError # 1. 接続詳細の設定 # ご利用の PolarDB クラスターのエンドポイント URL endpoint_url = "http://<your-polardb-ddb-endpoint>:<port>" # ご利用の DynamoDB アカウントのアクセスキー ID aws_access_key_id = "<your-access-key-id>" # ご利用の DynamoDB アカウントのシークレットアクセスキー aws_secret_access_key = "<your-secret-access-key>" # PolarDB の DynamoDB 互換機能の場合、region_name は空文字列にする必要があります。 region_name = "" # 2. DynamoDB リソースクライアントの作成 dynamodb = boto3.resource( 'dynamodb', endpoint_url=endpoint_url, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, region_name=region_name, ) table_name = 'usertable' # 3. データベース操作用の関数の定義 def create_table(): """テーブルを作成します。すでに存在する場合は取得します。""" try: table = dynamodb.create_table( TableName=table_name, KeySchema=[{'AttributeName': 'userid', 'KeyType': 'HASH'}], # パーティションキー AttributeDefinitions=[{'AttributeName': 'userid', 'AttributeType': 'S'}] # ProvisionedThroughput は任意であり、PolarDB では無視されます ) print("Creating table... Waiting for it to become active.") table.meta.client.get_waiter('table_exists').wait(TableName=table_name) print("Table is active!") return table except ClientError as e: if e.response['Error']['Code'] == 'ResourceInUseException': print("Table already exists.") return dynamodb.Table(table_name) else: raise def put_items(table): """テーブルにいくつかの項目を挿入します。""" users = [ {'userid': 'user01', 'name': 'Alice', 'age': 24}, {'userid': 'user02', 'name': 'Bob', 'age': 30}, {'userid': 'user03', 'name': 'Charlie', 'age': 28} ] for user in users: table.put_item(Item=user) print("Inserted 3 items.") def scan_table(table): """テーブル内のすべての項目をスキャンして出力します。""" response = table.scan() items = response.get('Items', []) print(f"Scanned {len(items)} items:") for item in items: print(item) def delete_table(table): """テーブルを削除します。""" table.delete() print("Deleting table... Waiting for it to be removed.") table.meta.client.get_waiter('table_not_exists').wait(TableName=table_name) print("Table deleted successfully.") # 4. 検証プロセスの実行 if __name__ == '__main__': try: user_table = create_table() put_items(user_table) scan_table(user_table) finally: # エラーが発生した場合でもテーブルがクリーンアップされるようにします if 'user_table' in locals(): delete_table(user_table)スクリプトを実行します。このスクリプトは、テーブルを作成し、3 つの項目を挿入し、それらをスキャンしてからテーブルを削除します。
python3 main.py期待される出力は次のとおりです。
Creating table... Waiting for it to become active. Table is active! Inserted 3 items. Scanned 3 items: {'age': Decimal('24'), 'name': 'Alice', 'userid': 'user01'} {'age': Decimal('30'), 'name': 'Bob', 'userid': 'user02'} {'age': Decimal('28'), 'name': 'Charlie', 'userid': 'user03'} Deleting table... Waiting for it to be removed. Table deleted successfully.この出力は、接続が成功し、すべての設定が正しく機能していることを示します。
次のステップ
PolarDB for PostgreSQL でサポートされているDynamoDB API オペレーションをご確認ください。
本番環境のセキュリティを向上させるには、インターネット接続から VPC 内のプライベート接続に切り替えます。
読み取り整合性の動作をカスタマイズするには、カスタム DynamoDB エンドポイントを作成し、アプリケーションの要件に合わせて整合性レベルを設定します。