20 Mai 2014

Utilisation du BlobStorage avec l’API Azure

Présentation

Azure nous permet de stocker en ligne divers types de données, structurées ou non via les services SQL server classiques mais également les services de stockage. Ce sont ces derniers qui nous intéressent ici.

Ces services permettent de gérer plusieurs type données : Blob, Queue ou Table.
Dans cette article, nous allons nous intéresser aux Blob, tout en sachant que l’utilisation des deux autres types de données n’est pas très différente.

Un service de stockage peut héberger plusieurs “containers” et un container peut contenir N blob, chacun accessible par une URL. Enfin, un container peut être public ou privé mais nous verrons plus tard la différence entre ces deux modes.
Il est possible d’utiliser simplement ce un blob storage avec VisualStudio avec l’explorateur de serveurs. Ici, il est possible de consulter le contenu mais également d’uploader de nouveaux fichiers :

azure storage VS

L’intérêt principal du blob storage en plus d’être simple d’utilisation et rapide d’accès est que ça ne coûte quasiment rien par rapport à un espace SQL Server ou même une machine dédiée : 0,14$/mois du GB pour moins d’1 TB avec des prix dégressifs après.

Et maintenant …

Voyons un peu comment on peut bénéficier de cette espace dans une application.
Tout d’abord, il vous faudra installer le SDK azure avec WebPlateformeInstaller.

Dans votre projet, ajoutez la référence à Microsoft.WindowsAzure.Storage. Ici nous utiliserons la version 2.1 de la dll.
Dès lors, la connexion au storage se fera par la classe CloudStorageAccount :

using Microsoft.WindowsAzure.Storage;
StorageCredentials storageCredentialsAccountAndKey = new StorageCredentials("COMPTE DE STOCKAGE", "CLE DU COMPTE");
CloudStorageAccount cloudStorage = new CloudStorageAccount(storageCredentialsAccountAndKey, true);

Le compte de stockage correspond évidemment à celui créé sur Azure et la clé correspond à la clé d’accès secondaire que vous pouvez récupérer sur l’interface Azure en cliquant sur “Gérer les clés d’accès” :

Gerer les clés d'accès storage Azure

Maintenant que nous avons créer le CloudStorageAccount, il faut instancier le client permettant de requêter les containers.

var blobClient = CloudStorage.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("monContainer");
/* pas obligatoire si on ne veut pas le créer automatiquement. Ici, je le crée "public", tout le monde peut y accéder. */
container.CreateIfNotExists(BlobContainerPublicAccessType.Container);

 

Et enfin, il reste à pousser un stream dans le container :

CloudBlockBlob blockBlob = container.GetBlockBlobReference("monFichier.gif");
blockBlob.DeleteIfExists(); /* On peut supprimer le fichier avant de le ré-uploader */
blockBlob.Properties.ContentType = "image/gif"; /* Ne pas oublier le content type, sinon ça peut faire des choses étranges sur certains format de fichier */
blockBlob.UploadFromStream(stream); /* reste à uploader le stream*/

Voila ! Votre fichier est accessible à l’adresse : http://<CompteDeStockage>.blob.core.windows.net/<Container>/monFichier.gif

Et les containers privés alors ?

Si vous essayer d’uploader un fichier dans un container privé, pas de problème… par contre, l’accès risque d’être un peu plus difficile. Si vous reprenez la même logique que si dessus, mais avec un container privé, en tapant l’url dans un browser, vous allez avoir la jolie erreur suivante :

<Error>
<Code>ResourceNotFound</Code>
<Message>
The specified resource does not exist. RequestId:222a2ce0-220e-41a2-b420-590a7e4196ad Time:2014-05-20T07:25:13.9679035Z
</Message>
</Error>

Voila, c’est privé…

Pour y accéder, vous allez avoir besoin d’une SharedAccessSignature (SAS). Cette signature correspond à des paramètres qui seront ajoutés dans l’URL. Le bouton “télécharger” du blob dans l’interface Azure génère un token SAS et le rajoute à l’url d’accès :
http://<storage>.blob.core.windows.net/<private>/windows-azure-icon-png.png?sv=2013-08-15&sr=b&sig=461W49p0BkzLcfuoF0sPbWH81747cGEFpEhJEXAISD4%3D&st=2014-05-20T09%3A06%3A34Z&se=2014-05-20T09%3A13%3A34Z&sp=r
Ce token porte 3 informations dans la chaîne cryptée (sig) :

  • La date de début de validité
  • La date de fin de validité
  • les permissions

Via l’interface d’Azure, il n’est valide que quelques minutes.
Il est bien sur possible de créer un nouveau token SAS via l’API Azure directement sur un CloudBlockBlob (un objet obtenu par l’appel à GetBlockBlobReference(“nomDuFichier”) comme ceci :

 

CloudBlockBlob blockBlob = container.GetBlockBlobReference("monFichier.gif");
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy()
{
SharedAccessExpiryTime = DateTime.Now.AddHours(1), /* le token sera valide 1h */
Permissions = SharedAccessBlobPermissions.Read /* et uniquement en lecture */
};
string sourceSasToken = blockBlob.GetSharedAccessSignature(policy);
var urlWithSas = blockBlob.Uri + sourceSasToken;

Depuis la version 2 de l’api, il est possible de spécifier DateTime.MaxValue si on veut générer un token qui na pas de date d’expiration.

Share