Einige Dateien werden täglich auf einen FTP-Server hochgeladen, und ich benötige diese Dateien unter Google Cloud Storage. Ich möchte nicht, dass die Benutzer, die die Dateien hochladen, Fehler verursachen, um zusätzliche Software zu installieren, und dass sie ihren FTP-Client weiterhin verwenden dürfen. Wenn nicht, wie kann ich einen Job erstellen, der die Dateien in regelmäßigen Abständen von einem FTP-Speicherort abholt und in GCS speichert?
Ich habe erfolgreich einen FTP-Proxy für GCS eingerichtet, der gcsfs in einem VM in Google Compute verwendet (erwähnt von jkff im Kommentar zu meiner Frage), mit diesen Anweisungen: http://ilyapimenov.com/blog/2015/01/19/ftp-proxy-to-gcs.html
Einige Änderungen sind jedoch erforderlich:
Einige mögliche Probleme:
Ihr FTP-Client muss außerdem den Übertragungsmodus "passiv" verwenden.
Sie könnten sich selbst einen FTP-Server schreiben, der auf GCS hochgeladen wird, beispielsweise basierend auf pyftpdlib
Definieren Sie einen benutzerdefinierten Handler, der beim Empfang einer Datei im GCS gespeichert wird
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 __== "__main__":
main()
Ich habe dies erfolgreich auf der Google Container Engine ausgeführt (dies erfordert einige Anstrengungen, um passives FTP ordnungsgemäß auszuführen), aber es sollte ziemlich einfach für die Compute Engine sein. Öffnen Sie gemäß der obigen Konfiguration Port 21 und Ports 60000 - 60999 in der Firewall.
Um es auszuführen, python my_ftp_server.py
- wenn Sie Port 21 abhören möchten, benötigen Sie Root-Berechtigungen.
Sie können einen cron und rsync zwischen dem FTP-Server und Google Cloud Storage einrichten, indem Sie gsutil rsync oder Open Source rclone tool verwenden.
Wenn Sie diese Befehle nicht regelmäßig auf dem FTP-Server ausführen können, können Sie den FTP-Server als lokales Dateisystem oder Laufwerk einbinden ( Linux , Windows ).
Richten Sie in der Google Cloud eine VM mit einer * nix-Variante ein. Richten Sie ftp darauf ein und verweisen Sie auf einen Ordner abc. Verwenden Sie Google Fuse, um abc als GCS-Bucket zu installieren. Voila - hin und her zwischen gcs/ftp ohne schreiben einer software. (Kleingedrucktes: Die Sicherung läuft auf und stirbt ab, wenn Sie zu viele Daten übertragen. Sie sollten daher regelmäßig, einmal pro Woche oder einmal pro Tag abprallen lassen. Möglicherweise müssen Sie auch das Mount oder die Sicherung setzen, um allen Benutzern Berechtigungen zu gewähren.