【发布时间】:2019-07-19 08:06:33
【问题描述】:
我一直在尝试使用 S3.Object.put() 方法以编程方式将 SNS 消息上传到 S3 存储桶,如下所示:
bucket_resource=boto3.resource('s3')
bucket_client = boto3.client('s3')
body = subject + message
object = bucket_resource.Object(bucket_name, folder+'/'+fn)
object.put(Body=body)
这不起作用,所以我尝试了以下方法来尝试将对象上传到特定的 S3 存储桶。
body = subject + message
folder = datetime.datetime.today().strftime('%Y-%m-%d')
fn = datetime.datetime.today().strftime('%H:%M:%S')
key = folder_name + '/' + fn
bucket_resource = s3.Bucket(bucket_name)
bucket.upload_file(body, key)
但是,这两种方法都默默地失败了。我没有收到任何拒绝访问、错误消息等,但我也没有将我的消息上传到存储桶。我不确定每次调用该函数会发生什么,如果以编程方式成功将文件上传到存储桶的人,我将不胜感激。
注意: 我有存储桶策略,我的帐户是唯一可以将对象放入存储桶的帐户。我是否需要附录来授予 Lambda 将对象放入存储桶的权限?
【问题讨论】:
-
为了防止异常被默默吞下,必须需要如下所示的 try/except 似乎是不可想象的。未处理的异常应该会导致崩溃。 (对吗?我的意思是……对吗?)您如何确认文件不存在?如果您记录它,
key的值会恢复吗?这是一个可以尝试的技巧:将存储桶名称设置为“上传”。这恰好是 AWS 在某种阻止或保留列表中的存储桶名称,当您尝试对其进行写入或读取时,该名称总是引发异常。如果 that 没有抛出异常,那我会很惊讶。 -
在第二个例子中,
bucket.upload_file(body, key)不应该是bucket_resource.upload_file(body, key)吗? -
@JohnRotenstein 实际上,它应该是 bucket_client.upload_file,这是我的疏忽。我有一个 try/except 来捕获文件是否已成功上传,并且我的日志告诉我,尽管没有键/值错误,但我没有将文件上传到 S3 存储桶。
-
在这种情况下,我建议从硬编码的
upload_file()命令开始,以确认它可以正常工作(例如bucket_resource.upload_file('abc','test.txt')。如果可以,那么问题出在身体或关键。如果它不起作用,那么您需要尝试找出问题所在。 -
我在使用
bucket_resource.upload_file()的地方看到了类似的东西......无法弄清楚问题是什么。
标签: python python-3.x amazon-web-services amazon-s3