Prise en main de Stockage Blob Azure et TypeScript

Cet article montre comment se connecter au Stockage Blob Azure avec la bibliothèque de client du Stockage Blob Azure pour JavaScript. Une fois la connexion établie, votre code peut opérer sur les conteneurs, les blobs et les fonctionnalités du service Stockage Blob Azure.

Package (npm) | Référence API | Code source de la bibliothèque | Envoyer des commentaires

Prérequis

Configuration de votre projet

  1. Ouvrez une invite de commandes et accédez à votre dossier de projet. Remplacez YOUR-DIRECTORY par le nom de votre dossier :

    cd YOUR-DIRECTORY
    
  2. Si vous n’avez pas encore de fichier package.json dans votre répertoire, initialisez le projet pour créer le fichier :

    npm init -y
    
  3. Installez TypeScript et la bibliothèque cliente Stockage Blob Azure pour JavaScript avec les types TypeScript inclus :

    npm install typescript @azure/storage-blob
    
  4. Si vous souhaitez utiliser des connexions sans mot de passe à l’aide de Microsoft Entra ID, installez la bibliothèque du client Azure Identity pour JavaScript :

    npm install @azure/identity
    

Autoriser l’accès et la connexion au Stockage Blob

Microsoft Entra ID fournit la connexion la plus sécurisée en gérant l’identité de connexion (identité managée). Cette fonctionnalité sans mot de passe vous permet de développer une application qui ne demande aucun secret (clés ou chaînes de connexion) stocké dans le code.

Configurer l’accès des identités au cloud Azure

Pour vous connecter à Azure sans mot de passe, vous devez configurer une identité Azure ou utiliser une identité existante. Une fois l’identité configurée, veillez à attribuer les rôles appropriés à l’identité.

Pour autoriser un accès sans mot de passe avec Microsoft Entra ID, vous devez utiliser des informations d’identification Azure. Le type d’informations d'identification sécurité dont vous avez besoin dépend de l’emplacement d’exécution de votre application. Utilisez ce tableau comme guide.

Environnement Méthode
Environnement de développeur Visual Studio Code
Environnement de développeur Principal du service
Applications hébergées par Azure Configuration des applications hébergées par Azure
Local Configuration de l’application locale

Configurer les rôles du compte de stockage

Votre ressource de stockage doit avoir un ou plusieurs des rôles Azure RBAC suivants attribués à la ressource d’identité à laquelle vous envisagez de vous connecter. Configurez les rôles Stockage Azure pour chaque identité que vous avez créée à l’étape précédente : cloud Azure, développement local, application locale.

Une fois la configuration terminée, chaque identité a besoin d’au moins un des rôles appropriés :

  • Un rôle d’accès aux données, par exemple :

    • Lecteur des données blob du stockage
    • Contributeur aux données Blob du stockage
  • Un rôle de ressource, par exemple :

    • Lecteur
    • Contributeur

Générer votre application

À mesure que vous générez votre application, votre code interagit principalement avec trois types de ressources :

  • Le compte de stockage qui est l’unique espace de noms de niveau supérieur pour les données de votre Stockage Azure.
  • Conteneurs qui organisent les données BLOB dans votre compte de stockage.
  • Blobs qui stockent des données non structurées telles que du texte et des données binaires.

Le diagramme suivant montre la relation entre ces ressources.

Diagram of Blob storage architecture

Chaque type de ressource est représenté par un ou plusieurs clients JavaScript associés :

Classe Description
BlobServiceClient Représente le point de terminaison du service Stockage Blob pour votre compte de stockage.
ContainerClient Permet de manipuler les conteneurs du service Stockage Azure et leurs blobs.
BlobClient Permet de manipuler des blobs de Stockage Azure.

Créer un objet BlobServiceClient

L’objet BlobServiceClient est l’objet principal du kit de développement logiciel (SDK). Ce client vous permet de manipuler le service, les conteneurs et les objets blob.

Une fois que vos rôles d’identité de compte de stockage Azure et votre environnement local sont configurés, créez un fichier TypeScript qui inclut le package @azure/identity. Créez des informations d’identification, telles que DefaultAzureCredential, pour implémenter des connexions sans mot de passe au Stockage Blob. Utilisez ces informations d’identification pour vous authentifier auprès d’un objet BlobServiceClient .

// connect-with-default-azure-credential.js
// You must set up RBAC for your identity with one of the following roles:
// - Storage Blob Data Reader
// - Storage Blob Data Contributor
import { DefaultAzureCredential } from '@azure/identity';
import { BlobServiceClient } from '@azure/storage-blob';
import * as dotenv from 'dotenv';
dotenv.config();

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME as string;
if (!accountName) throw Error('Azure Storage accountName not found');

