はじめに
AWS DynamoDBは、スケーラブルで柔軟性が高く、パフォーマンスに優れたNoSQLデータベースサービスです。DynamoDB Accelerator(DAX)は、DynamoDBをより高速に扱うことができるサービスです。
しかし、PythonとDAXの組み合わせに関する解説記事は少なく、ハードルが高いかもしれません。
よって本記事ではPythonを使ったDAXの基本的な利用方法をわかりやすく紹介します。
前回の解説記事であるPython×DynamoDBに内容が似ています。
また「Python×AWSのDB」の解説記事は全3つを予定しており、最後はPython×Elasticache Redisを予定しています。
内容
事前準備
まずDynamoDBにアクセスするために、AWSのアカウントのアクセスキーとシークレットキーを環境変数に設定します。
$ export AWS_ACCESS_KEY_ID={アクセスキー}
$ export AWS_SECRET_ACCESS_KEY={シークレットキー}
DAXとの接続
DAXを扱うためにamazon-dax-client
ライブラリをインストールします。
(仮想環境)% pip install amazon-dax-client
次にDAXとの接続をします。
DynamoDBのテーブル名とDAXのエンドポイントを準備しておきます。
ポートは基本8111
番のポートが開放されていますが、暗号化している場合は9111
番のポートが開放されています。
クラスターエンドポイントやポート番号はAWS CLIを用いて以下のように確認することができます。
% aws dax describe-clusters
DAXとの接続のためのプログラムは以下です。
from amazondax import AmazonDaxClient
dax_endpoint = "エンドポイント"
dax_port = 8111 #暗号化している場合は9111
# DAXクライアントの初期化
dax = AmazonDaxClient.resource(
endpoint_url=f'daxs://{dax_endpoint}:{dax_port}',
)
table = dax.Table('テーブル名')
余談ですが、DynamoDBと同様、EC2からの作業だとVPCエンドポイントが設定されていない場合はインターネットゲートウェイを用いてDynamoDBに接続されるので注意が必要です。
本筋とは離れますが、DAXを扱うためには適切な権限とセキュリティーグループの設定が必要です。以下を参考にしてください。(公式ドキュメントでポート番号が8111
となっている箇所は、暗号化している場合は9111
となるので注意してください。)
データの書き込み&データの読み込み
上記の記事とプログラムや注意事項は同様です。プログラムのみを記載しておきます。
###
# データの書き込み
###
from decimal import Decimal
def convert_floats_to_decimals(obj):
"""
float->Decimalに変換する関数
"""
if isinstance(obj, list):
return [convert_floats_to_decimals(x) for x in obj]
elif isinstance(obj, dict):
return {k: convert_floats_to_decimals(v) for k, v in obj.items()}
elif isinstance(obj, float):
return Decimal(str(obj))
else:
return obj
data = {'Id':1, 'value': 3.5} #保存したいデータ
data = convert_floats_to_decimals(data) #float->Decimalに変換
table.put_item(Item=value) #DynamoDBへ書き込み
###
# データの読み込み
###
def convert_decimals_to_floats(obj):
"""
Decimal->floatに変換する関数
"""
if isinstance(obj, list):
return [convert_decimals_to_floats(x) for x in obj]
elif isinstance(obj, dict):
return {k: convert_decimals_to_floats(v) for k, v in obj.items()}
elif isinstance(obj, Decimal):
return float(obj)
else:
return obj
key ={'Id': '1'} #プライマリーキーはId
response = table.get_item(Key=key) #DynamoDBの読み込み
response = convert_decimals_to_floats(response) #Decimal->float変換
おわりに
いかがだったでしょうか。
上記のようにDAXはDynamoDBと同様にPythonで簡単に扱うことができます!
参考になれば幸いです。
次回はElasticache RedisをPythonで使う方法について解説する予定です。