共用方式為


使用 TypeScript 設定或變更區塊 Blob 的存取層

本文說明如何使用適用於 JavaScript 的 Azure 儲存體用戶端程式庫來設定或變更 Blob 的存取層

必要條件

  • 本文中的範例假設您已有設定好要搭配適用於 JavaScript 的 Azure Blob 儲存體用戶端程式庫使用的專案。 若要了解如何設定專案,包括套件安裝、匯入模組,以及建立授權的用戶端物件來處理資料資源,請參閱開始使用 Azure Blob 儲存體和 TypeScript
  • 授權機制必須具有設定 Blob 的存取層權限。 若要深入了解,請參閱下列 REST API 作業的授權指導:

關於區塊 Blob 存取層

為了管理儲存體需求的成本,根據資料的存取頻率和資料需要保留的時間長度來組織資料會很有幫助。 Azure 儲存體提供不同的存取層,讓您可以根據 Blob 資料的使用方式,以最符合成本效益的方式來儲存 Blob 資料。

blob 資料的存取層

Azure 儲存體存取層包括:

  • 經常性存取層:已針對儲存經常存取或修改的資料最佳化的線上層。 經常性存取層的儲存體成本最高,但存取成本最低。
  • 非經常性儲存層:已針對儲存不常存取或修改的資料最佳化的線上層。 非經常性存取層中的資料至少應儲存 30 天。 相較於經常性存取層,非經常性儲存層的儲存體成本較低且存取成本較高。
  • 非經常性儲存層 - 已針對儲存不常存取或修改的資料最佳化的線上層。 極非經常性存取層中的資料至少應儲存 90 天。 相較於非經常性存取層,極非經常性存取層的儲存體成本較低但存取成本較高。
  • 封存層:已針對儲存極少存取且具有彈性延遲需求的資料最佳化 (以小時為單位) 的離線層。 封存層中的資料至少應儲存 180 天。

若要深入了解存取層,請參閱 Blob 資料的存取層

位於封存存取層的 Blob 會被視為離線,而且無法讀取或修改。 若要讀取或修改封存 Blob 中的資料,您必須先將 Blob 解除凍結至線上層。 如需有關將 Blob 從封存層解除凍結至線上層的詳細資訊,請參閱將 Blob 自封存層解除凍結

限制

只有區塊 Blob 才能設定存取層。 若要深入了解設定區塊 Blob 存取層的限制,請參閱設定 Blob 層 (REST API)

注意

若要使用 TypeScript 將存取層設定為 Cold,您必須使用最低版本 12.13.0 的用戶端程式庫

在 Blob 上傳期間設定存取層

若要將 Blob 上傳至特定存取層,請使用 BlockBlobUploadOptionstier 屬性選項包括:HotCoolColdArchive

async function uploadWithAccessTier(
  containerClient: ContainerClient
): Promise<BlockBlobClient> {
  // Create blob
  const timestamp = Date.now();
  const blobName = `myblob-${timestamp}`;
  console.log(`creating blob ${blobName}`);

  const fileContentsAsString = `Hello from a string`;

  const tags: Tags = {};

  // Upload blob to cool tier
  const uploadOptions: BlockBlobUploadOptions = {
    // access tier setting
    // 'Hot', 'Cool', or 'Archive'
    tier: 'Cool',

    // other properties
    metadata: undefined,
    tags
  };

  // Create blob client from container client
  const blockBlobClient: BlockBlobClient =
    await containerClient.getBlockBlobClient(blobName);

  // Upload string
  const uploadResult = await blockBlobClient.upload(
    fileContentsAsString,
    fileContentsAsString.length,
    uploadOptions
  );

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

  // Return client to continue with other operations
  return blockBlobClient;
}

上傳後變更 Blob 的存取層

若要在 Blob 上傳至儲存體之後變更存取層,請使用 setAccessTier。 除了階層之外,您也可以設定 BlobSetTierOptions 屬性解除凍結優先順序,讓區塊 Blob 脫離封存狀態。 可能的值為 HighStandard

