web-dev-qa-db-fra.com

FTP vers Google Storage

Certains fichiers sont téléchargés quotidiennement sur un serveur FTP et j'ai besoin de ces fichiers sous Google Cloud Storage. Je ne veux pas déranger les utilisateurs qui téléchargent les fichiers d'installer des logiciels supplémentaires et de les laisser continuer à utiliser leur client FTP. Est-il possible d'utiliser GCS en tant que serveur FTP? Sinon, comment puis-je créer un travail qui collecte périodiquement les fichiers à partir d'un emplacement FTP et les met dans GCS? En d'autres termes: quelle est la méthode la plus simple et la meilleure pour procéder?

6
CCC

J'ai réussi à configurer un proxy FTP sur GCS à l'aide de gcsfs dans un VM dans Google Compute (mentionné par jkff dans le commentaire de ma question), avec les instructions suivantes: http://ilyapimenov.com/blog/2015/01/19/ftp-proxy-to-gcs.html

Quelques changements sont nécessaires cependant:

Quelques problèmes possibles:

  • Si vous pouvez accéder au serveur FTP à l'aide de l'adresse IP locale, mais pas de l'adresse IP distante, c'est probablement parce que vous n'avez pas configuré les règles de pare-feu.
  • Si vous pouvez accéder au serveur FTP, mais ne parvenez pas à écrire, c'est probablement parce que vous avez besoin de write_enable = YES
  • Si vous essayez de lire sur le dossier que vous avez créé sur/mnt, mais que vous obtenez une erreur d'E/S, c'est probablement parce que le compartiment de gcsfs_config n'est pas correct.

De plus, votre client ftp doit utiliser le mode de transfert défini sur "passif".

2
CCC

Vous pouvez écrire vous-même un serveur FTP qui télécharge sur GCS, par exemple sur la base de pyftpdlib

Définir un gestionnaire personnalisé qui stocke dans GCS lorsqu'un fichier est reçu 

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

J'ai réussi à l'exécuter sur Google Container Engine (cela nécessite quelques efforts pour que le FTP passif fonctionne correctement), mais cela devrait être assez simple à faire avec Compute Engine. Selon la configuration ci-dessus, ouvrez le port 21 et les ports 60000 à 60999 sur le pare-feu.

Pour l'exécuter, python my_ftp_server.py - si vous souhaitez écouter sur le port 21, vous devez disposer des privilèges root.

9
crazystick

Vous pouvez configurer un cron et rsync entre le serveur FTP et Google Cloud Storage à l’aide de gsutil rsync ou de l 'outil open source rclone .

Si vous ne pouvez pas exécuter ces commandes sur le serveur FTP régulièrement, vous pouvez monter le serveur FTP en tant que système de fichiers local ou lecteur ( Linux , Windows ).

3
Lukasz Cwik

Configurez un VM dans le nuage Google, en utilisant une certaine saveur * nix. Configurez ftp dessus et pointez-le sur un dossier abc. Utilisez google Fuse pour monter abc en tant que compartiment GCS. Voilà - va et vient entre gcs/ftp sans écrire de logiciel. (Petits caractères: le fusible roule et meurt si vous transmettez trop de données, alors faites-le rebondir périodiquement, une fois par semaine ou une fois par jour; vous devrez peut-être définir le montage ou le fusible pour autoriser les autorisations de tous les utilisateurs)

0
user3688176