速攻で理解!PythonでDynamoDBを使うための実践ステップ

速攻で理解!PythonでDynamoDBを使うための実践ステップ プログラミング

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のコンソールで確認しましょう。

何もヒットしません。

タイトルとURLをコピーしました