LoginSignup
5
3

Python×DAX(DynamoDB Accelerator):初心者向け簡単チュートリアル

Posted at

はじめに

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で使う方法について解説する予定です。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3