DynamoDBでは、RDBにあるオートカウンタの機能はありません。そのため、確実にユニークな値を生成するための機能は、自前で作る必要があります。そこで、オートカウンタの機能のかわりにアトミックカウンタを使って、ユニークな値を生成させる必要があります。
ユニークな値を生成には、更新時の排他が絶対的な処理となります。その排他をしながらデータをインクリメントするための機能として、”UpdateItem”というメソッドが用意されています。(Amazon DynamoDB アトミックカウンタ を参照)
(実現方法)
・IDカウンタ用のテーブルを定義します
・テーブルのカウンタを更新し、データを取得するLambda関数を用意します
・GraphQLもしくはAPI Gatewayを利用して、クライアントからアクセスできる様にします
API Gatewayを経由して、インクリメント・デクリメントの機能を組み込んだサンプルプログラムです。
import json
import boto3
import os
from decimal import Decimal
TABLE_NAME=os.environ['TABLE_NAME']
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(TABLE_NAME)
def lambda_handler(event, context):
print(event)
try:
Column = event['column']
UpdateType = event['UpdateType']
id = event['id']
incr = 0
if UpdateType == 'ADD':
incr=1
elif UpdateType == "DELETE":
incr=-1
response = table.update_item(
Key={
'id':id
},
UpdateExpression='ADD '+ Column +' :incr',
ExpressionAttributeValues={
':incr': incr
},
ReturnValues='ALL_NEW'
)
print(response)
# TODO implement
return {
'statusCode': 200
}
except ZeroDivisionError as e:
print(e)
print(type(e))
return {
'statusCode':500
}