LambdaでキーのみのDynamoDBテーブルを作成させてみた
業務で色々とDynamoDBをもてあそぶ機会があるんですが、DynamoDBのテーブル設定するのが面倒くさいのとキーのところのコピペがうまくいかなかったりと、なんだかイライラとするところが多くて、これ何とかなんないのかと思って、少し調べました。
既にデータをインポートするところは作っているのでキーだけを付与するDynamoDB作成用のツールがほしかったわけです。ググってコピペって完成です。いつも通り
とりあえず個人で使用するので環境変数を書き替えてLambdaのコンソールで[テスト]ってすれば動くようになっています。後は単独ハッシュキーのプライマリキーかハッシュ+ソートの複合プライマリーキーを設定して作成できるようにしています。セカンダリ―インデックスは使用しないので今回は対象外です。そしてオンデマンドです。
エラー処理はほぼないです。相変わらずのへぼちんです。そして追加ライブラリはなしです。一応、Lambdaのpython3.8ランタイムで動きました。
■ソースコード
■参考サイト
https://michimani.net/post/aws-operate-dynamodb-by-python/#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.create_table
https://www.yamamanx.com/dynamodb-daily-create-delete/
これでちまちまテーブルを作らなくてよくなったので少しだけ楽になったかなぁと思いました。
既にデータをインポートするところは作っているのでキーだけを付与するDynamoDB作成用のツールがほしかったわけです。ググってコピペって完成です。いつも通り
とりあえず個人で使用するので環境変数を書き替えてLambdaのコンソールで[テスト]ってすれば動くようになっています。後は単独ハッシュキーのプライマリキーかハッシュ+ソートの複合プライマリーキーを設定して作成できるようにしています。セカンダリ―インデックスは使用しないので今回は対象外です。そしてオンデマンドです。
エラー処理はほぼないです。相変わらずのへぼちんです。そして追加ライブラリはなしです。一応、Lambdaのpython3.8ランタイムで動きました。
■ソースコード
import datetime
import logging
import json
import os
import urllib
import boto3
LOGGER = logging.getLogger()
LOGGER.setLevel(logging.INFO)
dynamodb = boto3.resource('dynamodb')
# DynamoDB
def make_table(table_name,key_name,tag_value):
try:
if type(key_name) is str:
attrdef = [{ 'AttributeName': key_name ,'AttributeType': 'S'}]
keyschem = [{ 'AttributeName': key_name ,'KeyType': 'HASH'}]
elif len(key_name) == 2:
attrdef = [
{ 'AttributeName': key_name[0] ,'AttributeType': 'S'},
{ 'AttributeName': key_name[1] ,'AttributeType': 'S'}
]
keyschem = [
{ 'AttributeName': key_name[0] ,'KeyType': 'HASH'},
{ 'AttributeName': key_name[1] ,'KeyType': 'RANGE'}
]
else:
return False
tagskeyval = {'Key': 'Billing','Value': tag_value}
response = boto3.client('dynamodb').create_table(
AttributeDefinitions=attrdef,
TableName=table_name,
KeySchema=keyschem,
BillingMode='PAY_PER_REQUEST',
Tags=[tagskeyval]
)
LOGGER.info("Completed registration")
return True
except Exception as e:
LOGGER.error(e)
raise e
# SNS
def sendmessage(subject,msg):
try:
sns_arn = os.getenv('SNS_ARN')
client = boto3.client('sns')
request = {
'TopicArn': sns_arn,
'Message': msg,
'Subject': subject
}
r = client.publish(**request)
return r
except Exception as e:
LOGGER.error(e)
raise e
# main
def lambda_handler(event, context):
try:
st = datetime.datetime.now()
mg = u'◆作成テーブル:\n'
tablename = os.getenv('TABLE_NAME')
tagvalue = os.getenv('TAG_VALUE')
#keyname = 'base_search_key'
k1 = os.getenv('KEY_NAME1')
k2 = os.getenv('KEY_NAME2')
str_keyname =k1
if len(k2) != 0:
list_keyname =[k1,k2]
stat = make_table(tablename,list_keyname,tagvalue)
else:
stat = make_table(tablename,str_keyname,tagvalue)
LOGGER.info("Completed registration")
mg= mg + tablename + '\n'
sb=u'処理終了'
end = datetime.datetime.now()
sendmessage(sb,mg)
return True
except Exception as e:
LOGGER.error(e)
raise e
■参考サイト
https://michimani.net/post/aws-operate-dynamodb-by-python/#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.create_table
https://www.yamamanx.com/dynamodb-daily-create-delete/
これでちまちまテーブルを作らなくてよくなったので少しだけ楽になったかなぁと思いました。
コメント