Azure Storage 계정의 모든 컨테이너 전송

Storage Transfer Service는 단일 전송 작업에서 단일 Microsoft Azure Storage 계정 내의 모든 컨테이너에서 데이터를 전송할 수 있습니다. 이렇게 하면 여러 컨테이너에 분산된 로그를 수집하는 것과 같은 사용 사례의 워크플로가 간소화됩니다.

모든 컨테이너의 전송 구성

스토리지 계정 내의 모든 컨테이너를 전송하려면 AzureBlobStorageData 공개 API 객체에서 소스 컨테이너를 * (단일 별표)로 지정하거나 gcloud 명령에서 소스를 지정할 때 https://AZURE_ACCOUNT_NAME.blob.core.windows.net/*로 지정합니다.

멀티 컨테이너 전송에는 소스 폴더 또는 path를 지정할 수 없습니다. 대신 프리픽스를 사용하여 경로를 지정하려면 전송할 컨테이너 및 객체 필터링을 참고하세요.

전송 작업이 실행되면 Storage Transfer Service는 먼저 Azure에 쿼리하여 지정된 스토리지 계정의 모든 컨테이너의 업데이트된 목록을 가져옵니다. 그런 다음 발견된 각 컨테이너에 대해 대상에 해당 폴더를 만들고 컨테이너의 데이터를 새 폴더로 전송합니다.

gcloud

다음 명령어는 지정된 Azure Storage 계정의 모든 컨테이너를 Cloud Storage 버킷으로 전송하는 전송 작업을 만듭니다.

gcloud transfer jobs create \
  https://AZURE_ACCOUNT_NAME.blob.core.windows.net/* \
  gs://GCS_BUCKET_NAME \
  --source-creds-file="PATH_TO_AZURE_SAS_FILE" \
  --project="PROJECT_ID"

각 항목의 의미는 다음과 같습니다.

  • AZURE_ACCOUNT_NAME: Azure Storage 계정의 이름
  • GCS_BUCKET_NAME: 대상 Cloud Storage 버킷의 이름입니다.
  • PATH_TO_AZURE_SAS_FILE: 계정 수준 Azure SAS 토큰이 포함된 텍스트 파일의 로컬 경로입니다. 예를 들면 ~/.azure/sas_token.txt입니다. SAS 토큰은 허용된 리소스 유형에 대해 서비스, 컨테이너, 객체가 선택된 스토리지 계정 수준에서 생성해야 합니다. 자세한 내용은 소스에 대한 액세스 구성: Microsoft Azure Storage를 참고하세요.
  • PROJECT_ID: 전송을 소유하는 Google Cloud 프로젝트 ID입니다.

REST

REST API를 사용하여 이 전송을 만들려면 https://storagetransfer.googleapis.com/v1/transferJobs 엔드포인트에 POST 요청을 실행합니다.

요청 본문:

{
  "description": "Transfer all containers from my Azure account",
  "projectId": "PROJECT_ID",
  "status": "ENABLED",
  "transferSpec": {
    "azureBlobStorageDataSource": {
      "storageAccount": "AZURE_ACCOUNT_NAME",
      "container": "*",
      "azureCredentials": {
        "sasToken": "AZURE_SAS_TOKEN"
      }
    },
    "gcsDataSink": {
      "bucketName": "GCS_BUCKET_NAME"
    }
  }
}

각 항목의 의미는 다음과 같습니다.

  • PROJECT_ID: 전송을 소유하는 Google Cloud 프로젝트 ID입니다.
  • AZURE_ACCOUNT_NAME: Azure Storage 계정의 이름
  • AZURE_SAS_TOKEN: 전체 계정 수준 SAS 토큰 문자열입니다(예: ?sv=2020-08-04&ss=bfqt&srt=sco&...). SAS 토큰은 허용된 리소스 유형에 대해 서비스, 컨테이너, 객체가 선택된 스토리지 계정 수준에서 생성해야 합니다. 자세한 내용은 소스에 대한 액세스 구성: Microsoft Azure Storage를 참고하세요.
  • GCS_BUCKET_NAME: 대상 Cloud Storage 버킷의 이름입니다.

클라이언트 라이브러리

이 샘플에서는 google-cloud-storage-transfer Python 클라이언트 라이브러리를 사용하여 전송을 만듭니다.

from google.cloud import storage_transfer_v1

def create_transfer_all_azure_containers(
    project_id: str,
    description: str,
    azure_storage_account: str,
    azure_sas_token: str,
    gcs_sink_bucket: str,
):
    """Creates a transfer job from all containers in an Azure account to Cloud Storage."""

    client = storage_transfer_v1.StorageTransferServiceClient()

    transfer_job_request = storage_transfer_v1.CreateTransferJobRequest(
        {
            "transfer_job": {
                "project_id": project_id,
                "description": description,
                "status": storage_transfer_v1.TransferJob.Status.ENABLED,
                "transfer_spec": {
                    "azure_blob_storage_data_source": {
                        "storage_account": azure_storage_account,
                        "container": "*",  # Wildcard for all containers
                        "azure_credentials": {"sas_token": azure_sas_token},
                    },
                    "gcs_data_sink": {"bucket_name": gcs_sink_bucket},
                },
            }
        }
    )

    result = client.create_transfer_job(transfer_job_request)
    print(f"Created transfer job: {result.name}")