const blobServiceClient = new BlobServiceClient(
  `https://${accountName}.blob.core.windows.net`,
  new DefaultAzureCredential()
);

async function main() {
  const containerName = 'my-container';
  const blobName = 'my-blob';

  const timestamp = Date.now();
  const fileName = `my-new-file-${timestamp}.txt`;

  // create container client
  const containerClient = await blobServiceClient.getContainerClient(
    containerName
  );

  // create blob client
  const blobClient = await containerClient.getBlockBlobClient(blobName);

  // download file
  const downloadResult = await blobClient.downloadToFile(fileName);

  if (downloadResult.errorCode) throw Error(downloadResult.errorCode);

  console.log(
    `${fileName} downloaded ${downloadResult.contentType}, isCurrentVersion: ${downloadResult.isCurrentVersion}`
  );
}

main()
  .then(() => console.log(`success`))
  .catch((err: unknown) => {
    if (err instanceof Error) {
      console.log(err.message);
    }
  });

Le package dotenv est utilisé pour lire le nom de votre compte de stockage à partir d’un fichier .env. Ce fichier ne doit pas être archivé dans le contrôle de code source. Si vous utilisez un principal de service local dans le cadre de votre configuration DefaultAzureCredential, toutes les informations de sécurité pour ces informations d’identification vont également aller dans le fichier .env.

Si vous envisagez de déployer l’application sur des serveurs et des clients qui s’exécutent en dehors d’Azure, créez l’une des informations d’identification qui répondent à vos besoins.

Créer un objet ContainerClient

Vous pouvez créer l’objet ContainerClient à partir de BlobServiceClient ou directement.

Créer un objet ContainerClient à partir de BlobServiceClient

Créez l’objet ContainerClient à partir de BlobServiceClient.

// Azure Storage dependency
import {
  BlobServiceClient,
  StorageSharedKeyCredential
} from '@azure/storage-blob';

// For development environment - include environment variables from .env
import * as dotenv from 'dotenv';
dotenv.config();

// Azure Storage resource name
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME as string;
if (!accountName) throw Error('Azure Storage accountName not found');

// Azure Storage resource key
const accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY as string;
if (!accountKey) throw Error('Azure Storage accountKey not found');

// Create credential
const sharedKeyCredential = new StorageSharedKeyCredential(
  accountName,
  accountKey
);

const baseUrl = `https://${accountName}.blob.core.windows.net`;
const containerName = `my-container`;

// Create BlobServiceClient
const blobServiceClient = new BlobServiceClient(
  `${baseUrl}`,
  sharedKeyCredential
);

async function main(): Promise<void> {
  try {
    // Create container client
    const containerClient = await blobServiceClient.getContainerClient(
      containerName
    );

    // do something with containerClient...
    let i = 1;

    // List blobs in container
    for await (const blob of containerClient.listBlobsFlat({
      includeMetadata: true,
      includeSnapshots: false,
      includeTags: true,
      includeVersions: false,
      prefix: ''
    })) {
      console.log(`Blob ${i++}: ${blob.name}`);
    }
  } catch (err) {
    console.log(err);
    throw err;
  }
}

main()
  .then(() => console.log(`success`))
  .catch((err: unknown) => {
    if (err instanceof Error) {
      console.log(err.message);
    }
  });

Créer directement ContainerClient

// Azure Storage dependency
import { ContainerClient } from '@azure/storage-blob';

// Azure authentication for credential dependency
import { DefaultAzureCredential } from '@azure/identity';

// For development environment - include environment variables from .env
import * as dotenv from 'dotenv';
dotenv.config();

// Azure Storage resource name
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME as string;
if (!accountName) throw Error('Azure Storage accountName not found');

// Azure SDK needs base URL
const baseUrl = `https://${accountName}.blob.core.windows.net`;

// Unique container name
const timeStamp = Date.now();
const containerName = `my-container`;

async function main(): Promise<void> {
  try {
    // create container client from DefaultAzureCredential
    const containerClient = new ContainerClient(
      `${baseUrl}/${containerName}`,
      new DefaultAzureCredential()
    );

    // do something with containerClient...
    let i = 1;

    // List blobs in container
    for await (const blob of containerClient.listBlobsFlat({
      includeMetadata: true,
      includeSnapshots: false,
      includeTags: true,
      includeVersions: false,
      prefix: ''
    })) {
      console.log(`Blob ${i++}: ${blob.name}`);
    }
  } catch (err) {
    console.log(err);
    throw err;
  }
}

