質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

解決済

S3のファイル作成時にSNSからメールが2通飛んでしまう

Otazoman
Otazoman

総合スコア44

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

2回答

0評価

0クリップ

253閲覧

投稿2018/11/27 02:50

前提・実現したいこと

S3のファイルがアップロードされたタイミングでJSONのファイル名に該当する
DynamoDBのテーブルにJSONデータを書き込むLambdaFunctionを作成しています。
DynamoDBのテーブルにデータの書き込みが完了したタイミングでSNS経由でメールを
送信するようにしたいと考えております。

発生している問題

何とかSNS経由でメール送信するところまではできたのですが、S3にファイルをアップロードした
際に1通しか送信されないはずのメールが2通送信されてきてしまいます。
どの様に処理すれば処理が完了したタイミングで1通のメールが送信されるというように
できるでしょうか。
ご教示のほどお願いいたします。

該当のソースコード

python

import logging import boto3 import json import os import urllib import datetime LOGGER = logging.getLogger() LOGGER.setLevel(logging.INFO) dynamodb = boto3.resource('dynamodb') s3_res = boto3.resource('s3') s3_cl = boto3.client('s3') # Write 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 def translateJson(res): try: s=json.loads(res.decode('utf-8-sig')) return s except Exception as e: LOGGER.error(e) raise e # send message def sendmessage(subject,msg): try: sqs_arn = os.getenv('SQS_ARN') client = boto3.client('sns') request = { 'TopicArn': sqs_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: bucket_name = os.getenv('BUCKET_NAME') rep = s3_res.Bucket(bucket_name).objects.all() mg = '' for all_object in rep: file_name = all_object.key table_name=('.').join(file_name.split('.')[:-1]) 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' else: sb=u'Complete' cd = datetime.datetime.now() mg= mg + '\n' + u'EndTime:' + str(cd) sendmessage(sb,mg) return "end" except Exception as e: LOGGER.error(e) sb=u'ERROR' sendmessage(sb,e) raise e

試したこと

Lambdaのエディタで「テスト」とした場合は1通だけメールが送信されます。
S3にファイルをアップした際にメールが2通飛んできます。

  • Lambdaでテスト送信されるメール

Mail

item-content item EndTime:2018-11-27 02:24:14.801696
  • S3にファイルをアップロードした際に送信されるメール
    -- 1通目

Mail

item-content EndTime:2018-11-27 02:27:26.662573

 --2通目

Mail

item-content item EndTime:2018-11-27 02:27:27.544248

補足情報(FW/ツールのバージョンなど)

該当コードはLambdaのエディタで作成
python3.6

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。