Meilleure méthode pour les fichiers SFTP ou FTPS via SSIS [fermé]
-
03-07-2019 - |
Question
À l'origine, cette question demandait quelle était la meilleure méthode pour télécharger des fichiers via SFTP ou FTPS dans SSIS. Il ne fait maintenant que lister les avantages et les inconvénients de chaque solution. Personnellement, j’utilise la bibliothèque SFTP de CozyRoc ces derniers temps, mais j’ai utilisé chacune des solutions ci-dessous à un moment ou à un autre.
BIBLIOTHEQUE DE COMPOSANTS SSIS
Méthode: Installez une bibliothèque de composants SSIS à partir de de CozyRoc , Codeplex , BizCrypto , PragmaticWorks ou un autre fournisseur sur chaque serveur de développement et de production et utilisez la tâche SFTP pour télécharger les fichiers.
Avantages: facile à utiliser. Cela ressemble, sent et ressemble à une tâche SSIS normale. SSIS reconnaît également le mot de passe en tant qu'information confidentielle et vous offre toutes les options habituelles pour protéger les informations confidentielles au lieu de simplement les stocker en texte clair de manière non sécurisée. Fonctionne bien avec d'autres tâches SSIS telles que les conteneurs de boucles ForEach. Erreurs de sortie lorsque les téléchargements et les téléchargements échouent. Fonctionne bien lorsque vous ne connaissez pas les noms des fichiers sur le site FTP distant à télécharger ou lorsque vous ne connaissez pas le nom du fichier à télécharger jusqu'au moment de l'exécution.
Inconvénients: à l’exception de la solution Codeplex, l’achat de licences dans un environnement de production coûte cher. Nécessite l'installation des bibliothèques sur chaque machine de développement et de production. S'il s'agit de la solution Codeplex, vous utilisez un logiciel qui n'est pris en charge par aucun fournisseur spécifique. Cela vous rend également dépendant du fournisseur pour mettre à jour ses bibliothèques entre chaque version. Par exemple, avant 2008 RTM'd, je développais un nouveau serveur sur une version CTP de 2008 et la bibliothèque CozyRoc 2005 était incompatible avec celle-ci. Finalement, ils ont publié une version compatible 2008, mais je devais utiliser temporairement la solution de ligne de commande pour contourner ce problème.
PROGRAMME SFTP DE LA LIGNE DE COMMANDE
Méthode: installez une application SFTP en ligne de commande gratuite telle que Putty et WinSCP et exécutez-la en exécutant un fichier de commandes ou une tâche de processus du système d'exploitation. Les instructions pour le faire via WinSCP sont listées ici .
Avantages: gratuit, gratuit et gratuit. Vous pouvez être sûr qu'il est sécurisé si vous utilisez Putty car de nombreux clients FTP à interface graphique semblent utiliser Putty sous les couvertures. Vous savez DÉFINITIVEMENT que vous utilisez SSH2 et non SSH.
Inconvénients: les deux utilitaires de ligne de commande que j'ai essayés (Putty et Cygwin) nécessitaient le stockage du mot de passe SFTP dans un emplacement non sécurisé. Je n'ai pas trouvé un bon moyen de capturer les échecs ou les erreurs lors du téléchargement de fichiers. Le processus ne ressemble pas et ne sent pas comme SSIS. La plupart du code est encapsulé dans des fichiers texte au lieu de SSIS lui-même. Difficile à utiliser si vous ne connaissez pas le nom exact du fichier que vous téléchargez ou téléchargez.
BIBLIOTHÈQUE VB.NET DE 3E PARTIES C # ou VB.NET
Méthode: installez une bibliothèque SFTP ou FTPS et utilisez une tâche de script qui référence la bibliothèque pour télécharger les fichiers. (Je n'ai jamais essayé cela, alors je vais deviner les avantages et les inconvénients)
Avantages: Probablement facile de capturer les erreurs. Devrait bien fonctionner avec les variables, il serait donc probablement facile à utiliser même si vous ne connaissez pas le nom exact du fichier que vous téléchargez ou téléchargez.
Inconvénients: il s’agit d’une tâche de script associée à des bibliothèques .NET. Si vous utilisez SSIS, vous êtes probablement plus à l'aise avec les tâches SSIS qu'avec le code .NET. Les tâches de script sont également difficiles à résoudre car elles ne disposent pas des mêmes outils et fonctionnalités de débogage que les projets .NET classiques. Crée une dépendance sur du code tiers qui peut ne pas fonctionner entre différentes versions de SQL Server. Pour être juste, il est probablement PLUS probable que vous travailliez entre différentes versions de SQL Server par rapport à une bibliothèque de tâches SSIS tierce. Un autre gros problème - je n’ai pas trouvé de bibliothèque libre C # ou VB.NET qui le fasse pour le moment. Donc, si quelqu'un en connaît un, alors s'il vous plaît faites le moi savoir!
La solution
La question suivante pourrait être utile:
Quel serait le choix recommandé du composant SSIS à exécuter Tâche SFTP ou FTPS?
Cozyroc:
Il devrait être facile de tester la disponibilité du protocole ssh en définissant le serveur sur "autoriser uniquement SSHv2". et tests. Avez-vous essayé de demander au service des ventes de Cozy?
Ligne de commande sftp:
Le problème du nom de fichier inconnu pourrait être résolu avec l’utilisation de caractères génériques (au moins sous Cygwin).
Librairie tierce:
Pourquoi avez-vous besoin d'une bibliothèque tierce pour FTPS? .NET prend en charge ce protocole depuis la version 2.0 environ.
http://msdn.microsoft.com /en-us/library/system.net.ftpwebrequest.enablessl.aspx
Autres conseils
Je souhaitais simplement fournir une mise à jour de ce que nous avions décidé de faire pour résoudre les problèmes de SFTP dans SSIS. Voici la ventilation de ce qui s'est passé:
-
J'ai d'abord essayé d'utiliser Putty et certains fichiers de traitement par lots pour télécharger des fichiers, mais il était difficile de capturer les erreurs. De plus, je stockais nos identifiants SFTP dans des fichiers en texte clair, car ils faisaient partie des scripts de téléchargement Putty.
-
Nous avons acheté une licence CozyRoc pour notre serveur SSIS pour quelques centaines de dollars par an et je suis complètement satisfait des résultats de l’utilisation de leur produit. Avec le produit CozyRoc, la tâche de flux de contrôle génère des erreurs en cas de problème de téléchargement. Étant donné que mon équipe compte également plusieurs programmeurs SSIS juniors, il leur a été plus facile de comprendre comment configurer la tâche de flux de contrôle que d'utiliser la méthode des scripts Putty. Enfin, le mot de passe est crypté à l'aide du cryptage natif de SSIS pour la protection des données sensibles. Je n'ai plus de mots de passe stockés en texte clair sur mon serveur.
J'ai examiné certaines des bibliothèques tierces recommandées dans cette question, mais il semble que CozyRoc soit le moins cher des fournisseurs. Ils avaient également quelques autres tâches SSIS que j'ai pu utiliser dans mon équipe de BI. . Merci, CozyRoc!
Sans composant, vous pouvez utiliser une tâche de script. Voir ce lien
Imports System
Imports Microsoft.SqlServer.Dts.Runtime
Imports Ftp
Imports System.IO
Public Class ScriptMain
Public Sub Main()
Try
Dim cm As ConnectionManager = Dts.Connections.Add("FTP")
cm.Properties("ServerName").SetValue(cm, Dts.Variables("SFTPServerName").Value.ToString)
cm.Properties("ServerUserName").SetValue(cm, Dts.Variables("SFTPLogin").Value.ToString)
cm.Properties("ServerPassword").SetValue(cm, Dts.Variables("SFTPPassword").Value.ToString)
cm.Properties("ServerPort").SetValue(cm, Dts.Variables("SFTPPortNumber").Value.ToString)
cm.Properties("Timeout").SetValue(cm, "0")
cm.Properties("ChunkSize").SetValue(cm, "0") '1000 kb
cm.Properties("Retries").SetValue(cm, "0")
Dts.Variables("Continue").Value = 0
Dim ftp As FtpClientConnection = New FtpClientConnection(cm.AcquireConnection(Nothing))
Dim FilesList() As String
Dim FolderName() As String
Dim Separator As String = ";"
' \\ServerName\Share1;\\ServerName\Share2 : Local copy
Dim FolderLocalListSrc As String = Dts.Variables("FolderLocalListSrc").Value.ToString
Dim FolderLocalListDst() As String = Split(FolderLocalListSrc, Separator)
Dim Counter As Integer
ftp.Connect()
ftp.GetListing(FolderName, FilesList)
If FilesList IsNot Nothing Then
Dim FileName As String
For Each FileName In FilesList
Dim FileToProcess(0) As String
Dim FileToMove(0) As String
For Counter = 0 To FolderLocalListDst.GetUpperBound(0)
FileToProcess(0) = FileName
FileToMove(0) = FolderLocalListDst(Counter) + FileName
If (File.Exists(FileToMove(0)) = False) Then
' Téléchargement en local
ftp.ReceiveFiles(FileToProcess, FolderLocalListDst(Counter), True, True)
End If
Next
' Upload du fichier dans les archives du FTP
ftp.SendFiles(FileToMove, "/Archives", True, False)
' Suppression du fichier à la racine du FTP
ftp.DeleteFiles(FileToProcess)
Next
End If
ftp.Close()
Dts.TaskResult = Dts.Results.Success
Catch ex As Exception
Dts.TaskResult = Dts.Results.Failure
End Try
End Sub
End Class