Accéder à un Google Storage Bucket depuis une Azure Function

Tanguy SCHOUBERT
Publié par Tanguy SCHOUBERT
Catégorie : .Net / Azure / Azure Functions
07/06/2021

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.

 

Prérequis

 

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 :

  • Google.Apis.Auth.OAuth2
  • Google.Cloud.Storage.V1

 

Connexion au Google Storage

 

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

 

Récupération des fichiers

 

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
}

 

Archivage sur le bucket

 

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);
}