前提・実現したいこと
S3のファイルがアップロードされたタイミングでJSONのファイル名に該当する
DynamoDBのテーブルにJSONデータを書き込むLambdaFunctionを作成しています。
DynamoDBのテーブルにデータの書き込みが完了したタイミングでSNS経由でメールを
送信するようにしたいと考えております。
発生している問題
何とかSNS経由でメール送信するところまではできたのですが、S3にファイルをアップロードした
際に1通しか送信されないはずのメールが2通送信されてきてしまいます。
どの様に処理すれば処理が完了したタイミングで1通のメールが送信されるというように
できるでしょうか。
ご教示のほどお願いいたします。
該当のソースコード
python
1import logging 2import boto3 3import json 4import os 5import urllib 6import datetime 7 8LOGGER = logging.getLogger() 9LOGGER.setLevel(logging.INFO) 10dynamodb = boto3.resource('dynamodb') 11s3_res = boto3.resource('s3') 12s3_cl = boto3.client('s3') 13# Write DynamoDB 14def put_item(writeitems,writetable): 15 try: 16 table = dynamodb.Table(writetable) 17 with table.batch_writer() as batch: 18 for i in range(len(writeitems)): 19 batch.put_item( 20 Item=writeitems[i] 21 ) 22 LOGGER.info("Completed registration") 23 return "end" 24 except Exception as e: 25 LOGGER.error(e) 26 raise e 27def translateJson(res): 28 try: 29 s=json.loads(res.decode('utf-8-sig')) 30 return s 31 32 except Exception as e: 33 LOGGER.error(e) 34 raise e 35# send message 36def sendmessage(subject,msg): 37 try: 38 sqs_arn = os.getenv('SQS_ARN') 39 client = boto3.client('sns') 40 request = { 41 'TopicArn': sqs_arn, 42 'Message': msg, 43 'Subject': subject 44 } 45 r = client.publish(**request) 46 return r 47 except Exception as e: 48 LOGGER.error(e) 49 raise e 50# main 51def lambda_handler(event, context): 52 try: 53 bucket_name = os.getenv('BUCKET_NAME') 54 rep = s3_res.Bucket(bucket_name).objects.all() 55 mg = '' 56 for all_object in rep: 57 file_name = all_object.key 58 table_name=('.').join(file_name.split('.')[:-1]) 59 response = s3_cl.get_object(Bucket=bucket_name, Key=file_name) 60 tabledata = response['Body'].read() 61 objItem = translateJson(tabledata) 62 stat = put_item(objItem,table_name) 63 LOGGER.info("Completed registration") 64 mg= mg + table_name + '\n' 65 else: 66 sb=u'Complete' 67 cd = datetime.datetime.now() 68 mg= mg + '\n' + u'EndTime:' + str(cd) 69 sendmessage(sb,mg) 70 return "end" 71 except Exception as e: 72 LOGGER.error(e) 73 sb=u'ERROR' 74 sendmessage(sb,e) 75 raise e
試したこと
Lambdaのエディタで「テスト」とした場合は1通だけメールが送信されます。
S3にファイルをアップした際にメールが2通飛んできます。
- Lambdaでテスト送信されるメール
1item-content 2item 3 4EndTime:2018-11-27 02:24:14.801696
- S3にファイルをアップロードした際に送信されるメール
-- 1通目
1item-content 2 3EndTime:2018-11-27 02:27:26.662573 4
--2通目
1item-content 2item 3 4EndTime:2018-11-27 02:27:27.544248
補足情報(FW/ツールのバージョンなど)
該当コードはLambdaのエディタで作成
python3.6
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/28 00:57
2018/12/06 06:55
2018/12/08 04:07