תזמון גיבויים

במדריך הזה נסביר איך אפשר לתזמן גיבויים של מופעי Filestore באמצעות Cloud Scheduler ופונקציות Cloud Run.

מידע על יצירת גיבויים באמצעות מתזמן שירות מנוהל זמין במאמר גיבויים משופרים של Filestore.

מטרות

  • יוצרים חשבון שירות לקוח עבור Cloud Scheduler עם פרטי הכניסה שנדרשים להפעלת פונקציה של Cloud Run.
  • יוצרים חשבון שירות לקוח לפונקציות Cloud Run עם פרטי הכניסה לקריאה לנקודת הקצה של Filestore.
  • יצירת פונקציה של Cloud Functions ב-Cloud Run שיוצרת גיבוי של מופע Filestore.
  • יצירה של פונקציית Cloud Run שמוחקת גיבוי של מופע Filestore.
  • יוצרים משימה של Cloud Scheduler שמריצה את אחת מהפונקציות במרווחי זמן קבועים.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. התקינו את ה-CLI של Google Cloud.

  6. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. התקינו את ה-CLI של Google Cloud.

  12. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  13. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  14. אם אין לכם מופע Filestore בפרויקט, אתם צריכים קודם ליצור אחד.

יצירת חשבונות שירות של לקוחות לפונקציות של Cloud Scheduler ו-Cloud Run

  1. אם עוד לא עשיתם זאת, במסוף, לוחצים על Activate Cloud Shell. Google Cloud

  2. יוצרים חשבון שירות של לקוח ש-Cloud Scheduler פועל דרכו כדי להפעיל פונקציה של Cloud Run Functions. בדוגמה הזו, משתמשים בפקודה iam service-accounts create כדי לתת לחשבון את השם schedulerunner ולהגדיר את השם המוצג 'Service Account for FS Backups-Scheduler':

    gcloud iam service-accounts create schedulerunner \
        --display-name="Service Account for FS Backups-Scheduler"
    
  3. יוצרים חשבון שירות של לקוח שפונקציות Cloud Run פועלות דרכו כדי להתקשר לנקודת הקצה של Filestore. בדוגמה הזו, אנחנו קוראים לחשבון backupagent ומגדירים את השם המוצג כ-Service Account for FS Backups-GCF:

    gcloud iam service-accounts create backupagent \
        --display-name="Service Account for FS Backups-GCF"
    

    כדי לבדוק אם חשבון השירות נוצר, מריצים את הפקודה iam service-accounts list:

    gcloud iam service-accounts list
    

    הפקודה מחזירה תשובה שדומה לדוגמה הבאה:

    NAME                                         EMAIL                                                   DISABLED
    Service Account for FS Backups-GCF           backupagent@$PROJECT_ID.iam.gserviceaccount.com         False
    Service Account for FS Backups-Scheduler     schedulerunner@$PROJECT_ID.iam.gserviceaccount.com      False
    

הגדרה של משתני סביבה

