Google app engine FTP到谷歌存储

Google app engine FTP到谷歌存储,google-app-engine,google-cloud-platform,google-cloud-storage,google-cloud-dataflow,gcsfuse,Google App Engine,Google Cloud Platform,Google Cloud Storage,Google Cloud Dataflow,Gcsfuse,有些文件每天都会上传到FTP服务器,我需要在谷歌云存储下保存这些文件。我不想让上传文件的用户安装任何附加软件,让他们继续使用FTP客户端。 有没有办法将GCS用作FTP服务器?如果没有,我如何创建一个作业,定期从FTP位置拾取文件并将其放入GCS? 换句话说:什么是最好最简单的方法呢?你可以自己编写一个FTP服务器,上传到地面军事系统,例如基于 定义一个自定义处理程序,该处理程序在收到文件时存储到GCS import os from pyftpdlib.handlers import FTPHa

有些文件每天都会上传到FTP服务器,我需要在谷歌云存储下保存这些文件。我不想让上传文件的用户安装任何附加软件,让他们继续使用FTP客户端。 有没有办法将GCS用作FTP服务器?如果没有,我如何创建一个作业,定期从FTP位置拾取文件并将其放入GCS?
换句话说:什么是最好最简单的方法呢?

你可以自己编写一个FTP服务器,上传到地面军事系统,例如基于

定义一个自定义处理程序,该处理程序在收到文件时存储到GCS

import os
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
from pyftpdlib.authorizers import DummyAuthorizer
from google.cloud import storage

class MyHandler:
    def on_file_received(self, file):
        storage_client = storage.Client()
        bucket = storage_client.get_bucket('your_gcs_bucket')
        blob = bucket.blob(file[5:]) # strip leading /tmp/
        blob.upload_from_filename(file)
        os.remove(file)
    def on_... # implement other events

def main():
    authorizer = DummyAuthorizer()
    authorizer.add_user('user', 'password', homedir='/tmp', perm='elradfmw')

    handler = MyHandler
    handler.authorizer = authorizer
    handler.masquerade_address = add.your.public.ip
    handler.passive_ports = range(60000, 60999)

    server = FTPServer(("127.0.0.1", 21), handler)
    server.serve_forever()

if __name__ == "__main__":
    main()
我已经在Google容器引擎上成功地运行了这个程序(需要一些努力才能使被动FTP正常工作),但在计算引擎上应该非常简单。根据上述配置,在防火墙上打开端口21和端口60000-60999


要运行它,
python my_ftp_server.py
-如果您想监听端口21,您需要root权限。

您可以使用或开源在ftp服务器和Google云存储之间设置cron和rsync


如果您不能定期在FTP服务器上运行这些命令,您可以将FTP服务器装载为本地文件系统或驱动器(,)

我已在Google Compute的VM中使用gcsfs成功地为GCS设置了FTP代理(在对我的问题的评论中提到),并提供以下说明:

不过,需要进行一些更改:

  • 在/etc/vsftpd.conf中,将#write_enable=YES
    更改为 写入\启用=是
  • 在GC项目中添加防火墙规则以允许 访问端口21和无源端口15393至15592()
一些可能的问题:

  • 如果您可以使用本地ip而不是远程ip访问FTP服务器,可能是因为您没有设置防火墙规则
  • 如果您可以访问ftp服务器,但无法写入,可能是因为您需要write_enable=YES
  • 如果您试图读取在/mnt上创建的文件夹,但出现I/O错误,可能是因为gcsfs_config中的bucket不正确

此外,您的ftp客户端需要使用设置为“被动”的传输模式。

使用一些*nix风格在google云中设置VM。在其上设置ftp,并将其指向文件夹abc。使用google fuse将abc装载为地面军事系统存储桶。瞧-在地面军事系统/ftp之间来回移动,不编写任何软件。
(小字:如果推送的数据太多,fuse会卷起并消失,因此会定期反弹,每周或每天一次;此外,您可能需要设置装载或fuse以允许所有用户使用权限)

似乎有一种方法是在VM上设置FTP服务器,并使用gcsfs将此服务器连接到GCS,如这里所述-这对你有用吗?这个文件应该放在哪里?用户如何通过ftp客户端进行身份验证(主机名、用户、通行证是什么)?我认为crazystick建议用户以您喜欢的方式通过ftp服务器进行身份验证,并且您正在运行的ftp服务器具有将对象上载到GCS的凭据。因此,您向FTP服务器写入数据,FTP服务器将上传流转发到GCS。是的-查看pyftpdlib的文档,您将发现许多用于身份验证的选项。在上面的示例中,每个人都会使用用户名“user”和密码“password”连接到FTP服务器,所有文件都会以默认安全性转储到同一个GCS存储桶中。在计算引擎/容器引擎上运行会为您获取GCSThank的凭据谢谢。。。我知道我可能要求的太多了,但是这个文件应该放在哪里,需要在计算引擎中的VM中进行哪些配置更改?另外,是否应该考虑被动FTP和连接到外部IP?我添加了两个额外的配置选项,您可能希望在GCE上运行它。要让它自动启动,您必须为它编写一个systemd服务。这应该是非常琐碎的,并且有大量的资源来解释如何做到。我们做到了这一点,但是所有现成的FTP解决方案都会产生大量的间歇性错误。最后唯一有效的方法是pyftpdlib,我们在一个安装了熔丝的GCS上运行。我们也尝试过,但有时会出现gcsfuse断开连接的错误,因此我不建议您在生产使用时运行它。您如何将bucket源同步到什么位置?您需要将bucket作为文件系统安装到某个位置,例如使用GCS FUSE