it-swarm.com.de

FTP zu Google Storage

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?

6
CCC

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:

  • Wenn Sie mit der lokalen IP-Adresse auf den FTP-Server zugreifen können, nicht jedoch mit der Remote-IP, liegt dies möglicherweise daran, dass Sie die Firewall-Regeln nicht eingerichtet haben
  • Wenn Sie auf den FTP-Server zugreifen können, aber nicht schreiben können, liegt dies wahrscheinlich daran, dass Sie write_enable = YES benötigen
  • Wenn Sie versuchen, den Ordner zu lesen, den Sie unter/mnt erstellt haben, aber einen E/A-Fehler erhalten, liegt dies wahrscheinlich daran, dass der Bucket in gcsfs_config nicht richtig ist.

Ihr FTP-Client muss außerdem den Übertragungsmodus "passiv" verwenden.

2
CCC

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.

9
crazystick

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 ).

3
Lukasz Cwik

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.

0
user3688176