🐕
【AWS】GSIを使用しDynamoDBのクエリを実行する
はじめに
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