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

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

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

מטרות

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

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Cloud de Confiance by S3NS, והשימוש בהם כרוך בתשלום:

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

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance 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

  2. Verify that billing is enabled for your Cloud de Confiance project.

  3. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  4. Install the Google Cloud CLI.

  5. Configure the gcloud CLI to use your federated identity.

    For more information, see Sign in to the gcloud CLI with your federated identity.

  6. To initialize the gcloud CLI, run the following command:

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

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

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

  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.s3ns.iam.gserviceaccount.com         False
    Service Account for FS Backups-Scheduler     schedulerunner@$PROJECT_ID.s3ns.iam.gserviceaccount.com      False
    

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

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

  • ‫Cloud de Confiance by S3NS מזהה פרויקט ו-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.s3ns-system.iam.gserviceaccount.com
    export SCHEDULER_CLIENT_SA=schedulerunner@$PROJECT_ID.s3ns.iam.gserviceaccount.com
    export GCF_CLIENT_SA=backupagent@$PROJECT_ID.s3ns.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 במסוף Cloud de Confiance .

    כניסה לדף Cloud Run functions

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

    • הגדרה:
    • טריגר:
      • בדוגמה הזו לא צריך להגדיר טריגר.
    • אימות: בוחרים באפשרות Require authentication.
    • ‫Ingress: בוחרים באפשרות All.
    • קונטיינרים, נפחים, רישות, אבטחה
      • עוברים לכרטיסייה אבטחה ובוחרים באפשרות Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.s3ns.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()
      auth_request = google.auth.transport.requests.Request()
      credentials.refresh(auth_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 במזהה הפרויקט של Cloud de Confiance מופע Filestore של המקור.
      • ‫fs-location עם האזור או התחום של מופע Filestore של המקור.
      • ‫instance-id בשם של מופע Filestore של המקור.
      • ‫file-share-name מחליפים בשם של שיתוף הקבצים.
      • ‫backup-region באזור שבו רוצים לאחסן את הגיבוי.
      1. לוחצים על בדיקה.

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

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

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

      מחיקת גיבוי

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

      .

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

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

      • Function name: 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()
      auth_request = google.auth.transport.requests.Request()
      credentials.refresh(auth_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 במזהה הפרויקט של הגיבוי. Cloud de Confiance
      • ‫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
    

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

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

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

    1. במסוף Cloud de Confiance , נכנסים לדף 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.

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

    1. במסוף Cloud de Confiance , נכנסים לדף 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. במסוף Cloud de Confiance , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

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

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