如何在进程B开始使用boto3将文件复制到AWS S3 Bucket B之前,确保进程A在AWS S3存储桶A中完全写入大文件(5 GB以上)?
答案 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,但是这两种方法对我来说都非常有效。