מגדירים את משתני הסביבה הבאים בסביבה המקומית:

  • ‫Google Cloud מזהה פרויקט ו-project:

    export PROJECT_ID=`gcloud config get-value core/project`
    export PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format="value(projectNumber)"`
    
  • סוכן השירות של Cloud Scheduler וחשבונות השירות של הלקוח עבור פונקציות של Cloud Scheduler ו-Cloud Run:

    export SCHEDULER_SA=service-$PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
    export SCHEDULER_CLIENT_SA=schedulerunner@$PROJECT_ID.iam.gserviceaccount.com
    export GCF_CLIENT_SA=backupagent@$PROJECT_ID.iam.gserviceaccount.com
    
  • מופע Filestore:

    export SOURCE_INSTANCE_LOCATION=fs-location
    export SOURCE_INSTANCE_NAME=instance-id
    export SHARE_NAME=file-share-name
    

    מחליפים את מה שכתוב בשדות הבאים:

    • fs-location עם האזור שבו נמצא מופע Filestore של המקור.
    • instance-id במזהה המופע של מופע Filestore המקור.
    • file-share-name עם השם שציינתם לשיתוף קבצים ב-NFS שמוגש מהמופע.
  • מגדירים משתני סביבה לגיבוי Filestore:

    export BACKUP_REGION=backup-region
    

    מחליפים את backup-region באזור שבו רוצים לאחסן את הגיבוי.

יצירת פונקציה שיוצרת גיבוי

  1. נכנסים לדף Cloud Run functions במסוף Google Cloud .

    כניסה לדף Cloud Run functions

  2. לוחצים על Write a function (כתיבת פונקציה) ומגדירים את הפונקציה באופן הבא:

    • הגדרה:
    • טריגר:
      • בדוגמה הזו אין צורך להגדיר טריגר.
    • אימות: בוחרים באפשרות Require authentication.
    • Ingress: בוחרים באפשרות All.
    • קונטיינרים, נפחים, רישות, אבטחה
      • עוברים לכרטיסייה אבטחה ובוחרים באפשרות Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com) בתפריט.
  3. לוחצים על יצירה וממשיכים בהגדרה באופן הבא:

    • Function entry point: מזינים create_backup.
    • מוסיפים את יחסי התלות הבאים לקובץ requirements.txt:

      functions-framework==3.*
      google-auth==2.29.0
      requests==2.31.0
      

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

    • מעתיקים את דוגמת הקוד הבאה של Python לקובץ main.py באמצעות העורך המוטבע:

      יצירת גיבוי

      דוגמת הקוד הזו יוצרת גיבוי בשם mybackup- עם הזמן שבו הוא נוצר.

      PROJECT_ID = 'project-id'
      SOURCE_INSTANCE_LOCATION = 'fs-location'
      SOURCE_INSTANCE_NAME = 'instance-id'
      SOURCE_FILE_SHARE_NAME = 'file-share-name'
      BACKUP_REGION = 'backup-region'
      
      import functions_framework
      import google.auth
      import google.auth.transport.requests
      from google.auth.transport.requests import AuthorizedSession
      import time
      import requests
      import json
      
      credentials, project = google.auth.default()
      request = google.auth.transport.requests.Request()
      credentials.refresh(request)
      authed_session = AuthorizedSession(credentials)
      
      def get_backup_id():
          return "mybackup-" + time.strftime("%Y%m%d-%H%M%S")
      
      @functions_framework.http
      def create_backup(request):
          trigger_run_url = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups?backupId={}".format(PROJECT_ID, BACKUP_REGION, get_backup_id())
          headers = {
            'Content-Type': 'application/json'
          }
          post_data = {
            "description": "my new backup",
            "source_instance": "projects/{}/locations/{}/instances/{}".format(PROJECT_ID, SOURCE_INSTANCE_LOCATION, SOURCE_INSTANCE_NAME),
            "source_file_share": "{}".format(SOURCE_FILE_SHARE_NAME)
          }
          print("Making a request to " + trigger_run_url)
          r = authed_session.post(url=trigger_run_url, headers=headers, data=json.dumps(post_data))
          data = r.json()
          print(data)
          if r.status_code == requests.codes.ok:
            print(str(r.status_code) + ": The backup is uploading in the background.")
          else:
            raise RuntimeError(data['error'])
          return "Backup creation has begun!"
      

      מחליפים את מה שכתוב בשדות הבאים:

      • project-id במזהה הפרויקט של Google Cloud מופע Filestore של המקור.
      • fs-location באזור או בתחום של מופע Filestore של המקור.
      • instance-id בשם של מופע Filestore של המקור.
      • file-share-name מחליפים בשם של שיתוף הקבצים.
      • backup-region בשם האזור שבו רוצים לאחסן את הגיבוי.
      1. לוחצים על בדיקה.

        סשן חדש בכרטיסייה נפתח ב-Cloud Shell. אם הפעולה תצליח, תוחזר ההודעה הבאה:

        Backup creation has begun!
        
      2. לוחצים על שמירה ופריסה מחדש ומחכים שהפריסה תסתיים.

      3. חוזרים לכרטיסייה הקודמת של Cloud Shell.

      מחיקת גיבוי

      בדוגמת הקוד הזו נמחקים גיבויים ישנים יותר מתקופה מוגדרת מראש.

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

      מגדירים את הפונקציה הזו באותו אופן שבו הגדרתם את הפונקציה שבה השתמשתם כדי ליצור גיבוי, עם השינויים הבאים:

      • שם הפונקציה: deletefsbackup.
      • נקודת כניסה: delete_backup.
      PROJECT_ID = 'project-id'
      BACKUP_REGION = 'region'
      BACKUP_RETENTION_TIME_HRS = hours
      
      import functions_framework
      import google.auth
      import google.auth.transport.requests
      from google.auth.transport.requests import AuthorizedSession
      import time
      import requests
      import json
      
      credentials, project = google.auth.default()
      request = google.auth.transport.requests.Request()
      credentials.refresh(request)
      authed_session = AuthorizedSession(credentials)
      
      retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60
      
      @functions_framework.http
      def delete_backup(request):
          now = time.time()
          backup_list = []
          trigger_run_url = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups".format(PROJECT_ID, BACKUP_REGION)
          r = authed_session.get(trigger_run_url)
          data = r.json()
          if not data:
              print("No backups to delete.")
              return "No backups to delete."
          else:
              backup_list.extend(data['backups'])
              while "nextPageToken" in data.keys():
                  nextPageToken = data['nextPageToken']
                  trigger_run_url_next = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken)
                  r = authed_session.get(trigger_run_url_next)
                  data = r.json()
                  backup_list.extend(data['backups'])
          for i in backup_list:
              backup_time = i['createTime']
              backup_time = backup_time[:-4]
              backup_time = float(time.mktime(time.strptime(backup_time, "%Y-%m-%dT%H:%M:%S.%f")))
              i['backup_timestamp'] = backup_time
          sorted_backup_list = sorted(backup_list, key=lambda d: d['backup_timestamp'])
          oldest_backup = sorted_backup_list[0]
          if now - oldest_backup['backup_timestamp'] > retention_seconds:
              print(oldest_backup['name'] + " is older than the indicated retention time.")
              r = authed_session.delete("https://file.googleapis.com/v1/{}".format(oldest_backup['name']))
              data = r.json()
              print(data)
              if r.status_code == requests.codes.ok:
                  print(str(r.status_code) + ": Deleting " + oldest_backup['name'] + " in the background.")
              else:
                  raise RuntimeError(data['error'])
              return "Backup deletion has begun!"
          return "All backups are within the indicated retention period."
      

      מחליפים את מה שכתוב בשדות הבאים:

      • project-id במזהה הפרויקט של הגיבוי. Google Cloud
      • region באזור שבו הגיבוי נמצא. הגיבוי, משימת המתזמן והפונקציה צריכים להיות באותו מיקום.
      • מחליפים את hours במספר השעות שבהן הגיבויים יישמרו. לדוגמה, אם רוצים לשמור גיבויים למשך 10 ימים, מזינים 240.

הקצאת תפקידי IAM לחשבונות השירות של הלקוח

  1. מוסיפים את סוכן השירות של Cloud Scheduler למדיניות IAM של חשבון השירות של לקוח Cloud Scheduler עם התפקיד roles/cloudscheduler.serviceAgent. כך סוכן השירות יכול להתחזות לחשבון השירות של הלקוח כדי להפעיל את הפונקציה שיוצרת גיבוי. מריצים את הפקודה iam service-accounts add-iam-policy-binding:

    gcloud iam service-accounts add-iam-policy-binding $SCHEDULER_CLIENT_SA \
        --member=serviceAccount:$SCHEDULER_SA \
        --role=roles/cloudscheduler.serviceAgent
    
  2. נותנים לחשבון השירות של הלקוח של פונקציות Cloud Run את התפקיד roles/file.editor כדי שהוא יוכל לבצע קריאות לנקודת הקצה של Filestore. מריצים את הפקודה projects add-iam-policy-binding:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:$GCF_CLIENT_SA \
        --role=roles/file.editor
    
  3. מקצים לחשבון השירות של הלקוח ב-Cloud Scheduler את התפקיד roles/run.invoker עבור הפונקציה שבה רוצים להשתמש. מריצים את הפקודה הבאה run services add-iam-policy-binding:

    יצירת גיבוי

    gcloud run services add-iam-policy-binding fsbackup \
        --member serviceAccount:$SCHEDULER_CLIENT_SA \
        --role roles/run.invoker \
        --region=us-central1
    

    מעכשיו, רק חשבון השירות של הלקוח ב-Cloud Scheduler יכול להפעיל את fsbackup.

    מחיקת גיבוי

    gcloud run services add-iam-policy-binding deletefsbackup \
        --member serviceAccount:$SCHEDULER_CLIENT_SA \
        --role roles/run.invoker
    

    מעכשיו, רק חשבון השירות של הלקוח ב-Cloud Scheduler יכול להפעיל את deletefsbackup.

יצירת משימה ב-Cloud Scheduler שמפעילה את הפונקציה לפי לוח זמנים שצוין

יצירת גיבוי

  1. בדוגמה שלנו במדריך הזה, אם רוצים לתזמן גיבוי בכל יום חול בשעה 22:00, משתמשים בפקודה scheduler jobs create http:

    gcloud scheduler jobs create http fsbackupschedule \
        --schedule "0 22 * * 1-5" \
        --http-method=GET \
        --uri=https://fsbackup-$PROJECT_NUMBER.us-central1.run.app \
        --oidc-service-account-email=$SCHEDULER_CLIENT_SA \
        --location=us-central1
    

    בדגל --schedule מציינים את התדירות שבה העבודה מופעלת באמצעות פורמט unix-cron. פרטים נוספים מופיעים במאמר הגדרת לוחות זמנים של משימות cron.

    אפשר ליצור עד שש גיבויים לכל מופע בשעה.

  2. מפעילים את משימת Cloud Scheduler שנוצרה בשלב הקודם. בדוגמה שלנו, משתמשים בפקודה scheduler jobs runs כדי להריץ אותה באופן מיידי:

    gcloud scheduler jobs run fsbackupschedule
    

    הג'וב fsbackupschedule מפעיל את הפונקציה fsbackup מיד אחרי שמריצים את הפקודה, ואז מפעיל אותה שוב בכל יום עבודה בשעה 22:00 עד שהג'וב מושהה.

  3. בודקים את היומנים של הפונקציה fsbackup כדי לראות אם היא מופעלת בצורה תקינה ומחזירה status 200.

    כדי לראות את היומנים במסוף Google Cloud , משתמשים ב-Logs Explorer:

    1. במסוף Google Cloud , נכנסים לדף Logs Explorer:

      כניסה אל Logs Explorer

      אם משתמשים בסרגל החיפוש כדי למצוא את הדף הזה, בוחרים בתוצאה שכותרת המשנה שלה היא Logging.

      היומנים האחרונים מוצגים בחלונית Query results.

  4. בודקים את הסטטוס של הגיבויים הקיימים באמצעות הפקודה backups list:

    gcloud filestore backups list
    

    הפקודה מחזירה פלט שדומה לזה:

    NAME                      LOCATION     SRC_INSTANCE                        SRC_FILE_SHARE  STATE
    mybackup-20201123-184500  us-central1  us-central1-c/instances/nfs-server  vol1            READY
    

מחיקת גיבוי

  1. בדוגמה שלנו במדריך הזה, אם רוצים לתזמן פעולה למחיקת גיבוי בכל יום חול בשעה 22:00, משתמשים בפקודה scheduler jobs create http:

    gcloud scheduler jobs create http deletefsbackupschedule \
        --schedule "0 22 * * 1-5" \
        --http-method=GET \
        --uri=https://us-central1-$PROJECT_ID.cloudfunctions.net/deletefsbackup \
        --oidc-service-account-email=$SCHEDULER_CLIENT_SA    \
        --oidc-token-audience=https://us-central1-$PROJECT_ID.cloudfunctions.net/deletefsbackup
    

    בדגל --schedule מציינים את התדירות שבה העבודה מופעלת באמצעות פורמט unix-cron. פרטים נוספים מופיעים במאמר הגדרת לוחות זמנים של משימות cron.

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

  2. מפעילים את משימת Cloud Scheduler שנוצרה בשלב הקודם. בדוגמה שלנו, אנחנו משתמשים בפקודה scheduler jobs runs כדי להריץ אותה באופן מיידי:

    gcloud scheduler jobs run deletefsbackupschedule
    

    הג'וב deletefsbackupschedule מפעיל את הפונקציה deletefsbackup מיד אחרי שמריצים את הפקודה, ואז מפעיל אותה שוב בכל יום עבודה בשעה 22:00 עד שהג'וב מושהה.

  3. בודקים את היומנים של הפונקציה deletefsbackup כדי לראות אם היא מופעלת בצורה תקינה ומחזירה status 200.

    כדי לראות את היומנים במסוף Google Cloud , משתמשים ב-Logs Explorer:

    1. במסוף Google Cloud , נכנסים לדף Logs Explorer:

      כניסה אל Logs Explorer

      אם משתמשים בסרגל החיפוש כדי למצוא את הדף הזה, בוחרים בתוצאה שכותרת המשנה שלה היא Logging.

      היומנים האחרונים מוצגים בחלונית Query results.

  4. בודקים את הסטטוס של הגיבויים הקיימים באמצעות הפקודה backups list:

    gcloud filestore backups list
    

    הפקודה מחזירה פלט שדומה לזה:

    NAME                      LOCATION     SRC_INSTANCE                        SRC_FILE_SHARE  STATE
    mybackup-20201123-184500  us-central1  us-central1-c/instances/nfs-server  vol1            READY
    

התראות על מכסת נפח אחסון נמוכה לגיבויים

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

הסרת המשאבים

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

מחיקת הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

המאמרים הבאים