mcpField
A
azure-storage-blob-ts

azure-storage-blob-ts

github.com/sickn33クラウド・DevOps48.7k57 回インストール今日更新
リポジトリ

azure-storage-blob-ts について

azure-storage-blob-ts は、@azure/storage-blob SDKをTypeScriptまたはJavaScriptから使い、Azure Blob Storageを管理するスキルです。コンテナーやBlobの操作、認証、メタデータ、SASトークンを扱い、Node.jsとブラウザーの違いも示します。

主な機能

  1. 01コンテナーの作成、一覧、削除
  2. 02Blobのアップロード、ダウンロード、コピー、削除
  3. 03Blobの一覧とプロパティ取得
  4. 04BlobのメタデータとHTTPヘッダー設定
  5. 05認証とSASトークンの選択肢

活用シーン

  1. 01アプリのファイルをBlob Storageへアップロード
  2. 02保存済みBlobの一覧表示や取得
  3. 03コンテナー内のデータとメタデータの管理
  4. 04有効期限付きSASアクセスの提供

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill azure-storage-blob-ts

インストール後、Claude Code で/azure-storage-blob-tsを入力して読み込まれたか確認します。

詳細

@azure/storage-blob (TypeScript/JavaScript)

Azure Blob Storage の操作(Blob とコンテナーのアップロード、ダウンロード、一覧表示、管理)に使用する SDK です。

インストール

npm install @azure/storage-blob @azure/identity

例では 12.x API ファミリーを使用しています。互換性のある SDK バージョンと、パッケージの engines で現在サポートされている Node ランタイムを固定してください。これは最新バージョンであることを示すものではありません。

環境変数

AZURE_STORAGE_ACCOUNT_NAME=<account-name>
AZURE_STORAGE_ACCOUNT_KEY=<account-key>
# OR connection string
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...

認証

DefaultAzureCredential(推奨)
import { BlobServiceClient } from "@azure/storage-blob";
import { DefaultAzureCredential } from "@azure/identity";

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;
const client = new BlobServiceClient(
  `https://${accountName}.blob.core.windows.net`,
  new DefaultAzureCredential()
);
接続文字列
import { BlobServiceClient } from "@azure/storage-blob";

const client = BlobServiceClient.fromConnectionString(
  process.env.AZURE_STORAGE_CONNECTION_STRING!
);
StorageSharedKeyCredential(Node.js のみ)
import { BlobServiceClient, StorageSharedKeyCredential } from "@azure/storage-blob";

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;
const accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY!;

const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);
const client = new BlobServiceClient(
  `https://${accountName}.blob.core.windows.net`,
  sharedKeyCredential
);
SAS トークン
import { BlobServiceClient } from "@azure/storage-blob";

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;
const sasToken = process.env.AZURE_STORAGE_SAS_TOKEN!; // starts with "?"

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

クライアント階層

BlobServiceClient (account level)
└── ContainerClient (container level)
    └── BlobClient (blob level)
        ├── BlockBlobClient (block blobs - most common)
        ├── AppendBlobClient (append-only blobs)
        └── PageBlobClient (page blobs - VHDs)

最小権限の ID/SAS、短い有効期限、HTTPS のみのアクセスを選択してください。サポートされている場合は、ユーザー委任 SAS を優先してください。アカウントキーや署名付き URL をブラウザーのバンドルやログで公開しないでください。削除または上書きする前に、対象のアカウント/コンテナー/Blob が正しいことを確認してください。setMetadata/setHTTPHeaders はフィールドを置き換えるため、必要な既存の値を保持し、必要に応じて条件付き ETag を使用してください。これらの例は個別の操作であり、考えずに順番に実行するものではありません。

コンテナー操作

コンテナーの作成
const containerClient = client.getContainerClient("my-container");
await containerClient.create();

// Or create if not exists
await containerClient.createIfNotExists();
コンテナーの一覧表示
for await (const container of client.listContainers()) {
  console.log(container.name);
}

// With prefix filter
for await (const container of client.listContainers({ prefix: "logs-" })) {
  console.log(container.name);
}
コンテナーの削除
await containerClient.delete();
// Or delete if exists
await containerClient.deleteIfExists();

Blob 操作

Blob のアップロード(簡易)
const containerClient = client.getContainerClient("my-container");
const blockBlobClient = containerClient.getBlockBlobClient("my-file.txt");

// Upload string
await blockBlobClient.upload("Hello, World!", 13);

// Upload Buffer
const buffer = Buffer.from("Hello, World!");
await blockBlobClient.upload(buffer, buffer.length);
ファイルからのアップロード(Node.js のみ)
const blockBlobClient = containerClient.getBlockBlobClient("uploaded-file.txt");
await blockBlobClient.uploadFile("/path/to/local/file.txt");
ストリームからのアップロード(Node.js のみ)
import * as fs from "fs";

