FTP到谷歌存储

CCC*_*CCC 8 google-app-engine google-cloud-storage google-cloud-platform google-cloud-dataflow gcsfuse

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

cra*_*ick 10

您可以自己编写一个上传到GCS的FTP服务器,例如基于pyftpdlib

定义一个自定义处理程序,在收到文件时存储到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()
Run Code Online (Sandbox Code Playgroud)

我已成功在Google容器引擎上运行它(它需要一些努力才能使被动FTP正常工作)但在Compute Engine上应该非常简单.根据上述配置,在防火墙上打开端口21和端口60000-60999.

要运行它,python my_ftp_server.py- 如果你想在端口21上侦听,你将需要root权限.


CCC*_*CCC 3

我已经在 Google Compute 的虚拟机中使用 gcsfs 成功设置了 GCS 的 FTP 代理(jkff在我的问题的评论中提到),具体说明如下: http: //ilyapimenov.com/blog/2015/01/19/ ftp-proxy-to-gcs.html

但需要进行一些更改:

一些可能出现的问题:

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

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