DynamoDBへのJSON投入用のLambda
前回にJSON作成用のEXCEL作成してDataPipeLineでのデータ投入を試したけれど
全然うまくいかないのでムキーという状態になったのですが、発想を変えてLambdaで
S3に保存されたファイルをトリガーに自動実行させてSNSでメールすればいいじゃん。
と考えて、試してみました。
S3に保存されたファイルをDynamoDBに取込むところまでは何とか準備できた。
んでこれをどう加工するかですな。SNS側も何とかできました。
が、S3保存トリガーだとなぜかメールが2通飛ぶんだよなぁ。LambdaのWebエディタからだと1回なのに、、S3トリガーだと2通飛ぶ、これ何でだろうなぁ。
誰か親切な方、教えていただけると幸いです、
そして相変わらずコードベタ貼り、SAMとか使っていないからGit管理できていないのが
その理由です。(苦笑
相変わらずpythonの型変換につまずきながらも何とか完成です。
とりあえずEXCELからデータ変換してWinSCPでデータアップロードしてDynamoDBに取込という一連の流れは何とか目途が立ちました。
さて、ここからは細かい部分とか修正だな。
全然うまくいかないのでムキーという状態になったのですが、発想を変えてLambdaで
S3に保存されたファイルをトリガーに自動実行させてSNSでメールすればいいじゃん。
と考えて、試してみました。
S3に保存されたファイルをDynamoDBに取込むところまでは何とか準備できた。
んでこれをどう加工するかですな。SNS側も何とかできました。
が、S3保存トリガーだとなぜかメールが2通飛ぶんだよなぁ。LambdaのWebエディタからだと1回なのに、、S3トリガーだと2通飛ぶ、これ何でだろうなぁ。
誰か親切な方、教えていただけると幸いです、
そして相変わらずコードベタ貼り、SAMとか使っていないからGit管理できていないのが
その理由です。(苦笑
import logging import datetime import logging import json import os import urllib import boto3 LOGGER = logging.getLogger() LOGGER.setLevel(logging.INFO) dynamodb = boto3.resource('dynamodb') s3_res = boto3.resource('s3') s3_cl = boto3.client('s3') client = boto3.client('lambda') # DynamoDBに書込み def put_item(writeitems,writetable): try: table = dynamodb.Table(writetable) with table.batch_writer() as batch: for i in range(len(writeitems)): batch.put_item( Item=writeitems[i] ) LOGGER.info("Completed registration") return "end" except Exception as e: LOGGER.error(e) raise e # S3で読込んだJSONを辞書型配列に変換 def translateJson(res): try: s=json.loads(res.decode('utf-8-sig')) return s 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() bucket_name = os.getenv('BUCKET_NAME') rep = s3_res.Bucket(bucket_name).objects.all() mg = u'◆targetTable:\n' objTables =[] icnt=0 for all_object in rep: file_name = all_object.key table_name=('.').join(file_name.split('.')[:-1]) objTables.append(table_name) response = s3_cl.get_object(Bucket=bucket_name, Key=file_name) tabledata = response['Body'].read() objItem = translateJson(tabledata) stat = put_item(objItem,table_name) LOGGER.info("Completed registration") mg= mg + table_name + '\n' icnt+=1 sb=u'処理終了' mg= mg + '\n' + u'count' + str(icnt) end = datetime.datetime.now() mg= mg + '\n' + u'START:' + str(st) mg= mg + '\n' + u'END:' + str(end) sendmessage(sb,mg) return "end" except Exception as e: LOGGER.error(e) raise e
相変わらずpythonの型変換につまずきながらも何とか完成です。
とりあえずEXCELからデータ変換してWinSCPでデータアップロードしてDynamoDBに取込という一連の流れは何とか目途が立ちました。
さて、ここからは細かい部分とか修正だな。
コメント