Calling Azure Services with the SDK
The Azure SDK for JavaScript provides a comprehensive set of tools to interact with various Azure services programmatically. This guide focuses on the general patterns and best practices for calling Azure services.
Core Concepts
- Client Libraries: Each Azure service has a dedicated SDK client library. You'll typically import and instantiate a client for the service you want to use (e.g.,
BlobServiceClientfor Azure Blob Storage,KeyClientfor Azure Key Vault). - Authentication: Securely authenticating your requests is paramount. The SDK supports several authentication methods, including connection strings, service principals, and managed identities.
- Operations: Clients expose methods that correspond to the operations available for a given service (e.g.,
createContainer,uploadBlob,getSecret). - Asynchronous Nature: Most SDK operations are asynchronous and return Promises. You'll commonly use
async/awaitsyntax to handle these operations.
Installation
To get started, install the necessary SDK packages using npm or yarn:
npm install @azure/storage-blob @azure/keyvault-secrets
Or with yarn:
yarn add @azure/storage-blob @azure/keyvault-secrets
Authentication Strategies
The recommended way to authenticate is using the DefaultAzureCredential class from the @azure/identity package. This credential type attempts to authenticate using a variety of methods in a cascading order, making it ideal for both local development and deployment in Azure environments.
Using DefaultAzureCredential
First, install the identity package:
npm install @azure/identity
Then, use it in your code:
import { BlobServiceClient } from "@azure/storage-blob";
import { DefaultAzureCredential } from "@azure/identity";
async function main() {
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
const blobServiceClient = new BlobServiceClient(
`https://${accountName}.blob.core.windows.net`,
new DefaultAzureCredential()
);
const containerClient = blobServiceClient.getContainerClient("my-container");
// ... perform operations using containerClient
console.log("BlobServiceClient created successfully.");
}
main().catch(error => {
console.error("Error:", error);
});
For other authentication methods, refer to the Azure SDK Authentication documentation.
Common Patterns for Calling Services
Creating and Managing Resources
Many services allow you to create or manage resources like containers, queues, or secrets.
Creating a Blob Container
import { BlobServiceClient } from "@azure/storage-blob";
import { DefaultAzureCredential } from "@azure/identity";
async function createBlobContainer(containerName) {
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
const blobServiceClient = new BlobServiceClient(
`https://${accountName}.blob.core.windows.net`,
new DefaultAzureCredential()
);
try {
const createContainerResponse = await blobServiceClient.createContainer(containerName);
console.log(`Container "${containerName}" was created successfully. ETag: ${createContainerResponse.eTag}`);
} catch (error) {
console.error(`Error creating container "${containerName}":`, error);
throw error;
}
}
// Example usage:
// createBlobContainer("new-sample-container").catch(console.error);
Performing Data Operations
This includes uploading/downloading files, reading/writing data, or retrieving information.
Uploading a Blob
import { BlobServiceClient } from "@azure/storage-blob";
import { DefaultAzureCredential } from "@azure/identity";
import { fileURLToPath } from "url";
import { dirname } from "path";
import * as fs from "fs";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
async function uploadBlob(containerName, blobName, filePath) {
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
const blobServiceClient = new BlobServiceClient(
`https://${accountName}.blob.core.windows.net`,
new DefaultAzureCredential()
);
const containerClient = blobServiceClient.getContainerClient(containerName);
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
const stream = fs.createReadStream(filePath);
try {
const uploadBlobResponse = await blockBlobClient.uploadStream(stream, fs.statSync(filePath).size);
console.log(`Blob "${blobName}" uploaded successfully.`, uploadBlobResponse);
} catch (error) {
console.error(`Error uploading blob "${blobName}":`, error);
throw error;
}
}
// Example usage (assuming you have a file named "my-local-file.txt"):
// const filePath = `${__dirname}/my-local-file.txt`;
// uploadBlob("my-container", "uploaded-file.txt", filePath).catch(console.error);
Handling Errors
Always wrap your SDK calls in try...catch blocks to gracefully handle potential errors, such as network issues, permission denied, or resource not found.
errorCode and statusCode, which can be invaluable for debugging.
Advanced Topics
- Paging: For operations that return a large number of items, the SDK provides methods for handling pagination.
- Long Running Operations (LROs): Some operations take a significant amount of time. The SDK provides mechanisms to track their progress and status.
- Batch Operations: For services that support it, batching multiple requests into a single API call can improve performance.
- Configuration: The SDK clients can often be configured with options like retry policies, custom endpoints, and telemetry settings.
For more detailed examples and specific service documentation, please visit the official Azure SDK for JavaScript documentation.