Amazon DynamoDBは、高可用性とスケーラビリティを備えたNoSQLデータベースサービスです。
大量のデータを迅速に処理し、アプリケーションのパフォーマンスを最適化することが可能です。
しかし、その機能を最大限に活用するには、適切なツールと知識が必要です。
ここで登場するのが、AWSの公式Python SDKであるBoto3です。
Boto3を使用することで、DynamoDBを含むAWSサービスへのアクセスが簡単かつ効率的になります。
本記事の内容
- Boto3とは?
- アクセスキーとシークレットキーの取得方法
- Boto3によるDynamoDBへのアクセス
それでは、上記に沿って解説していきます。
Boto3とは?
Boto3とは、AWSの公式Python SDK(ソフトウェア開発キット)です。
AWSのほぼ全てのサービス(EC2、S3、DynamoDBなど)に対応しています。
Boto3を用いると、Pythonから直接AWSリソースを操作できるようになります。
このツールを使いこなすことで、次のことが格段に簡単かつ効率的になります。
- クラウドリソースの管理
- データの処理
- アプリケーションのデプロイメント
適切な知識とベストプラクティスを身につけることで、
AWSのエコシステム内での開発がより安全かつ生産的になります。
そのようなBoto3を利用するには、以下の情報が必要です。
- アクセスキー
- シークレットキー
アクセスキーとシークレットキーの取得方法
アクセス権限の管理方法としては、グループで管理することが推奨されています。
そのグループにユーザーを関連付けるという方法になります。
つまり、ユーザーに直接ポリシーを関連付けることはオススメではないということです。
そのため、まずはIAMダッシュボードを開きユーザーグループを作成します。
ここでは、そのまんまとなる「DynamoDB」という名前のユーザーグループを作ります。
このグループには、次のポリシーとアタッチします。
そして、このグループにユーザーを関連付けます。
ユーザーを新規で作成することにします。
そして、「許可を設定」画面では「ユーザーをグループに追加」を選択。
デフォルトで選択されていますけどね。
この状態で先ほど作成したグループを関連付けます。
この条件でユーザーを作成します。
ここまでだと、ユーザーが作成されただけです。
まだ、このユーザーにはAPIにアクセスする情報は発行されていません。
次に、アクセスキーを発行する作業を行います。
作成したユーザーの詳細画面を表示させます。
そこで、次のタブをクリック。
画面中央ぐらいに次のような項目を確認できます。
「アクセスキーを作成」ボタンをクリック。
遷移先では、以下の中からユースケースを選択することを促されます。
- コマンドラインインターフェイス (CLI)
- ローカルコード
- AWS コンピューティングサービスで実行されるアプリケーション
- サードパーティーサービス
- AWS の外部で実行されるアプリケーション
- その他
各自の利用状況に合わせてください。
今回は、ローカルPCからアクセスするので以下を選択。
そのまま処理を進めて、最後に次のボタンをクリック。
これで、アクセスキーとシークレットキーを取得できるようになりました。
Boto3によるDynamoDBへのアクセス
DynamoDBへの操作を一通り試してみましょう。
- 登録
- 照会
- 更新
- 削除
テーブルは事前に作成しておきましょう。
ここでは、次の記事内で作成した「dynamo_test」テーブルを用います。
あと、Boto3ライブラリのインストールも済ませておきます。
pip install boto3
登録
import boto3 from pprint import pprint # AWSの認証情報を設定(環境変数を使用する場合は不要) boto3.setup_default_session(aws_access_key_id='アクセスキー', aws_secret_access_key='シークレットーキー') # DynamoDBサービスリソースを取得 dynamodb = boto3.resource('dynamodb', region_name='ap-southeast-2') # 使用するテーブル名 table_name = 'dynamo_test' # テーブルリソースを取得 table = dynamodb.Table(table_name) # 登録するアイテムの内容 item = { 'id': 'abc', 'name': '名前', 'age': 30, 'email': 'example@example.com' } # アイテムをテーブルに追加 response = table.put_item(Item=item) # 結果を整えて表示 pprint(response)
上記を実行した結果は、以下。
{'ResponseMetadata': {'HTTPHeaders': {'connection': 'keep-alive', 'content-length': '2', 'content-type': 'application/x-amz-json-1.0', 'date': 'Mon, 22 Jan 2024 11:29:41 GMT', 'server': 'Server', 'x-amz-crc32': '2745614147', 'x-amzn-requestid': 'NM0TD20MOH111GLN3ENDBKU3NRVV4KQNSO5AEMVJF66Q9ASUAAJG'}, 'HTTPStatusCode': 200, 'RequestId': 'NM0TD20MOH111GLN3ENDBKU3NRVV4KQNSO5AEMVJF66Q9ASUAAJG', 'RetryAttempts': 0}}
HTTPStatusCodeには、「200」が表示されています。
AWSのコンソールで確認します。
ちゃんと登録できていますね。
照会
登録の次のコード以前をそのまま流用します。
# テーブルリソースを取得 table = dynamodb.Table(table_name)
次のコードにより、登録したデータを照会してみましょう。
# 取得したいアイテムのパーティションキーを指定 partition_key_value = 'abc' # アイテムを取得 response = table.get_item(Key={'id': partition_key_value}) # 取得したアイテムを表示 item = response.get('Item') if item: pprint(item) else: print('Item not found')
実行した結果は、以下。
{'age': Decimal('30'), 'email': 'example@example.com', 'id': 'abc', 'name': '名前'}
更新
登録の次のコード以前をそのまま流用します。
# テーブルリソースを取得 table = dynamodb.Table(table_name)
次のコードにより、更新を行います。
「age」を「30」から「35」に変更するコードです。
# 更新するアイテムのパーティションキーを指定 partition_key_value = 'abc' # 更新内容 update_expression = 'SET age = :val1' expression_attribute_values = {':val1': 35} # アイテムを更新 response = table.update_item( Key={'id': partition_key_value}, UpdateExpression=update_expression, ExpressionAttributeValues=expression_attribute_values, ReturnValues="UPDATED_NEW" ) # 結果を整えて表示 pprint(response)
上記を実行した結果は、以下。
{'Attributes': {'age': Decimal('35')}, 'ResponseMetadata': {'HTTPHeaders': {'connection': 'keep-alive', 'content-length': '33', 'content-type': 'application/x-amz-json-1.0', 'date': 'Mon, 22 Jan 2024 11:39:10 GMT', 'server': 'Server', 'x-amz-crc32': '3808874753', 'x-amzn-requestid': 'RUQS67LV02BMRPQMS6QADOU6MJVV4KQNSO5AEMVJF66Q9ASUAAJG'}, 'HTTPStatusCode': 200, 'RequestId': 'RUQS67LV02BMRPQMS6QADOU6MJVV4KQNSO5AEMVJF66Q9ASUAAJG', 'RetryAttempts': 0}}
返答を見ると、成功とのこと。
念のため、AWSのコンソールで確認。
削除
登録の次のコード以前をそのまま流用します。
# テーブルリソースを取得 table = dynamodb.Table(table_name)
削除するコードは、以下。
# 取得したいアイテムのパーティションキーを指定 partition_key_value = 'abc' # アイテムを削除 response = table.delete_item( Key={ 'id': partition_key_value } ) # 結果を整えて表示 pprint(response)
上記を実行した結果は、以下。
{'ResponseMetadata': {'HTTPHeaders': {'connection': 'keep-alive', 'content-length': '2', 'content-type': 'application/x-amz-json-1.0', 'date': 'Mon, 22 Jan 2024 11:42:50 GMT', 'server': 'Server', 'x-amz-crc32': '2745614147', 'x-amzn-requestid': 'ME58CA4TME8J2CEVDC0O0QURLNVV4KQNSO5AEMVJF66Q9ASUAAJG'}, 'HTTPStatusCode': 200, 'RequestId': 'ME58CA4TME8J2CEVDC0O0QURLNVV4KQNSO5AEMVJF66Q9ASUAAJG', 'RetryAttempts': 0}}
これだけだとよくわからないので、AWSのコンソールで確認しましょう。
何もヒットしません。