const blockBlobClient = containerClient.getBlockBlobClient("streamed-file.txt");
const readStream = fs.createReadStream("/path/to/local/file.txt");

await blockBlobClient.uploadStream(readStream, 4 * 1024 * 1024, 5, {
  // bufferSize: 4MB, maxConcurrency: 5
  onProgress: (progress) => console.log(`Uploaded ${progress.loadedBytes} bytes`),
});
ブラウザーからのアップロード
const blockBlobClient = containerClient.getBlockBlobClient("browser-upload.txt");

// From File input
const fileInput = document.getElementById("fileInput") as HTMLInputElement;
const file = fileInput.files![0];
await blockBlobClient.uploadData(file);

// From Blob/ArrayBuffer
const arrayBuffer = new ArrayBuffer(1024);
await blockBlobClient.uploadData(arrayBuffer);
Blob のダウンロード
const blobClient = containerClient.getBlobClient("my-file.txt");
const downloadResponse = await blobClient.download();

// Read as string (Node.js only; bounded small blobs)
const downloaded = await streamToText(downloadResponse.readableStreamBody!);

async function streamToText(readable: NodeJS.ReadableStream): Promise<string> {
  const chunks: Buffer[] = [];
  for await (const chunk of readable) {
    chunks.push(Buffer.from(chunk));
  }
  return Buffer.concat(chunks).toString("utf-8");
}

ブラウザーでは、レスポンスの blobBody Promise を使用し、サイズ制限内でそのテキストを読み取ってください。readableStreamBody と Buffer は Node 専用です。

ファイルへのダウンロード(Node.js のみ)
const blockBlobClient = containerClient.getBlockBlobClient("my-file.txt");
await blockBlobClient.downloadToFile("/path/to/local/destination.txt");
Buffer へのダウンロード(Node.js のみ)
const blockBlobClient = containerClient.getBlockBlobClient("my-file.txt");
const buffer = await blockBlobClient.downloadToBuffer();
console.log(buffer.toString());
Blob の一覧表示
// List all blobs
for await (const blob of containerClient.listBlobsFlat()) {
  console.log(blob.name, blob.properties.contentLength);
}

// List with prefix
for await (const blob of containerClient.listBlobsFlat({ prefix: "logs/" })) {
  console.log(blob.name);
}

// List by hierarchy (virtual directories)
for await (const item of containerClient.listBlobsByHierarchy("/")) {
  if (item.kind === "prefix") {
    console.log(`Directory: ${item.name}`);
  } else {
    console.log(`Blob: ${item.name}`);
  }
}
Blob の削除
const blobClient = containerClient.getBlobClient("my-file.txt");
await blobClient.delete();

// Delete if exists
await blobClient.deleteIfExists();

// Delete with snapshots
await blobClient.delete({ deleteSnapshots: "include" });
Blob のコピー
const sourceBlobClient = containerClient.getBlobClient("source.txt");
const destBlobClient = containerClient.getBlobClient("destination.txt");

// Start copy operation
const copyPoller = await destBlobClient.beginCopyFromURL(sourceBlobClient.url);
await copyPoller.pollUntilDone();

Blob のプロパティとメタデータ

プロパティの取得
const blobClient = containerClient.getBlobClient("my-file.txt");
const properties = await blobClient.getProperties();

console.log("Content-Type:", properties.contentType);
console.log("Content-Length:", properties.contentLength);
console.log("Last Modified:", properties.lastModified);
console.log("ETag:", properties.etag);
メタデータの設定
await blobClient.setMetadata({
  author: "John Doe",
  category: "documents",
});
HTTP ヘッダーの設定
await blobClient.setHTTPHeaders({
  blobContentType: "text/plain",
  blobCacheControl: "max-age=3600",
  blobContentDisposition: "attachment; filename=download.txt",
});

SAS トークンの生成(Node.js のみ)

Blob SAS の生成
import {
  BlobSASPermissions,
  generateBlobSASQueryParameters,
  StorageSharedKeyCredential,
} from "@azure/storage-blob";

const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);

const sasToken = generateBlobSASQueryParameters(
  {
    containerName: "my-container",
    blobName: "my-file.txt",
    permissions: BlobSASPermissions.parse("r"), // read only
    startsOn: new Date(),
    expiresOn: new Date(Date.now() + 3600 * 1000), // 1 hour
  },
  sharedKeyCredential
).toString();

const sasUrl = `https://${accountName}.blob.core.windows.net/my-container/my-file.txt?${sasToken}`;
コンテナー SAS の生成
import { ContainerSASPermissions, generateBlobSASQueryParameters } from "@azure/storage-blob";

