🔶

【AWS】Lambdaを使用しDynamoDBに読み書きする

2024/06/05に公開

はじめに

本記事ではLambdaを使用しDynamoDBに読み書きした手順を備忘録形式で残したものになります。
LambdaからDynamoDBに書き込み動作とDynamoDBに登録された内容をLambdaで取得する方法について記載いたします。

前提

実行に必要となるIAMポリシーは当たっていることを想定しています。

環境

Lambda(python 3.12)

DynamoDBの作成

次の記事のDynamoDB側の準備の手順に沿いDynamoDBのテーブルを作成します。
https://qiita.com/enumura1/items/8023a951a7b5276b49ea

パーティションキーとソートキーには任意のものを入力しておきます。

LambdaからDynmoDBへの書き込み

DynamoDBへ書き込むようにwrite-dynamodb-0605の名前でLambda関数を作成しました。
ソースは下記のとおりです。

lambda_function.py
import boto3
import time

def lambda_handler(event, context):
  try:
    # DynamoDBクライアントを作成
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('dynamoTable-0605')

    # DynamoDBに挿入するデータ
    item = {
      'dynamoid': 'testhogehgoe00',
      'string_value1': 'string_value11のデータ',
      'string_value2': 'string_value22のデータ',
      'json_value': {'key11': 'value11', 'key22': 'value22'},
      'timestamp': int(time.time())
    }

    # データを挿入
    table.put_item(Item=item)

    return {
      'statusCode': 200,
      'body': 'Data inserted successfully'
    }

  except Exception as e:
    return {
      'statusCode': 500,
      'body': f'Error inserting data: {str(e)}'
    }
イベントJSON
{
  "Records": [
    {
      "EventSource": "aws:dynamodb",
      "EventName": "INSERT",
      "Dynamodb": {
        "NewImage": {
          "dynamoid": {
            "S": "testhogehgoe"
          },
          "string_value1": {
            "S": "string_value1のデータ"
          },
          "string_value2": {
            "S": "string_value2のデータ"
          },
          "json_value": {
            "M": {
              "key1": {
                "S": "value1"
              },
              "key2": {
                "S": "value2"
              }
            }
          },
          "timestamp": {
            "N": "1659773200000"
          }
        }
      }
    }
  ]
}

Lambdaのテストから実行してみると3秒ほどで下記のようにレスポンスが返ってきました。

{
  "statusCode": 200,
  "body": "Data inserted successfully"
}

DynamoDBの対象のテーブルを確認してみると、データが更新されている事が確認できます。

DynmoDBに登録したデータをLambdaで取得する

DynamoDBのデータを取得する用のLambda関数をread-dynamodb-0605の名前で作成しました。
ソースは下記のとおりです。

lambda_function.py
import boto3
import json

def lambda_handler(event, context):
    try:
        # DynamoDBクライアントを作成
        dynamodb = boto3.resource('dynamodb')
        table = dynamodb.Table('dynamoTable-0605')
        responseall = table.scan()
        print(responseall)
        
        response = table.get_item(
            Key={
                #主キー情報を設定
                'dynamoid': 'testhogehgoe00',
                'timestamp': 1717517209
            }
        )
        print('レスポンスを出力')
        print(response)
        
        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 {
            'statusCode': 200,
            'body': 'Data processed successfully'
        }

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

Lambdaのテストから実行してみると3秒ほどで下記のようにレスポンスが返ってきました。

Response
{
  "statusCode": 200,
  "body": "Data processed successfully"
}

DynamoDBのテーブルに登録した結果がログに出力されていることを確認できます。

Function Logs
~~~
{'Items': [{'string_value1': 'string_value11のデータ', 'string_value2': 'string_value22のデータ', 'dynamoid': 'testhogehgoe00', 'json_value': {'key11': 'value11', 'key22': 'value22'}, 'timestamp': Decimal('1717517209')},
レスポンスを出力
{'Item': {'string_value1': 'string_value11のデータ', 'string_value2': 'string_value22のデータ', 'dynamoid': 'testhogehgoe00', 'json_value': {'key11': 'value11', 'key22': 'value22'}, 'timestamp': Decimal('1717517209')},
処理結果をログに出力
{'dynamoid': 'testhogehgoe00', 'string_value1': 'string_value11のデータ', 'string_value2': 'string_value22のデータ', 'json_value': {'key11': 'value11', 'key22': 'value22'}, 'timestamp': Decimal('1717517209')}
~~~

参考

Discussion