async function main(blockBlobClient: BlockBlobClient): Promise<void> {
  const options: BlobGetPropertiesOptions = {};

  // Get current access tier
  const { errorCode, accessTier } = await blockBlobClient.getProperties(
    options
  );
  if (!errorCode) {
    console.log(`Current access tier: ${accessTier}`);
  }

  // 'Hot', 'Cool', or 'Archive'
  const newAccessTier = 'Cool';

  // Rehydrate priority: 'High' or 'Standard'
  const tierOptions: BlobSetTierOptions = {
    rehydratePriority: 'High'
  };

  const result: BlobSetTierResponse = await blockBlobClient.setAccessTier(
    newAccessTier,
    tierOptions
  );

  if (!result?.errorCode) {
    console.log(`Change to access was successful`);
  } else {
    console.log(result);
  }
}

將 Blob 複製到不同的存取層

若要複製 Blob,請使用 BlobClient.beginCopyFromURL 方法。 若要在複製作業期間變更存取層,請使用 BlobBeginCopyFromURLOptionstier 屬性,並指定與來源 Blob 不同的存取

async function copyBlobWithDifferentAccessTier(
  containerClient: ContainerClient
): Promise<void> {
  // create blob clients
  const sourceBlobClient: BlobClient = await containerClient.getBlobClient(
    originalBlob
  );
  const destinationBlobClient: BlobClient = await containerClient.getBlobClient(
    copyBlob
  );

  const copyOptions: BlobBeginCopyFromURLOptions = { tier: 'Hot' };

  // start copy, access tiers include `Hot`, `Cool`, `Archive`
  const copyPoller = await destinationBlobClient.beginCopyFromURL(
    sourceBlobClient.url,
    copyOptions
  );
  console.log('start copy from original to copy');

  // wait until done
  await copyPoller.pollUntilDone();
  console.log('copy finished');
}

使用批次來變更許多 Blob 的存取層

批次代表 Blob 上的匯總作業集,例如刪除設定存取層。 您必須傳入正確的認證,才能順利執行每個作業。 在此範例中,相同的認證會用於相同容器中的一組 Blob。

建立 BlobBatchClient。 使用用戶端以 createBatch() 方法來建立批次。 當批次就緒時,請提交批次以進行處理。 使用傳回的結構來驗證每個 Blob 的作業是否成功。

async function batchChangeAccessTier(
  containerClient: ContainerClient
): Promise<void> {
  // Prep array
  const blockBlobCount = 3;
  const blockBlobClients: BlockBlobClient[] = new Array(blockBlobCount);

  // Create container and blobs in `Hot` tier
  await prepContainer(containerClient, blockBlobCount, blockBlobClients);

  // Blob batch client and batch
  const containerScopedBatchClient: BlobBatchClient =
    containerClient.getBlobBatchClient();
  const blobBatch: BlobBatch = containerScopedBatchClient.createBatch();

  // Assemble batch to set tier to `Cool` tier
  for (let i = 0; i < blockBlobCount; i++) {
    await blobBatch.setBlobAccessTier(
      blockBlobClients[i].url,
      sharedKeyCredential,
      'Cool',
      {}
    );
  }

  // Submit batch request and verify response
  const resp = await containerScopedBatchClient.submitBatch(blobBatch, {});

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

  console.log(
    `Requested ${blockBlobCount}, batched ${resp.subResponses.length}, success ${resp.subResponsesSucceededCount}, failure ${resp.subResponsesFailedCount}`
  );

  // Examine each batch item
  for (let i = 0; i < blockBlobCount; i++) {
    // Check blob tier set properly
    const resp2 = await blockBlobClients[i].getProperties();

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

    console.log(
      `[${i}] access tier ${resp2.accessTier}, status ${resp.subResponses[i].status}, message ${resp.subResponses[i].statusMessage}`
    );
  }
}

程式碼範例

下一步