AWS
Lambda(Python)でDynamoDBを扱う

準備

LambdaからDynamoDBにテーブル作る事もできるけど、今回は事前にDynamoDBにアクセスしてtestと言う名前で以下のようなテーブルを作成した

LambdaからDynamoDBを読み込む

Lambdaで関数を作成する。Pythonは3.7。ロールは、DynamoDBにアクセスできるようにポリシーを割り当てておく。AmazonDynamoDBFullAccesswithDataPipeline を面倒だったので割り当てて適当に名前を付けて作成。

関数は以下。boto3 をimport すればdynamoDBを扱えるので、モジュールを用意してパッケージ化とか必要ない。


import boto3

dynamodb = boto3.resource('dynamodb') #使うリソースを選んでおく
 
def lambda_handler(event, context):
    table_name = "test" #テーブル名
    primary_key = {"primary": event["primary"]} #テーブル名
    dynamotable = dynamodb.Table(table_name)
    res = dynamotable.get_item(Key=primary_key) #指定したprymaryで検索して結果を取得
    item = res["Item"] #要素を指定してないので全部

    return item


テストイベントは helloworld のイベントテンプレでいいので適当に名前を付けて以下を設定


{
  "primary": "みかん"
}

保存してテストをして、結果に以下が帰ってきていれば成功


Response:
{
  "primary": "みかん",
  "eat": "食べてない"
}

LambdaからDynamoDBを更新する

参照するときは get.item を使ったが、update_itemを使う。テストは参照の時に定めたものを使用


import boto3
dynamodb = boto3.resource('dynamodb')
 
def lambda_handler(event, context):
    table_name = "test"
    primary_key = {"primary": event["primary"]}
    dynamotable = dynamodb.Table(table_name)
    response = dynamotable.update_item(
        Key=primary_key,
        UpdateExpression="set eat = :eat",#更新式 set 更新したい値 = :名前 を入れる 名前は:がついてればなんでもいい
        ExpressionAttributeValues={
            ':eat': '食べた'#先ほどつけた名前と更新内容を記述
            
        })
    res = dynamotable.get_item(Key=primary_key)#更新されたかチェックするためデータを取得
    item = res["Item"]
    return item


保存してテストをして、結果に以下が帰ってきていれば成功


Response:
{
  "primary": "みかん",
  "eat": "食べた"
}

参考

いやぁ。。。疲れた。色々と記事を見てチャレンジしてたけど、いまいちうまくいかなくて、結局AWSのドキュメントを見てやったらうまくいった。lambdaからコピペで移してきてるけど、うまくいかない場合は、AWSの上記ページの例から作成するとうまくいくと思う