다음을 통해 공유


Python을 사용하여 비동기 일정으로 Blob 복사

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

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

필수 조건

  • 이 문서에서는 Python용 Azure Blob Storage 클라이언트 라이브러리로 작업하도록 프로젝트가 이미 설정되어 있다고 가정합니다. 패키지 설치, import 문 추가 및 권한 있는 클라이언트 개체 만들기를 포함하여 프로젝트를 설정하는 방법에 대한 자세한 내용은 Azure Blob Storage 및 Python 시작을 참조하세요.
  • 권한 부여 메커니즘에 복사 작업을 수행하거나 보류 중인 복사를 중단할 수 있는 권한이 있어야 합니다. 자세한 내용은 다음 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이고 스냅샷이 아닙니다.

복사 작업의 원본 BLOB은 블록 BLOB, 추가 BLOB, 페이지 BLOB, BLOB 스냅샷 또는 BLOB 버전 중 하나일 수 있습니다. 복사 작업은 항상 전체 원본 BLOB 또는 파일을 복사합니다. 바이트 범위 또는 블록 세트 복사는 지원되지 않습니다.

대상 BLOB이 이미 있는 경우 원본 BLOB과 동일한 BLOB 형식이어야 하며 기존 대상 BLOB을 덮어씁니다. 복사 작업이 진행되는 동안에는 대상 BLOB을 수정할 수 없으며 대상 BLOB에는 하나의 미해결 복사 작업만 있을 수 있습니다.

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

비동기 일정으로 BLOB 복사

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

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

start_copy_from_urlcopy_statuscopy_id를 포함하는 사전을 반환합니다. copy_status 속성은 복사가 동기적으로 완료된 경우 성공이고 복사가 비동기적으로 시작된 경우 보류 중입니다.

Azure 내 원본에서 Blob 복사

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

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

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

def copy_from_source_in_azure_async(self, source_blob: BlobClient, destination_blob: BlobClient, blob_service_client: BlobServiceClient):
    # Lease the source blob during copy to prevent other clients from modifying it
    lease = BlobLeaseClient(client=source_blob)

    sas_token = self.generate_user_delegation_sas(blob_service_client=blob_service_client, source_blob=source_blob)
    source_blob_sas_url = source_blob.url + "?" + sas_token

    # Create an infinite lease by passing -1 as the lease duration
    lease.acquire(lease_duration=-1)

    # Start the copy operation - specify False for the requires_sync parameter
    copy_operation = dict()
    copy_operation = destination_blob.start_copy_from_url(source_url=source_blob_sas_url, requires_sync=False)
    
    # If start_copy_from_url returns copy_status of 'pending', the operation has been started asynchronously
    # You can optionally add logic here to wait for the copy operation to complete

    # Release the lease on the source blob
    lease.break_lease()

def generate_user_delegation_sas(self, blob_service_client: BlobServiceClient, source_blob: BlobClient):
    # Get a user delegation key
    delegation_key_start_time = datetime.datetime.now(datetime.timezone.utc)
    delegation_key_expiry_time = delegation_key_start_time + datetime.timedelta(hours=1)
    key = blob_service_client.get_user_delegation_key(
        key_start_time=delegation_key_start_time,
        key_expiry_time=delegation_key_expiry_time
    )

    # Create a SAS token that's valid for one hour, as an example
    sas_token = generate_blob_sas(
        account_name=blob_service_client.account_name,
        container_name=source_blob.container_name,
        blob_name=source_blob.blob_name,
        account_key=None,
        user_delegation_key=key,
        permission=BlobSasPermissions(read=True),
        expiry=datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(hours=1),
        start=datetime.datetime.now(datetime.timezone.utc)
    )

    return sas_token

참고 항목

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

Azure 외부의 원본에서 Blob 복사

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

def copy_from_external_source_async(self, source_url: str, destination_blob: BlobClient):
    # Start the copy operation - specify False for the requires_sync parameter
    copy_operation = dict()
    copy_operation = destination_blob.start_copy_from_url(source_url=source_url, requires_sync=False)
    
    # If start_copy_from_url returns copy_status of 'pending', the operation has been started asynchronously
    # You can optionally add logic here to wait for the copy operation to complete

복사 작업의 상태 확인

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

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

def check_copy_status(self, destination_blob: BlobClient):
    # Get the copy status from the destination blob properties
    copy_status = destination_blob.get_blob_properties().copy.status

    return copy_status

복사 작업 중단

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

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

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

def abort_copy(self, destination_blob: BlobClient):
    # Get the copy operation details from the destination blob properties
    copy_status = destination_blob.get_blob_properties().copy.status
    copy_id = destination_blob.get_blob_properties().copy.id

    # Check the copy status and abort if pending
    if copy_status == 'pending':
        destination_blob.abort_copy(copy_id)
        print(f"Copy operation {copy_id} has been aborted")

리소스

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

REST API 작업

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

코드 샘플

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