const sasToken = generateBlobSASQueryParameters(
  {
    containerName: "my-container",
    permissions: ContainerSASPermissions.parse("rl"), // read/list example; grant writes only when requested
    expiresOn: new Date(Date.now() + 24 * 3600 * 1000), // 24 hours
  },
  sharedKeyCredential
).toString();
アカウント SAS の生成
import {
  AccountSASPermissions,
  AccountSASResourceTypes,
  AccountSASServices,
  generateAccountSASQueryParameters,
} from "@azure/storage-blob";

const sasToken = generateAccountSASQueryParameters(
  {
    services: AccountSASServices.parse("b").toString(), // blob
    resourceTypes: AccountSASResourceTypes.parse("sco").toString(), // service, container, object
    permissions: AccountSASPermissions.parse("rl"), // read/list only; avoid account-wide SAS when blob scope suffices
    expiresOn: new Date(Date.now() + 24 * 3600 * 1000),
  },
  sharedKeyCredential
).toString();

Blob の種類

Block Blob(デフォルト)

テキストファイルやバイナリファイルで最も一般的な種類です。

const blockBlobClient = containerClient.getBlockBlobClient("document.pdf");
await blockBlobClient.uploadFile("/path/to/document.pdf");
Append Blob

追加操作(ログ、監査証跡)に最適化されています。

const appendBlobClient = containerClient.getAppendBlobClient("app.log");

// Create the append blob
await appendBlobClient.create();

// Append data
await appendBlobClient.appendBlock("Log entry 1\n", 12);
await appendBlobClient.appendBlock("Log entry 2\n", 12);
Page Blob

ランダムな読み取り/書き込み向けの固定サイズ Blob(VHD)です。

const pageBlobClient = containerClient.getPageBlobClient("disk.vhd");

// Create 512-byte aligned page blob
await pageBlobClient.create(1024 * 1024); // 1MB

// Write pages (must be 512-byte aligned)
const buffer = Buffer.alloc(512);
await pageBlobClient.uploadPages(buffer, 0, 512);

エラー処理

import { RestError } from "@azure/storage-blob";

try {
  await containerClient.create();
} catch (error) {
  if (error instanceof RestError) {
    switch (error.statusCode) {
      case 404:
        console.log("Container not found");
        break;
      case 409:
        console.log("Container already exists");
        break;
      case 403:
        console.log("Access denied");
        break;
      default:
        console.error(`Storage error ${error.statusCode}: ${error.message}`);
    }
  }
  throw error;
}

TypeScript 型リファレンス

import {
  // Clients
  BlobServiceClient,
  ContainerClient,
  BlobClient,
  BlockBlobClient,
  AppendBlobClient,
  PageBlobClient,

  // Authentication
  StorageSharedKeyCredential,
  AnonymousCredential,

  // SAS
  BlobSASPermissions,
  ContainerSASPermissions,
  AccountSASPermissions,
  AccountSASServices,
  AccountSASResourceTypes,
  generateBlobSASQueryParameters,
  generateAccountSASQueryParameters,

  // Options & Responses
  BlobDownloadResponseParsed,
  BlobUploadCommonResponse,
  ContainerCreateResponse,
  BlobItem,
  ContainerItem,

  // Errors
  RestError,
} from "@azure/storage-blob";

ベストプラクティス

  1. DefaultAzureCredential を使用する — 接続文字列/キーより AAD を優先してください
  2. 大きなファイルにはストリーミングを使用する — 256MB を超えるファイルには uploadStream/downloadToFile を使用してください
  3. 適切なコンテンツタイプを設定する — 正しい MIME タイプを設定するには setHTTPHeaders を使用してください
  4. クライアントアクセスには SAS トークンを使用する — ブラウザーからのアップロードには有効期間の短いトークンを生成してください
  5. エラーを適切に処理する — 個別の処理を行うには RestError.statusCode を確認してください
  6. *IfNotExists メソッドを使用する — 冪等なコンテナー/Blob の作成に使用してください
  7. ライフサイクル — 固定したクライアントで実際に公開されているライフサイクルメソッドのみを使用してください。close() の呼び出しを作り出さないでください

プラットフォームの違い

機能Node.jsブラウザー
StorageSharedKeyCredential✅❌
uploadFile()✅❌
uploadStream()✅❌
downloadToFile()✅❌
downloadToBuffer()✅❌
uploadData()✅✅
SAS の生成✅❌
DefaultAzureCredential✅❌
匿名/SAS アクセス✅✅

使用する場面

このスキルは、概要に記載されたワークフローまたはアクションを実行する場合に適用できます。

制限事項

  • このスキルは、タスクが上記の説明範囲に明確に当てはまる場合にのみ使用してください。
  • 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
  • 必要な入力、権限、安全上の境界、または成功条件が不足している場合は、作業を中断して確認してください。

コメント