FTP 到 Google 存储

问题描述 投票:0回答:5

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

google-app-engine google-cloud-platform google-cloud-storage google-cloud-dataflow gcsfuse
5个回答
13
投票

您可以自己编写一个上传到 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()

我已在 Google Container Engine 上成功运行此程序(需要付出一些努力才能使被动 FTP 正常工作),但在 Compute Engine 上执行起来应该非常简单。根据以上配置,在防火墙上开放21端口和60000-60999端口。

要运行它,

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


3
投票

您可以使用 gsutil rsync 或开源 rclone 工具在 FTP 服务器和 Google Cloud Storage 之间设置 cron 和 rsync

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


3
投票

在谷歌云中设置一个虚拟机,使用一些 *nix 风格。在其上设置 ftp,并将其指向文件夹 abc。使用 google fusion 将 abc 挂载为 GCS 存储桶。瞧 - 在 gcs / ftp 之间来回切换,无需编写任何软件。 (小字:如果您推送太多数据,保险丝就会卷起并消失,因此请定期反弹,每周一次或每天一次;您还可能需要设置安装或保险丝以允许所有用户的权限)


3
投票

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

但需要进行一些更改:

一些可能出现的问题:

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

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


1
投票

我正在使用 sftpgo - https://github.com/drakkan/sftpgo 服务, 它可以直接连接到 GCP/AWS 存储桶等。 它还具有用于管理和客户端使用的 Web 界面。

© www.soinside.com 2019 - 2024. All rights reserved.