다음을 통해 공유


JavaScript를 사용하여 비동기 일정으로 Blob 복사

이 문서에서는 JavaScript용 Azure Storage 클라이언트 라이브러리를 사용하여 비동기 일정으로 Blob을 복사하는 방법을 보여 줍니다. 동일한 스토리지 계정 내의 원본, 다른 스토리지 계정의 원본 또는 지정된 URL의 HTTP GET 요청을 통해 검색되어 액세스 가능한 개체에서 Blob을 복사할 수 있습니다. 보류 중인 복사 작업을 중단할 수도 있습니다.

이 문서에서 다루는 클라이언트 라이브러리 메서드는 Blob 복사 REST API 작업을 사용하며 비동기 일정으로 복사를 수행하려는 경우에 사용할 수 있습니다. 데이터를 스토리지 계정으로 이동하고 원본 개체에 대한 URL을 포함하려는 대부분의 복사 시나리오에 대해서는 JavaScript를 사용하여 원본 개체 URL에서 Blob 복사를 참조하세요.

필수 조건

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

비동기 일정으로 Blob 복사 정보

Copy Blob 작업은 비동기적으로 완료될 수 있으며 최선의 노력으로 수행됩니다. 즉, 작업이 즉시 시작되거나 지정된 시간 프레임 내 완료된다고 보장되지 않습니다. 복사 작업은 백그라운드에서 예약되고 서버에 사용 가능한 리소스가 있을 때 수행됩니다. 복사가 동일한 스토리지 계정 내에서 발생하는 경우 작업은 동기적으로 완료할 수 있습니다.

Copy Blob 작업은 다음 작업을 수행할 수 있습니다.

  • 다른 이름을 사용해서 원본 Blob을 대상 Blob에 복사합니다. 대상 Blob은 동일한 Blob 유형(블록, 추가 또는 페이지)의 기존 Blob이거나 복사 작업으로 생성된 새 Blob일 수 있습니다.
  • 동일한 이름을 사용해 원본 Blob을 대상 Blob으로 복사하여 대상 Blob을 바꿀 수 있습니다. 이 유형의 복사 작업은 커밋되지 않은 블록을 제거하고 대상 Blob의 메타데이터를 덮어씁니다.
  • Azure 파일 서비스의 원본 파일을 대상 Blob에 복사합니다. 대상 blob은 기존 블록 Blob이거나 복사 작업을 통해 만든 새 블록 Blob일 수 있습니다. 파일에서 페이지 Blob 또는 추가 Blob으로 복사하는 것은 지원되지 않습니다.
  • 기본 Blob에 대해 스냅샷을 복사합니다. 스냅샷의 수준을 기본 Blob 위치로 올리면 이전 Blob 버전을 복원할 수 있습니다.
  • 스냅샷을 다른 이름으로 대상 Blob에 복사합니다. 복사된 대상 Blob는 쓰기 가능한 Blob이고 스냅샷이 아닙니다.

속성, 인덱스 태그, 메타데이터 및 청구에 대한 정보를 포함하여 Copy Blob 작업에 대한 자세한 내용은 Blob 설명 복사를 참조하세요.

비동기 일정으로 Blob 복사

이 섹션에서는 비동기 일정으로 복사 작업을 수행하기 위해 JavaScript용 Azure Storage 클라이언트 라이브러리에서 제공하는 메서드에 대한 개요를 제공합니다.

다음 메서드는 Blob 복사 REST API 작업을 래핑하고 원본 Blob에서 데이터의 비동기 복사를 시작합니다.

beginCopyFromURL 메서드는 복사가 완료될 때까지 무기한 대기할 수 있는 장기 작업 폴러를 반환합니다.

Azure 내 원본에서 Blob 복사

동일한 스토리지 계정 내에서 Blob을 복사하는 경우 작업을 동기적으로 완료할 수 있습니다. 원본 Blob에 대한 액세스는 Microsoft Entra ID, SAS(공유 액세스 서명) 또는 계정 키를 통해 권한 부여될 수 있습니다. 다른 동기 복사 작업에 대해서는 JavaScript로 원본 개체 URL에서 Blob 복사를 참조하세요.

복사 원본이 다른 스토리지 계정의 Blob인 경우 작업을 비동기적으로 완료할 수 있습니다. 원본 Blob은 공용이거나 SAS 토큰을 통해 권한이 부여되어야 합니다. SAS 토큰에는 읽기(‘r’) 권한이 포함되어야 합니다. SAS 토큰에 대한 자세한 내용은 공유 액세스 서명을 사용하여 액세스 위임을 참조하세요.

다음 예제에서는 비동기 일정으로 다른 스토리지 계정에서 원본 Blob을 복사하는 시나리오를 보여 줍니다. 이 예제에서는 추가된 사용자 위임 SAS 토큰을 사용하여 원본 Blob URL을 만듭니다. 이 예제에서는 클라이언트 라이브러리를 사용하여 SAS 토큰을 생성하는 방법을 보여 주지만, 직접 제공할 수도 있습니다. 또한 이 예제에서는 복사 작업 중에 원본 Blob을 임대하여 다른 클라이언트에서 Blob에 대한 변경 내용을 방지하는 방법을 보여줍니다. Copy Blob 작업은 복사 작업이 시작될 때 원본 Blob의 ETag 값을 저장합니다. 복사 작업이 완료되기 전에 ETag 값이 변경되면 작업이 실패합니다.

