web-dev-qa-db-ja.com

GoogleストレージへのFTP

一部のファイルは毎日FTPサーバーにアップロードされますが、Google Cloud Storageの下にそれらのファイルが必要です。追加のソフトウェアをインストールするためにファイルをアップロードし、FTPクライアントを使用し続けるユーザーにバグを報告したくありません。 GCSをFTPサーバーとして使用する方法はありますか?そうでない場合、FTPロケーションから定期的にファイルを取得してGCSに入れるジョブを作成するにはどうすればよいですか?言い換えれば、それを行うための最良かつ最も簡単な方法は何ですか?

8
CCC

Google ComputeのVM(私の質問へのコメントで jkff で言及))でgcsfsを使用してGCSへのFTPプロキシを正常にセットアップしました。 http://ilyapimenov.com/blog/2015/01/19/ftp-proxy-to-gcs.html

ただし、いくつかの変更が必要です。

  • /etc/vsftpd.confで#write_enable = YESを変更します
    to write_enable = YES
  • GCプロジェクトにファイアウォールルールを追加して、ポート21およびパッシブポート15393〜15592へのアクセスを許可します( https://console.cloud.google.com/networking/firewalls/list

考えられるいくつかの問題:

  • リモートIPではなくローカルIPを使用してFTPサーバーにアクセスできる場合、ファイアウォールルールを設定していない可能性があります。
  • Ftpサーバーにアクセスできるが書き込みできない場合、おそらくwrite_enable = YESが必要なためです。
  • / mntで作成したフォルダーを読み取りたいが、I/Oエラーが発生する場合は、おそらくgcsfs_configのバケットが正しくないためです。

また、ftpクライアントは、「パッシブ」に設定された転送モードを使用する必要があります。

3
CCC

たとえば、 pyftpdlib に基づいて、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 Container Engineで正常に実行しました(パッシブFTPを適切に機能させるには多少の努力が必要です)が、Compute Engineで実行するのはかなり簡単です。上記の構成に従って、ファイアウォールのポート21およびポート60000〜60999を開きます。

実行するには、python my_ftp_server.py-ポート21でリッスンする場合は、root権限が必要です。

10
crazystick

gsutil rsync またはオープンソース を使用して、FTPサーバーとGoogle Cloud Storageの間にcronとrsyncをセットアップできますrcloneツール

FTPサーバーでこれらのコマンドを定期的に実行できない場合は、FTPサーバーをローカルファイルシステムまたはドライブとしてマウントできます( LinuxWindows

3
Lukasz Cwik

Google Cloudで* nixフレーバーを使用してVMを設定します。FTPを設定し、abcフォルダーを指定します。googleFuseを使用してGCSバケットとしてabcをマウントします。 -ソフトウェアを作成せずにgcs/ftpの間を行き来します(小さな印刷:あまりにも多くのデータをプッシュすると、Fuseがロールアップして停止するため、週に1回または1日1回定期的にバウンスします。また、マウントを設定する必要がありますまたはヒューズを使用して、すべてのユーザーにアクセス許可を許可します)

1
user3688176