Dans le cadre du développement d’un flux, nous avons besoin de nous connecter à un Google Storage Bucket. Comme il n’existe pas de connecteur Logic App pour le faire simplement, nous allons le faire depuis une Azure Function. L’idée est d’accéder au bucket pour y récupérer tous les fichiers présents, les traiter, puis enfin les déplacer dans un dossier d’archives sur ce même bucket. Pour cela, nous allons passer en revue les différentes étapes nécessaires.
Le package NuGet Google.Cloud.Storage.V1 est requis, la version actuelle étant la 3.3.0. Dans notre fonction, nous allons référencer ces deux namespaces :
Il faut ensuite formater toutes les données contenant les credentials dans un format Json spécifique :
string _credsTemplate = "{{" + "\"type\": \"service_account\"," + "\"project_id\": \"{0}\"," + "\"private_key_id\": \"{1}\"," + "\"private_key\": \"{2}\"," + "\"client_email\": \"{3}\"," + "\"client_id\": \"{4}\"," + "\"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\"," + "\"token_uri\": \"https://oauth2.googleapis.com/token\"," + "\"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\"," + "\"client_x509_cert_url\": \"https://www.googleapis.com/robot/v1/metadata/x509/example.iam.gserviceaccount.com\"" + "}}";
Une fois les paramètres remplacés dans une nouvelle string googleCreds, les deux lignes suivantes nous permettent d’établir la connexion :
GoogleCredential credential = GoogleCredential.FromJson(googleCreds); StorageClientstorage = StorageClient.Create(credential);
Et nous pouvons maintenant récupérer les fichiers sur le bucket :
// For each file in the bucket foreach (var storageObject in storage.ListObjects(bucketName, folderName)) { string fileContent = string.Empty; using (Stream stream = new MemoryStream()) { storage.DownloadObject(bucketName, storageObject.Name, stream); stream.Seek(0, SeekOrigin.Begin); using (StreamReader reader = new StreamReader(stream)) { fileContent = reader.ReadToEnd(); } } // Do whatever with the file content }
Après traitement de chaque fichier, on peut imaginer le déplacer dans un dossier d’archive en le réuploadant à partir du fileContent récupéré et en supprimant le fichier initial :
byte[] byteArray = Encoding.ASCII.GetBytes(fileContent); using (Stream stream = new MemoryStream(byteArray)) { storage.UploadObject(bucketName, "mypath/archives/" + storageObject.Name, null, stream); storage.DeleteObject(bucketName, "mypath/" + storageObject.Name); }