Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Lambda函数在S3中创建并上载文件_Python_Amazon Web Services_Amazon S3_Aws Lambda - Fatal编程技术网

Python 使用Lambda函数在S3中创建并上载文件

Python 使用Lambda函数在S3中创建并上载文件,python,amazon-web-services,amazon-s3,aws-lambda,Python,Amazon Web Services,Amazon S3,Aws Lambda,我正在编写一个Lambda函数来创建一个文本文件并上传到一个特定的S3目录 import boto3 import os def lambda_handler(event, context): src_bucket = event['Records'][0]['s3']['bucket']['name'] filepath = event['Records'][0]['s3']['object']['key'] head, tail = os.path.split(f

我正在编写一个Lambda函数来创建一个文本文件并上传到一个特定的S3目录

import boto3
import os

def lambda_handler(event, context):
    src_bucket = event['Records'][0]['s3']['bucket']['name']
    filepath = event['Records'][0]['s3']['object']['key']

    head, tail = os.path.split(filepath)
    new_head = head.replace("/", "").upper()
    new_filename = "_".join((new_head, tail))

    s3_client = boto3.client('s3')
    s3 = boto3.resource('s3')

    string = "dfghj"
    encoded_string = string.encode("utf-8")

    file_name = "_".join(('ErrorLog', os.path.splitext(new_filename)[0]+'.txt'))
    print(file_name)
    s3_path = (head + '/errorlog/') + file_name
    print(s3_path)

    s3.Bucket(src_bucket).put_object(Key=s3_path, Body=encoded_string)
它执行时没有任何错误。但是,它会进入一个无限循环,并继续使用errorlog/filename创建子文件夹

例如,如果文件名=ErrorLog\u test1.txt和s3\u path=folder1/ErrorLog/ErrorLog\u test1.txt,它会在文件名的内部不断创建子文件夹作为ErrorLog。比如folder1/errorlog/errorlog/errorlog/errorlog\u test1.txt


如何阻止它创建递归文件夹?我认为我在设置s3_路径对象时犯了错误。

您似乎已在Amazon s3 bucket上配置了一个事件,以便在创建对象时触发Lambda函数

创建对象时,将触发Lambda函数。Lambda函数创建一个S3对象。这个触发器和事件,它触发Lambda函数,该函数创建一个对象。。。是的,它是一个无限循环,直到达到某个极限


我不确定您正在对这些对象执行什么操作,但最安全的方法是将事件配置为仅触发给定路径子文件夹。然后,配置Lambda函数以在不同路径中创建新文件,这样它就不会再次触发事件。

您似乎已在Amazon S3 bucket上配置了一个事件,以便在创建对象时触发Lambda函数

创建对象时,将触发Lambda函数。Lambda函数创建一个S3对象。这个触发器和事件,它触发Lambda函数,该函数创建一个对象。。。是的,它是一个无限循环,直到达到某个极限


我不确定您正在对这些对象执行什么操作,但最安全的方法是将事件配置为仅触发给定路径子文件夹。然后,配置Lambda函数以在不同的路径中创建新文件,这样它就不会再次触发事件。

John,完全有道理。谢谢你的解释。我尝试用不同的路径创建文件,如下所示:s3_path='errorlog/'+file_name,它仍然创建多个文件,然后抛出一个错误调用PutObject操作时出现错误KeyTooLongError:您的密钥太长:ClientError。我正在尝试对传入文件执行数据验证,并在同一文件路径中创建错误日志文件。另一个选项是让Lambda函数查看传入的密钥文件名。如果它是Lambda函数先前创建的错误日志,那么它只需退出Lambda函数而不创建另一个对象。这将成功地使情况短路,而不必改变路径。约翰,完全有道理。谢谢你的解释。我尝试用不同的路径创建文件,如下所示:s3_path='errorlog/'+file_name,它仍然创建多个文件,然后抛出一个错误调用PutObject操作时出现错误KeyTooLongError:您的密钥太长:ClientError。我正在尝试对传入文件执行数据验证,并在同一文件路径中创建错误日志文件。另一个选项是让Lambda函数查看传入的密钥文件名。如果它是Lambda函数先前创建的错误日志,那么它只需退出Lambda函数而不创建另一个对象。这将成功地使情况短路,而无需改变路径。