Google cloud platform 用于从SFTP服务器无服务器日志摄取(文件下载)的Google云平台解决方案
今天有一个问题,在我键入答案时被删除了(不知道为什么)。由于答案很长,我决定复制/重新创建它并提供我的答案。也许它会对某些人有用Google cloud platform 用于从SFTP服务器无服务器日志摄取(文件下载)的Google云平台解决方案,google-cloud-platform,google-cloud-firestore,google-cloud-functions,google-cloud-storage,sftp,Google Cloud Platform,Google Cloud Firestore,Google Cloud Functions,Google Cloud Storage,Sftp,今天有一个问题,在我键入答案时被删除了(不知道为什么)。由于答案很长,我决定复制/重新创建它并提供我的答案。也许它会对某些人有用 原来的问题是: 我们有一个SFTP服务器,Apache、Nginx和Wordpress日志都被转储在这个服务器上。我们希望将这些日志备份到云存储中,同时解析这些日志的内容并插入到BigQuery表中。我通常使用云函数(NodeJS或Python),这是我首先想到的解决方案 但是,云功能有一个触发器,如果我的目标是让程序持续监视/观察/侦听SFTP文件夹中的新文件,那
原来的问题是: 我们有一个SFTP服务器,Apache、Nginx和Wordpress日志都被转储在这个服务器上。我们希望将这些日志备份到云存储中,同时解析这些日志的内容并插入到BigQuery表中。我通常使用云函数(NodeJS或Python),这是我首先想到的解决方案 但是,云功能有一个触发器,如果我的目标是让程序持续监视/观察/侦听SFTP文件夹中的新文件,那么这个触发器就没有意义。如果我的要求不那么严格,我可以按计划触发它,比如每小时读取SFTP文件夹中的新文件。当新文件转储到云存储中时,云函数也可以在该部分工作,触发该函数对日志文件进行解析并插入到BigQuery 如果我坚持不断收听SFTP文件夹的要求,您能否建议一个更好的设计解决方案,以及为了实现这一点,我需要将GCP服务(除了云存储和BigQuery)组合在一起 如果要求不那么严格,我的解决方案是否足够好? 另外,我刚刚发现SFTP凭据具有只读权限。因此,通过添加后缀来重命名文件是毫无疑问的。我是否应该使用类似MemoryStore的缓存来记住哪些文件已完成?Longread 在我看来,这是一个很大的问题。解决方案不仅需要代码开发,还需要大量的设计思维和决策(包括一些折衷) 根据我的个人经验(我开发了两次这样的解决方案,并在生产中维护了它,等等),可以将云功能与一组GCP资源一起使用—secret manager、pubsub主题、firestore集合、服务帐户和它们的IAM等等。。。根据您的需求(我不知道细节)和上下文,您可能需要创建一个功能组件,该组件由几个不同的云功能组成(比如说两个到五个)。第二,如果您的文件很小(每个文件最多100万个),则每天的文件数量不大(几千或上万个文件),并且您有权在下载时从SFTP服务器删除原始文件 如果您没有这样的权限,那么应该有其他的流程来清理“旧”或“已下载”的文件。否则,最终解决方案将无法工作(当下载一个文件列表,而不是文件,而是一个文件列表需要540秒以上) SFTP是一个“被动”组件-如果新文件到达,它不会通知我们,因此我们这边应该有一些“主动”组件来发起到SFTP服务器的连接。这是一种“拉动式”交互,并且有规律性——即每10、15或20分钟——连接到SFTP服务器并检查是否有新的内容可下载 下一个。云函数是幂等函数,不可能仅在云函数中存储/保持文件下载的状态。应该有一些外部(相对于云功能)服务来维护每个文件下载过程的状态机。我用过消防车。它非常方便,并且具有非常小的延迟。firestore集合中的每个文档都反映了“文件下载过程”——一个状态机以及大量元数据、状态转换历史等等 云功能有两个重要限制: