it-swarm.dev

FTP para o armazenamento do Google

Alguns arquivos são enviados diariamente para um servidor FTP e eu preciso desses arquivos no Google Cloud Storage. Eu não quero incomodar os usuários que fazem o upload dos arquivos para instalar qualquer software adicional e apenas deixá-los continuar usando seu cliente FTP. Existe uma maneira de usar o GCS como um servidor FTP? Se não, como posso criar um trabalho que periodicamente pegue os arquivos de um local de FTP e os coloque no GCS? Em outras palavras: qual é a melhor e mais simples maneira de fazer isso?

6
CCC

Eu configurei com sucesso um proxy FTP para o GCS usando gcsfs em um VM no Google Compute (mencionado por jkff no comentário à minha pergunta), com estas instruções: http://ilyapimenov.com/blog/2015/01/19/ftp-proxy-to-gcs.html

Algumas mudanças são necessárias:

Alguns problemas possíveis:

  • Se você pode acessar o servidor FTP usando o ip local, mas não o ip remoto, provavelmente é porque você não configurou as regras do firewall
  • Se você pode acessar o servidor ftp, mas não consegue escrever, provavelmente é porque você precisa do write_enable = YES
  • Se você está tentando ler na pasta criada em/mnt, mas recebe um erro de E/S, provavelmente é porque o intervalo em gcsfs_config não está correto.

Além disso, o seu cliente ftp precisa usar o modo de transferência definido como "passivo".

2
CCC

Você pode escrever um servidor FTP que carregue para o GCS, por exemplo, baseado em pyftpdlib

Definir um manipulador personalizado que armazena no GCS quando um arquivo é recebido 

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

Eu gerenciei isso com sucesso no Google Container Engine (é necessário algum esforço para fazer com que o FTP passivo funcione corretamente), mas deve ser bem simples de fazer no Compute Engine. De acordo com a configuração acima, abra a porta 21 e as portas 60000 - 60999 no firewall.

Para executá-lo, python my_ftp_server.py - se você quiser escutar na porta 21, precisará de privilégios de root.

9
crazystick

Você pode configurar um cron e rsync entre o servidor FTP e o Google Cloud Storage usando a ferramenta gsutil rsync ou open source rclone .

Se você não puder executar esses comandos no servidor FTP periodicamente, poderá montar o servidor FTP como um sistema de arquivos local ou unidade ( Linux , Windows )

3
Lukasz Cwik

Configure um VM no google cloud, usando algum sabor * nix. Configure o ftp e aponte para uma pasta abc. Use o Google Fuse para montar o abc como um bucket do GCS. Voila - indo e voltando entre gcs/ftp sem escrever nenhum software. (Impressão pequena: O fusível acumula-se e morre se você enviar muitos dados, então devolva-os periodicamente, uma vez por semana ou uma vez por dia; também pode ser necessário definir a montagem ou o Fusível para permitir permissões para todos os usuários )

0
user3688176