BBH
-Biz Branding Hub-
投稿日 : 
2019/12/01
更新日 : 
2019/12/01

【AWS】LambdaでDynamoDBにレコードを挿入するサンプル(python)

ソースコード

put_item_dynamo.py

import botocore
import boto3
from boto3.dynamodb.conditions import Key, Attr
dynamodb = boto3.resource('dynamodb')

# ①boto3からdynamoClientオブジェクトを生成
dynamoClient = boto3.client('dynamodb')

def put_item_dynamo():
    tableName = 'YourDynamoDBName'
    val1 = 'abc'
    val2 = 'efg'
    val3 = 'hij'
    val4 = 1
    
    # ②挿入するアイテムをdictionary形式で生成
    item = {
        'column_1' : {'S' : val1},
        'column_2' : {'S' : val2},
        'column_3' : {'S' : val3},
        'column_4' : {'N' : str(val4)}   # @数値型は文字列型にキャストする必要あり
    }

    # ③一意制約オプション( column_1 と colmun_2 の複合主キーで制約)
    condition = 'attribute_not_exists({0}) AND attribute_not_exists({1})'.format('column_1', 'column_2')
    
    # ④レコード挿入実行
    try:
        response = dynamoClient.put_item(
            TableName=tableName,
            Item=item,
            ConditionExpression=condition
        )
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
            print('一意制約違反のため、DynamoDbへの挿入失敗。すでに同様のキーのレコードが存在します。' + \
            'TableName={0}, Item={1}, ConditionExpression={2}'.format(tableName, item, condition))
            return True
        else:
            print('DynamoDB挿入中に想定外のエラーが発生しました。' + \
            'TableName={0}, Item={1}, ConditionExpression={2}, Error={3}'.format(tableName, item, condition, e))
            return False

    print('Dynamoに挿入完了。item={0}, response={1}'.format(str(item), response))
    return True

解説

概要

手順としては簡単です。
①boto3からdynamoClientオブジェクトを生成
②挿入するアイテムをdictionary形式で生成
③一意制約オプションを設定(任意)
④dynamoClientを利用して、レコードを挿入

以下注意が必要な部分だけ詳細を記載します。

②挿入するアイテムをdictionary形式で生成

まず、dictionary形式で挿入するアイテムのオブジェクトを生成します。
keyはカラム名でvalueは挿入したい値になります。
valueの方は、さらにオブジェクトが入れ子になっており、{データタイプ、 値}となっているので注意が必要です。
データ型の設定については以下を参照ください。

一部抜粋

Item={
  'string':{  # カラム名
    'S':'string',
    'N':'string',
    'B':b'bytes',
    'SS':[
      'string',
    ],
    'NS':[
      'string',
    ],
    'BS':[
      b'bytes',
    ],
    'M':{
     'string':{'...recursive...'}
    },
    'L':[
      {'...recursive...'},
    ],
    'NULL':True|False,
    'BOOL':True|False
}

また、数値は文字列にキャストする必要があったりとデータ型によって対応が異なってくるため、ここも注意が必要です。

③一意制約オプションを設定(任意)

サンプルでは一意制約を設定していますが、ここの制約はいろいろな設定ができます。
詳しくは以下を参照下さい。

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend