Python Boto3 - 如何在进程开始复制到另一个存储桶之前检查s3文件是否完全写入

时间:2018-05-24 17:47:47

标签: python amazon-s3 aws-lambda boto3

如何在进程B开始使用boto3将文件复制到AWS S3 Bucket B之前,确保进程A在AWS S3存储桶A中完全写入大文件(5 GB以上)?

3 个答案:

答案 0 :(得分:2)

如果在Amazon S3中创建新对象,则只会在上载完成后显示。在完成上传之前,其他流程将无法查看。

S3中的对象无法更新。相反,它们被替换为新对象。因此,如果一个对象正在被更新,它仍将作为旧对象出现在其他进程中。

最好的方法是通过Configuring Amazon S3 Event Notifications触发流程B.上传新对象后,S3可以触发Lambda函数(或发送通知),然后执行第二步。

答案 1 :(得分:1)

您绝对应该使用s3事件通知作为lambda函数的触发器,该函数将文件从Bucket A复制到Bucket B.触发器确保在文件完全上载后您的复制将开始。

此外,如果您还需要执行其他操作,则可以使用AWS步骤功能,您可以在其中定义流程的工作流程,例如:进程B将在进程A 2秒后启动,进程C和D将在进程B结束执行后并行执行,等等。

答案 2 :(得分:0)

我还可以上传多达40GB的内容。

由于我执行分段上传,因此我检查要写入的文件是否为 protected void gvGrammars_RowDeleting(object sender, GridViewDeleteEventArgs e) { GridViewRow row = (GridViewRow)gvGrammars.Rows[e.RowIndex]; string valor = row.Cells[0].Text; XDocument xdoc = XDocument.Load(Server.MapPath("voiceGrammar.grxml")); XNamespace ns = xdoc.Root.GetDefaultNamespace(); List<XElement> itemToDelete = xdoc.Descendants(ns + "rule") .Where(x => (string)x.Attribute("id") == "rule1").Select(y => y.Descendants(ns + "item").Where(z => z.FirstNode.ToString() == valor)).SelectMany(x => x).ToList(); for (int i = itemToDelete.Count - 1; i >= 0; i--) { itemToDelete[i].Remove(); } xdoc.Save(Server.MapPath("voiceGrammar.grxml")); } 。只有在完成所有操作后,才会关闭S3文件(对象)。

另一种方法是使用异步任务队列,例如Celery。任务完成后,您会收到通知。

我现在使用Golang,但是这两种方法对我来说都非常有效。