TypeScript를 사용하여 블록 Blob의 액세스 계층 설정 또는 변경

이 문서에서는 JavaScript용 Azure Storage 클라이언트 라이브러리를 사용하여 Blob의 액세스 계층을 설정하거나 변경하는 방법을 보여 줍니다.

필수 조건

  • 이 문서의 예제에서는 JavaScript용 Azure Blob Storage 클라이언트 라이브러리로 작업하도록 프로젝트가 이미 설정되어 있다고 가정합니다. 패키지 설치, 모듈 가져오기, 데이터 리소스 작업을 위한 권한 있는 클라이언트 개체 만들기 등 프로젝트를 설정하는 방법에 대한 자세한 내용은 Azure Blob Storage 및 TypeScript 시작을 참조하세요.
  • 권한 부여 메커니즘에는 Blob의 액세스 계층을 설정할 수 있는 권한이 있어야 합니다. 자세한 내용은 다음 REST API 작업에 대한 권한 부여 지침을 참조하세요.

블록 Blob 액세스 계층 정보

스토리지 요구에 따른 비용을 관리하기 위해 액세스 빈도 및 보존 기간을 기준으로 데이터를 구성하는 것이 도움이 될 수 있습니다. Azure Storage는 사용 방법에 따라 Blob 데이터를 가장 비용 효율적인 방식으로 저장할 수 있도록 다양한 액세스 계층을 제공합니다.

Blob 데이터를 위한 액세스 계층

Azure Storage 액세스 계층에는 다음이 포함됩니다.

  • 핫 계층 - 자주 액세스하거나 수정하는 데이터를 저장하는 데 최적화된 온라인 계층입니다. 핫 계층은 스토리지 비용이 가장 높지만 액세스 비용은 가장 낮습니다.
  • 쿨 계층 - 자주 액세스하거나 수정하지 않는 데이터를 저장하는 데 최적화된 온라인 계층입니다. 쿨 계층의 데이터는 최소 30일 동안 저장해야 합니다. 쿨 계층은 핫 계층에 비해 스토리지 비용이 낮고 액세스 비용은 높습니다.
  • 콜드 계층 - 자주 액세스하거나 수정하지 않는 데이터를 저장하는 데 최적화된 온라인 계층입니다. 콜드 계층의 데이터는 최소 90일 동안 저장해야 합니다. 콜드 계층은 쿨 계층에 비해 스토리지 비용이 낮고 액세스 비용은 높습니다.
  • 보관 계층 - 거의 액세스하지 않고 요구되는 대기 시간(시간 기준)이 유연한 데이터를 저장하는 데 최적화된 오프라인 계층입니다. 보관 계층의 데이터는 최소 180일 동안 저장해야 합니다.

액세스 계층에 대한 자세한 내용은 Blob 데이터에 대한 액세스 계층을 참조하세요.

Blob이 보관 액세스 계층에 있는 동안에는 오프라인으로 간주되며 읽거나 수정할 수 없습니다. 보관된 Blob의 데이터를 읽거나 수정하려면 먼저 Blob을 온라인 계층으로 리하이드레이션해야 합니다. 보관 계층에서 온라인 계층으로 Blob을 리하이드레이션하는 방법에 대한 자세한 내용은 보관 계층에서 Blob 리하이드레이션을 참조하세요.

제한 사항

액세스 계층 설정은 블록 Blob에서만 허용됩니다. 블록 Blob의 액세스 계층 설정의 제한 사항에 대해서는 내용은 Blob 계층 설정(REST API)을 참조하세요.

참고 항목

TypeScript를 사용하여 액세스 계층을 Cold로 설정하려면 최소 클라이언트 라이브러리 버전, 12.13.0을 사용해야 합니다.

업로드 동안 Blob의 액세스 계층 설정

Blob을 특정 액세스 계층에 업로드하려면 BlockBlobUploadOptions를 사용합니다. tier 속성 선택 항목은 Hot, Cool, Cold 또는 Archive입니다.

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이 스토리지에 업로드된 후 Blob의 액세스 계층을 변경하려면 setAccessTier를 사용합니다. 계층과 함께 BlobSetTierOptions 속성 리하이드레이션 우선 순위를 설정하여 블록 Blob을 보관된 상태 이외 상태로 전환할 수 있습니다. 가능한 값은 High 또는 Standard입니다.

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을 다른 액세스 계층으로 복사

BlobClient.beginCopyFromURL 메서드를 사용하여 Blob을 복사합니다. 복사 작업 중에 액세스 계층을 변경하려면 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}`
    );
  }
}

코드 샘플

다음 단계