轉移 Azure 儲存體帳戶中的所有容器

Storage 移轉服務可透過單一移轉工作,從單一 Microsoft Azure 儲存體帳戶中的所有容器移轉資料。這可簡化工作流程,例如擷取分散在多個容器中的記錄。

為所有容器設定轉移作業

如要轉移儲存空間帳戶中的所有容器,請在 AzureBlobStorageData 公用 API 物件中,將來源容器指定為 * (單一星號),或在 gcloud 指令中指定來源時,將來源容器指定為 https://AZURE_ACCOUNT_NAME.blob.core.windows.net/*。

多容器轉移作業不支援指定來源資料夾或 path。請參閱「篩選要轉移的容器和物件」,改用前置字串指定路徑。

執行移轉工作時,Storage 移轉服務 會先查詢 Azure,取得指定儲存體帳戶中所有容器的最新清單。然後,系統會為找到的每個容器在目的地建立對應資料夾,並將容器的資料轉移至該新資料夾。

gcloud

下列指令會建立移轉作業,將指定 Azure 儲存空間帳戶中的所有容器移至 Cloud Storage bucket。

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 儲存體帳戶的名稱。
  • GCS_BUCKET_NAME:目的地 Cloud Storage bucket 的名稱。
  • PATH_TO_AZURE_SAS_FILE:含有帳戶層級 Azure SAS 權杖的文字檔本機路徑。例如:~/.azure/sas_token.txt。SAS 權杖必須在儲存空間帳戶層級建立,並為「允許的資源類型」選取「服務」、「容器」和「物件」。詳情請參閱「設定來源存取權:Microsoft Azure 儲存空間」。
  • 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 儲存體帳戶的名稱。
  • AZURE_SAS_TOKEN:完整的帳戶層級 SAS 權杖字串,例如 ?sv=2020-08-04&ss=bfqt&srt=sco&...。SAS 權杖必須在儲存空間帳戶層級建立,並選取「允許的資源類型」的「服務」、「容器」和「物件」。詳情請參閱「設定來源存取權:Microsoft Azure 儲存空間」。
  • GCS_BUCKET_NAME:目的地 Cloud Storage bucket 的名稱。

用戶端程式庫

本範例使用 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 儲存體帳戶的名稱。
  • AZURE_SAS_TOKEN:完整的帳戶層級 SAS 權杖字串,例如 ?sv=2020-08-04&ss=bfqt&srt=sco&...。SAS 權杖必須在儲存空間帳戶層級建立,並選取「允許的資源類型」的「服務」、「容器」和「物件」。詳情請參閱「設定來源存取權:Microsoft Azure 儲存空間」。
  • GCS_BUCKET_NAME:目的地 Cloud Storage bucket 的名稱。

如要進一步瞭解如何建立轉移作業和可用選項,請參閱「建立轉移作業」。

篩選要轉移的容器和物件

您可以使用前置字串或資訊清單檔案,控管要將哪些容器和物件納入移轉作業。

按照前置字串篩選

如要轉移容器或容器內的特定路徑,請提供 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 Blob 儲存空間進行事件導向移轉」。

Azure API 配額

從多個容器轉移資料可能會增加對 Azure 提出的 API 要求數量。Azure 儲存體帳戶有要求速率限制,通常約為每秒 20,000 個要求。如果容器數量非常多,Storage 移轉服務可能會節流列出程序,以維持在這些限制內。