一部のファイルは毎日FTPサーバーにアップロードされますが、Google Cloud Storageの下にそれらのファイルが必要です。追加のソフトウェアをインストールするためにファイルをアップロードし、FTPクライアントを使用し続けるユーザーにバグを報告したくありません。 GCSをFTPサーバーとして使用する方法はありますか?そうでない場合、FTPロケーションから定期的にファイルを取得してGCSに入れるジョブを作成するにはどうすればよいですか?言い換えれば、それを行うための最良かつ最も簡単な方法は何ですか?
Google ComputeのVM(私の質問へのコメントで jkff で言及))でgcsfsを使用してGCSへのFTPプロキシを正常にセットアップしました。 http://ilyapimenov.com/blog/2015/01/19/ftp-proxy-to-gcs.html
ただし、いくつかの変更が必要です。
考えられるいくつかの問題:
また、ftpクライアントは、「パッシブ」に設定された転送モードを使用する必要があります。
たとえば、 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権限が必要です。
gsutil rsync またはオープンソース を使用して、FTPサーバーとGoogle Cloud Storageの間にcronとrsyncをセットアップできますrcloneツール 。
FTPサーバーでこれらのコマンドを定期的に実行できない場合は、FTPサーバーをローカルファイルシステムまたはドライブとしてマウントできます( Linux 、 Windows )
Google Cloudで* nixフレーバーを使用してVMを設定します。FTPを設定し、abcフォルダーを指定します。googleFuseを使用してGCSバケットとしてabcをマウントします。 -ソフトウェアを作成せずにgcs/ftpの間を行き来します(小さな印刷:あまりにも多くのデータをプッシュすると、Fuseがロールアップして停止するため、週に1回または1日1回定期的にバウンスします。また、マウントを設定する必要がありますまたはヒューズを使用して、すべてのユーザーにアクセス許可を許可します)