🐕

【AWS】GSIを使用しDynamoDBのクエリを実行する

2024/06/07に公開

はじめに

GSI(グローバリセカンダリインデックス)を使用したDynamoDBのクエリを実行について学習したので備忘録形式で本記事を作成いたしました。

GSIの作成

DynamoDB > テーブル > 対象のテーブル名 を開きインデックスタブを選択します。
インデックスの作成ボタンをクリック。

新たにGSIとして設定するパーティションキーとソートキーを入力し、画面下のインデックスの作成ボタンからGSIを作成します。
今回はgsi_hoge_maru_indexという名前でパーティションキーをhoge_maru、ソートキーをtimestampで作成しました。
GSIの作成には時間がかかるようですが本記事の場合、データ数は10個程度のテーブルでGSIを作成し5分ほどかかりました。

ソース

試しにあるhoge_maru属性に一致するものをDynamoDBのクエリで実行した後に、タイムスタンプでソートをかけて最新のデータを取得してみます。
詳細は下記ソースのコメントアウトの通りです。

lambda_function.py
import boto3
from boto3.dynamodb.conditions import Key

def lambda_handler(event, context):
    
    # DynamoDBの情報を定義
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('dynamo_quey_table')
    
    hogeid ='hoge_maru5'
    
    # Queryを実行してhoge_maruに一致する項目を取得
    response = table.query(
        IndexName='gsi_hoge_maru_index',  # GSI名を作成
        KeyConditionExpression=Key('hoge_maru').eq(hogeid), # hoge_maru属性を指定しhogeidと一致するものを取得
        ScanIndexForward=False,  # Falseで降順ソート(最新のtimestampが最初に来る)
        Limit=1  # 最新の1件のみ取得
    )
    
    # 最新の項目を取得
    items = response.get('Items', [])
    if not items:
        return {
            'statusCode': 404,
            'body': 'none'
        }
    print('items')
    print(items)
    
    latest_item = items[0]
    string_data1 = latest_item.get('stringData1', 'none')
    print('string_data1')
    print(string_data1)
    
    return {
        'statusCode': 200,
        'body': string_data1
    }

実行結果

dynamoDBの項目において、GUI操作でtimestampeを降順にしてみるとstring_value2500が最新のものであると確認できます。

lambdaの実行結果としてもこれが返ってくるか確認したところ、想定通りstring_value2500が返ってきました。

Response
START RequestId: ~~~
items
~~~
string_data1
string_value2500
~~~
Duration: ~~~

参考

Discussion