async function copyAcrossStorageAccountsAsync(sourceBlob, destinationBlob, blobServiceClient) {
  // Lease the source blob to prevent changes during the copy operation
  const sourceBlobLease = new BlobLeaseClient(sourceBlob);

  // Create a SAS token that's valid for 1 hour
  const sasToken = await generateUserDelegationSAS(sourceBlob, blobServiceClient);
  const sourceBlobSASURL = sourceBlob.url + "?" + sasToken;

  try {
    await sourceBlobLease.acquireLease(-1);

    // Start the copy operation and wait for it to complete
    const copyPoller = await destinationBlob.beginCopyFromURL(sourceBlobSASURL);
    await copyPoller.pollUntilDone();
  } catch (error) {
    // Handle the exception
  } finally {
    // Release the lease once the copy operation completes
    await sourceBlobLease.releaseLease();
  }
}

async function generateUserDelegationSAS(sourceBlob, blobServiceClient) {
  // Get a user delegation key for the Blob service that's valid for 1 hour, as an example
  const delegationKeyStart = new Date();
  const delegationKeyExpiry = new Date(Date.now() + 3600000);
  const userDelegationKey = await blobServiceClient.getUserDelegationKey(
    delegationKeyStart,
    delegationKeyExpiry
  );

  // Create a SAS token that's valid for 1 hour, as an example
  const sasTokenStart = new Date();
  const sasTokenExpiry = new Date(Date.now() + 3600000);
  const blobName = sourceBlob.name;
  const containerName = sourceBlob.containerName;
  const sasOptions = {
    blobName,
    containerName,
    permissions: BlobSASPermissions.parse("r"),
    startsOn: sasTokenStart,
    expiresOn: sasTokenExpiry,
    protocol: SASProtocol.HttpsAndHttp
  };

  const sasToken = generateBlobSASQueryParameters(
    sasOptions,
    userDelegationKey,
    blobServiceClient.accountName
  ).toString();

  return sasToken.toString();
}

참고 항목

사용자 위임 SAS 토큰은 계정 키 대신 Microsoft Entra 자격 증명으로 서명되므로 더 강력한 보안을 제공합니다. 사용자 위임 SAS 토큰을 만들려면 Microsoft Entra 보안 주체에 적절한 권한이 필요합니다. 권한 부여 요구 사항은 사용자 위임 키 가져오기를 참조하세요.

Azure 외부의 원본에서 Blob 복사

Azure 외부의 액세스 가능한 개체를 포함하여 지정된 URL에서 HTTP GET 요청을 통해 검색할 수 있는 모든 원본 개체에 대해 복사 작업을 수행할 수 있습니다. 다음 예제에서는 액세스 가능한 원본 개체 URL에서 Blob을 복사하는 시나리오를 보여줍니다.

async function copyFromExternalSource(sourceURL, destinationBlob) {
  const copyPoller = await destinationBlob.beginCopyFromURL(sourceURL);
  await copyPoller.pollUntilDone();
}

복사 작업의 상태 확인

비동기 Copy Blob 작업의 상태를 확인하려면 getProperties 메서드를 폴링하고 복사 상태를 확인할 수 있습니다.

다음 코드 예제에서는 보류 중인 복사 작업의 상태를 확인하는 방법을 보여 줍니다.

async function checkCopyStatus(destinationBlob) {
  const properties = await destinationBlob.getProperties();
  console.log(properties.copyStatus);
}

복사 작업 중단

보류 중인 Copy Blob 작업을 중단하면 대상 Blob의 길이가 0이 됩니다. 하지만 대상 Blob의 메타데이터는 원본 Blob에서 복사되었거나 복사 작업 중에 명시적으로 설정된 새 값을 가집니다. 복사 전의 원본 메타데이터를 보존하려면 복사 메서드 중 하나를 호출하기 전에 대상 Blob의 스냅샷을 만듭니다.

보류 중인 복사 작업을 중단하려면 다음 작업을 호출합니다.

이 메서드는 Blob 복사 중단 REST API 작업을 래핑하여, 보류 중인 Copy Blob 작업을 취소합니다. 다음 코드 예제에서는 보류 중인 Copy Blob 작업을 중단하는 방법을 보여줍니다.

async function abortCopy(destinationBlob) {
  const properties = await destinationBlob.getProperties();

  // Check the copy status and abort if pending
  if (properties.copyStatus === "pending") {
    await destinationBlob.abortCopyFromURL(properties.copyId);
  }
}

리소스

JavaScript용 Azure Blob Storage 클라이언트 라이브러리를 사용하여 비동기 일정으로 Blob을 복사하는 방법에 대해 자세히 알아보려면 다음 리소스를 참조하세요.

REST API 작업

JavaScript용 Azure SDK에는 Azure REST API를 기반으로 빌드되는 라이브러리가 포함되어 있으므로 익숙한 JavaScript 패러다임을 통해 REST API 작업과 상호 작용할 수 있습니다. 이 문서에서 다루는 클라이언트 라이브러리 메서드는 다음 REST API 작업을 사용합니다.

코드 샘플

클라이언트 라이브러리 리소스