转移 Azure 存储账号中的所有容器

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 存储账号具有请求速率限制,通常约为每秒 20,000 个请求。如果您有大量容器,Storage Transfer Service 可能会限制列出过程,以保持在这些限制范围内。