satsukiya
@satsukiya (Kazuo Sato)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

AWS lambda で作成したファイルをS3にuploadしようとがms単位で実行される

解決したいこと

AWS lambda にて bote3 を使ってS3にファイルをuploadしようとしています。
lambda内にて deploy -> テスト を実行すると ms単位で実行されてその都度S3にファイルがuploadされます。
cronやテストイベントの設定などで1回の実行で終わらせる方法はないでしょうか。

コード

lambda_function.py
import json
import urllib.parse
import boto3
import datetime
import random
import os

s3 = boto3.resource('s3')

def lambda_handler(event, context):

    # Get the object from the event and show its content type
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    try:
        bucket = s3.Bucket(bucket_name)
        key = 'test_' + datetime.datetime.now().strftime('%Y-%m-%d') + '.txt'
        file_contents = 'Lambda test'

        with open('/tmp/sample.txt', 'w') as fout:
            fout.write(file_contents)
            fout.write(datetime.datetime.now().strftime('%Y-%m-%d %H-%M-%S'))

        bucket.upload_file('/tmp/sample.txt', key)

        os.remove('/tmp/sample.txt')

    except Exception as e:
        print(e)
        raise e

    return {}
0

1Answer

質問内容はLambda関数がms単位で繰り返し実行されてしまうということでしょうか?
Lambda関数のトリガーはS3のイベントでしょうか?

もしそうであれば、Lambda内でもS3にファイルをアップロードしているので、それもトリガーになってしまって無限ループしているように見えます。
保存先のBucketを変えるか、S3のイベント通知の設定で「プレフィックス」や「サフィックス」を設定してイベント通知の対象になるオブジェクトを制限してみてはいかがでしょうか。

1Like

Comments

  1. @satsukiya

    Questioner

    @non_cal
    S3のイベント通知設定でpostを選択していました。
    コメントの通り無限ループになっていたので、postのチェックを外すと問題は解決しました。

    初歩的なこと聞いて申し訳ないです。
  2. S3+Lambdaの無限ループは結構やりがちな罠で、放っておくととんでもない請求が来たりするので解決できてよかったです😃
  3. @satsukiya

    Questioner

    > S3+Lambdaの無限ループは結構やりがちな罠で、放っておくととんでもない請求が来たりするので解決できてよかったです😃

    おお、こわwww

Your answer might help someone💌