🌵

【AWS】Lambdaを使用しDynamoDBから値を取得する

2024/06/06に公開

はじめに

DynamoDBから取得した値をLambdaのlambda_handler関数のレスポンスとして返すところまでやってみました。今後見返せるように本記事を作成しております。
以前下記の記事を作成しておりましたが、こちらではDynamoDBから取得した値をログ出力までしかやっていなかったので、本記事ではDynamoDBから取得したをレスポンスとして返すところまで実施しました。

https://zenn.dev/enumura/articles/71d88d98bc7052

環境

python 3.12

対象のDynamoDB

画像のようにパーティションキーをdynamoid、ソートキーをtimestampとしたテーブルを作成しています。項目の詳細は下記の通りです。
dynamoid (文字列)、timestamp (数値)、json_value(JSON型)、string_value1 (文字列)、string_value2 (文字列)

ソース

以下はLambdaのソースになります。
詳細はコメントアウトの通りです。

lambda_function.py
import boto3
import json

def lambda_handler(event, context):
    try:
        # DynamoDBクライアントを作成
        dynamodb = boto3.resource('dynamodb')
        table = dynamodb.Table('dynamoTable-0605')
        
        response = table.get_item(
            Key={
                #主キー情報を設定
                'dynamoid': 'testhogehgoe00',
                'timestamp': 1717517209
            }
        )
        
        item = response.get('Item')
        
        # データが見つからない場合はエラーを返す
        if not item:
            return {
                'statusCode': 404,
                'body': 'Data not found'
            }

        # 取得したデータを処理
        processed_data = {
            'dynamoid': item['dynamoid'],
            'string_value1': item['string_value1'],
            'string_value2': item['string_value2'],
            'json_value': item['json_value'],
            'timestamp': item['timestamp']
        }

        print('処理結果をログに出力')
        print(processed_data)
        
        # 必要な文字列のみを抽出
        return_value = item['string_value1']

        return return_value

    except Exception as e:
        # エラーが発生した場合はエラーログを出力
        print(f'Error processing data: {e}')
        return {
            'statusCode': 500,
            'body': f'Error processing data: {str(e)}'
        }

実行 & 結果

Lambdaからテストを実行しレスポンスを確認すると、DynamoDBから取得した項目のうち指定した1つ(string_value1)がレスポンスとして出力されているのが確認できました。

Response
"string_value11のデータ"

おまけ:取得したデータによってレスポンス内容を変更してみる。

DBから取得した項目のデータが想定外だった場合の例として、データが空だった場合、またあるの文言の場合には特定の文言をレスポンスとして返すようにしてみます。

◆データが空だった場合

# 必要な文字列を取得
return_value = item.get('string_value1')

# 文字列が空だった場合
if not return_value:
    return_value = "値が空です"

return return_value

◆特定の文言だった場合

# 必要な文字列を取得
return_value = item.get('string_value1')

# 特定の文言(NG_WORD)だった場合
if return_value == "NG_WORD":
    return_value = "申し訳ございません。返答が難しいです。"

return return_value

Discussion