if __name__ == "__main__":
    create_transfer_all_azure_containers(
        project_id="PROJECT_ID",
        description="All-containers transfer from Azure",
        azure_storage_account="AZURE_ACCOUNT_NAME",
        azure_sas_token="AZURE_SAS_TOKEN",
        gcs_sink_bucket="GCS_BUCKET_NAME",
    )

각 항목의 의미는 다음과 같습니다.

  • PROJECT_ID: 전송을 소유하는 Google Cloud 프로젝트 ID입니다.
  • AZURE_ACCOUNT_NAME: Azure Storage 계정의 이름
  • AZURE_SAS_TOKEN: 전체 계정 수준 SAS 토큰 문자열입니다(예: ?sv=2020-08-04&ss=bfqt&srt=sco&...). SAS 토큰은 허용된 리소스 유형에 대해 서비스, 컨테이너, 객체가 선택된 스토리지 계정 수준에서 생성해야 합니다. 자세한 내용은 소스에 대한 액세스 구성: Microsoft Azure Storage를 참고하세요.
  • GCS_BUCKET_NAME: 대상 Cloud Storage 버킷의 이름입니다.

전송 생성 및 사용 가능한 옵션에 관한 자세한 내용은 전송 만들기를 참고하세요.

전송할 컨테이너 및 객체 필터링

프리픽스 또는 매니페스트 파일을 사용하여 전송에 포함할 컨테이너와 객체를 관리할 수 있습니다.

프리픽스별 필터링

컨테이너 내의 특정 컨테이너 또는 특정 경로를 전송하려면 includePrefixes 또는 excludePrefixes 목록을 제공합니다. 컨테이너 필드가 *인 경우 각 접두사 경로의 첫 번째 세그먼트가 컨테이너 이름으로 처리됩니다. 이를 통해 동일한 작업 내에서 서로 다른 컨테이너에 대해 서로 다른 경로를 지정할 수 있습니다. 스토리지 계정의 모든 컨테이너에 접두사를 적용하려면 *를 첫 번째 세그먼트로 사용합니다(예: */PREFIX).

예를 들어 container-a의 모든 항목과 container-b의 특정 경로 아래에 있는 객체를 전송하려면 포함 프리픽스를 다음과 같이 설정합니다.

"transferSpec": {
  ...
  "azureBlobStorageDataSource": {
    "storageAccount": "my-azure-account",
    "container": "*"
  },
  "objectConditions": {
    "includePrefixes": [
      "container-a",
      "container-b/logs/2025/"
    ]
  },
  ...
}

이 구성은 다음을 수행합니다.

  • container-a에서 모든 객체를 전송합니다.
  • container-b에서 logs/2025/ 경로 아래의 모든 객체를 전송합니다.
  • 스토리지 계정의 다른 모든 컨테이너를 건너뜁니다.

스토리지 계정의 모든 컨테이너에서 logs/2025/ 경로 아래의 모든 객체를 전송하려면 includePrefixes에 "*/logs/2025/"를 지정합니다.

포함 및 제외 프리픽스에 대한 자세한 내용은 프리픽스별 필터링을 참고하세요.

매니페스트를 사용하여 필터링

다중 컨테이너 전송에 매니페스트 파일을 사용하려면 매니페스트 CSV 파일에 나열된 각 객체의 경로가 컨테이너 이름으로 시작해야 합니다.

예를 들면 다음과 같습니다.

container-a/photos/photo1.jpg
container-a/photos/photo2.jpg
container-c/archive.zip

매니페스트 파일에 관한 자세한 내용은 매니페스트를 사용하여 특정 파일 또는 객체 전송을 참고하세요.

이벤트 기반 전송

Azure의 이벤트 기반 전송은 다중 컨테이너 구성에서 지원됩니다.

최적의 성능을 위해 불필요한 이벤트 처리를 방지하려면 Azure에서 이벤트 필터를 구성하여 이벤트를 트리거해야 하는 컨테이너를 지정하세요. 필터가 없으면 스토리지 계정 내의 모든 컨테이너 업데이트에 대해 이벤트가 생성됩니다.

자세한 내용은 Azure Blob Storage의 이벤트 기반 전송을 참고하세요.

Azure API 할당량

여러 컨테이너에서 전송하면 Azure에 대한 API 요청 수가 증가할 수 있습니다. Azure Storage 계정에는 요청 비율 제한이 있으며 일반적으로 초당 약 20,000개의 요청입니다. 컨테이너 수가 매우 많은 경우 Storage Transfer Service는 이러한 한도 내에 유지하기 위해 목록 작성 프로세스를 제한할 수 있습니다.