main()
  .then(() => console.log(`success`))
  .catch((err: unknown) => {
    if (err instanceof Error) {
      console.log(err.message);
    }
  });

Le package dotenv est utilisé pour lire le nom de votre compte de stockage à partir d’un fichier .env. Ce fichier ne doit pas être archivé dans le contrôle de code source.

Créer un objet BlobClient

Vous pouvez créer l’un des objets BlobClient, répertoriés ci-dessous, à partir d’un ContainerClient ou directement.

Liste des clients d’objets blob :

Créer un objet BlobClient à partir de ContainerClient

// Azure Storage dependency
import {
  BlobClient,
  BlobDownloadHeaders,
  BlobGetPropertiesHeaders,
  BlobGetPropertiesResponse,
  BlockBlobClient,
  ContainerClient
} from '@azure/storage-blob';

// For development environment - include environment variables from .env
import * as dotenv from 'dotenv';
import { getContainerClientFromDefaultAzureCredential } from './auth-get-client';
dotenv.config();

const containerName = `my-container`;
const containerClient: ContainerClient =
  getContainerClientFromDefaultAzureCredential(containerName);

const blobName = `my-blob`;

async function main(containerClient: ContainerClient): Promise<void> {
  // Create BlobClient object
  const blobClient: BlobClient = containerClient.getBlobClient(blobName);

  // do something with blobClient...
  const properties: BlobGetPropertiesHeaders = await blobClient.getProperties();
  if (properties.errorCode) throw Error(properties.errorCode);

  console.log(`Blob ${blobName} properties:`);

  // get BlockBlobClient from blobClient
  const blockBlobClient: BlockBlobClient = blobClient.getBlockBlobClient();

  // do something with blockBlobClient...
  const downloadResponse: BlobDownloadHeaders = await blockBlobClient.download(
    0
  );
  if (downloadResponse.errorCode) throw Error(downloadResponse.errorCode);
}

main(containerClient)
  .then(() => console.log(`success`))
  .catch((err: unknown) => {
    if (err instanceof Error) {
      console.log(err.message);
    }
  });

Créer BlobClient directement

// Azure Storage dependency
import {
  BlockBlobClient,
  BlockBlobUploadHeaders,
  BlockBlobUploadResponse
} from '@azure/storage-blob';
import { getBlockBlobClientFromDefaultAzureCredential } from './auth-get-client';

// For development environment - include environment variables from .env
import * as dotenv from 'dotenv';
dotenv.config();

// Container must exist prior to running this script
const containerName = `my-container`;

// Random blob name and contents
const timeStamp = Date.now();
const blobName = `${timeStamp}-my-blob.txt`;
const fileContentsAsString = 'Hello there.';

const blockBlobClient: BlockBlobClient =
  getBlockBlobClientFromDefaultAzureCredential(containerName, blobName);

async function main(
  blockBlobClient: BlockBlobClient
): Promise<BlockBlobUploadHeaders> {
  // Get file url - available before contents are uploaded
  console.log(`blob.url: ${blockBlobClient.url}`);

  // Upload file contents
  const result: BlockBlobUploadHeaders = await blockBlobClient.upload(
    fileContentsAsString,
    fileContentsAsString.length
  );

  if (result.errorCode) throw Error(result.errorCode);

  // Get results
  return result;
}

main(blockBlobClient)
  .then((result) => {
    console.log(result);
    console.log(`success`);
  })
  .catch((err: unknown) => {
    if (err instanceof Error) {
      console.log(err.message);
    }
  });

/*

Response looks like this:

{
  etag: '"0x8DAD247F1F4896E"',
  lastModified: 2022-11-29T20:26:07.000Z,
  contentMD5: <Buffer 9d 6a 29 63 87 20 77 db 67 4a 27 a3 9c 49 2e 61>,
  clientRequestId: 'a07fdd1f-5937-44c7-984f-0699a48a05c0',
  requestId: '3580e726-201e-0045-1a30-0474f6000000',
  version: '2021-04-10',
  date: 2022-11-29T20:26:06.000Z,
  isServerEncrypted: true,
  'content-length': '0',
  server: 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0',
  'x-ms-content-crc64': 'BLv7vb1ONT8=',
  body: undefined
}
*/

Le package dotenv est utilisé pour lire le nom de votre compte de stockage à partir d’un fichier .env. Ce fichier ne doit pas être archivé dans le contrôle de code source.

Voir aussi