Azure SDK Integration
Azure Functions
import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';
app.http('getProduct', {
methods: ['GET'],
authLevel: 'anonymous',
route: 'products/{id}',
handler: async (req: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {
const id = req.params.id;
const product = await getProduct(id);
return { status: 200, jsonBody: product };
},
});
// Queue trigger
app.serviceBusQueue('processOrder', {
connection: 'ServiceBusConnection',
queueName: 'orders',
handler: async (message: unknown, context: InvocationContext) => {
const order = message as Order;
await processOrder(order);
},
});
// Timer trigger (cron)
app.timer('dailyCleanup', {
schedule: '0 0 2 * * *',
handler: async (timer, context) => {
await cleanupExpiredSessions();
},
});
Cosmos DB
import { CosmosClient } from '@azure/cosmos';
const client = new CosmosClient(process.env.COSMOS_CONNECTION_STRING!);
const container = client.database('mydb').container('products');
// Create
await container.items.create({ id: '123', name: 'Widget', price: 19.99, category: 'tools' });
// Read
const { resource } = await container.item('123', 'tools').read();
// Query
const { resources } = await container.items
.query({
query: 'SELECT * FROM c WHERE c.category = @cat AND c.price < @maxPrice',
parameters: [
{ name: '@cat', value: 'tools' },
{ name: '@maxPrice', value: 50 },
],
})
.fetchAll();
Blob Storage
import { BlobServiceClient } from '@azure/storage-blob';
const blobService = BlobServiceClient.fromConnectionString(process.env.AZURE_STORAGE_CONNECTION!);
const container = blobService.getContainerClient('uploads');
// Upload
const blockBlob = container.getBlockBlobClient(`files/${filename}`);
await blockBlob.uploadData(buffer, {
blobHTTPHeaders: { blobContentType: contentType },
});
// Download
const downloadResponse = await blockBlob.download(0);
const content = await streamToBuffer(downloadResponse.readableStreamBody!);
// Generate SAS URL
import { generateBlobSASQueryParameters, BlobSASPermissions } from '@azure/storage-blob';
const sasUrl = blockBlob.generateSasUrl({
permissions: BlobSASPermissions.parse('r'),
expiresOn: new Date(Date.now() + 3600 * 1000),
});
Service Bus
import { ServiceBusClient } from '@azure/service-bus';
const sbClient = new ServiceBusClient(process.env.SERVICE_BUS_CONNECTION!);
// Send
const sender = sbClient.createSender('orders');
await sender.sendMessages({ body: { orderId: '123', status: 'created' } });
// Receive
const receiver = sbClient.createReceiver('orders');
const messages = await receiver.receiveMessages(10, { maxWaitTimeInMs: 5000 });
for (const msg of messages) {
await processOrder(msg.body);
await receiver.completeMessage(msg);
}
Authentication (DefaultAzureCredential)
import { DefaultAzureCredential } from '@azure/identity';
// Works in all environments: local dev, Azure VMs, App Service, AKS
const credential = new DefaultAzureCredential();
// Use with any Azure SDK client
const blobService = new BlobServiceClient(
`https://${accountName}.blob.core.windows.net`,
credential,
);
Anti-Patterns
| Anti-Pattern | Fix |
|--------------|-----|
| Connection strings in code | Use DefaultAzureCredential + managed identity |
| Not using partition keys (Cosmos DB) | Design partition key for query patterns |
| Polling Service Bus | Use event-driven triggers or receiveMessages |
| No retry configuration | Azure SDKs retry automatically — configure retryOptions |
| Hardcoded resource names | Use environment variables or App Configuration |
Production Checklist
- [ ] Managed identity for authentication (no secrets in config)
- [ ] DefaultAzureCredential for local + cloud parity
- [ ] Key Vault for secrets management
- [ ] Application Insights for monitoring
- [ ] Resource tagging for cost management
- [ ] Network security (VNet integration, private endpoints)
Scan to join WeChat group