העברה של כל הקונטיינרים בחשבון Azure Storage

בעזרת Storage Transfer Service אפשר להעביר נתונים מכל הקונטיינרים בחשבון Microsoft Azure Storage יחיד במשימת העברה אחת. האפשרות הזו מפשטת את תהליך העבודה בתרחישי שימוש כמו קליטת יומנים שמופצים בכמה מאגרי תגים.

הגדרת העברה לכל המאגרים

כדי להעביר את כל הקונטיינרים בחשבון אחסון, צריך לציין את קונטיינר המקור כ- (כוכבית אחת) באובייקט של  public API או כ- כשמציינים את המקור בפקודה .*AzureBlobStorageDatahttps://AZURE_ACCOUNT_NAME.blob.core.windows.net/*gcloud

אי אפשר לציין תיקיית מקור או 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: הנתיב המקומי לקובץ טקסט שמכיל את אסימון ה-SAS של Azure ברמת החשבון. לדוגמה: ~/.azure/sas_token.txt. צריך ליצור את אסימון ה-SAS ברמת חשבון האחסון, כשמסומנות האפשרויות Service, ‏ Container ו-Object ב-Allowed resource types. פרטים נוספים מופיעים במאמר בנושא הגדרת גישה למקור: Microsoft Azure Storage.
  • ‫PROJECT_ID: מזהה הפרויקט ב-Google Cloud שבו מתבצעת ההעברה.

REST

כדי ליצור את ההעברה הזו באמצעות API בארכיטקטורת REST, שולחים בקשת POST לנקודת הקצה https://storagetransfer.googleapis.com/v1/transferJobs.

גוף הבקשה:

{
  "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 שבו מתבצעת ההעברה.
  • ‫AZURE_ACCOUNT_NAME: השם של חשבון Azure Storage.
  • ‫AZURE_SAS_TOKEN: המחרוזת המלאה של טוקן SAS ברמת החשבון, כמו ?sv=2020-08-04&ss=bfqt&srt=sco&.... צריך ליצור את אסימון ה-SAS ברמת חשבון האחסון, כשמסומנות האפשרויות Service, ‏ Container ו-Object בAllowed resource types. פרטים נוספים מופיעים במאמר בנושא הגדרת גישה למקור: 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 שבו מתבצעת ההעברה.
  • ‫AZURE_ACCOUNT_NAME: השם של חשבון Azure Storage.
  • ‫AZURE_SAS_TOKEN: המחרוזת המלאה של טוקן SAS ברמת החשבון, כמו ?sv=2020-08-04&ss=bfqt&srt=sco&.... צריך ליצור את אסימון ה-SAS ברמת חשבון האחסון, כשמסומנות האפשרויות Service, ‏ Container ו-Object בAllowed resource types. פרטים נוספים מופיעים במאמר בנושא הגדרת גישה למקור: 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.
  • מעביר את כל האובייקטים בנתיב logs/2025/ מ-container-b.
  • מדלג על כל שאר המאגדים בחשבון האחסון.

כדי להעביר את כל האובייקטים בנתיב logs/2025/ מכל מאגר בחשבון האחסון, מציינים "*/logs/2025/" ב-includePrefixes.

מידע נוסף על הכללה והחרגה של קידומות זמין במאמר בנושא סינון לפי קידומת.

סינון באמצעות מניפסט

כדי להשתמש בקובץ מניפסט להעברה של כמה מאגרי מידע, הנתיב של כל אובייקט שמופיע בקובץ ה-CSV של המניפסט צריך להתחיל בשם של מאגר המידע.

לדוגמה:

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

פרטים נוספים על קובצי מניפסט מופיעים במאמר העברת קבצים או אובייקטים ספציפיים באמצעות מניפסט.

העברות מבוססות-אירועים

העברות מבוססות-אירועים מ-Azure נתמכות בהגדרות של כמה מאגרי תגים.

כדי להשיג את הביצועים הכי טובים ולמנוע עיבוד מיותר של אירועים, צריך להגדיר את מסנן האירועים ב-Azure כדי לציין אילו מאגרי נתונים צריכים להפעיל אירועים. אם לא משתמשים במסנן, ייווצרו אירועים לכל העדכונים של מאגרי התגים בחשבון האחסון.

לפרטים נוספים, ראו העברות מ-Azure Blob Storage שמבוססות על אירועים.

מכסות ל-API של Azure

העברה ממספר רב של מאגרי תגים יכולה להגדיל את מספר הבקשות ל-API שנשלחות אל Azure. לחשבונות Azure Storage יש מגבלות על קצב הבקשות, בדרך כלל בסביבות 20,000 בקשות לשנייה. אם יש לכם מספר גדול מאוד של קונטיינרים, יכול להיות ש-Storage Transfer Service יגביל את תהליך הרישום כדי לא לחרוג מהמגבלות האלה.