במדריך הזה נסביר איך אפשר לתזמן גיבויים של מופעי 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, והשימוש בהם כרוך בתשלום:
- Artifact Registry API
- Cloud Build API
- Filestore API
- Cloud Functions API
- Cloud Logging API
- Pub/Sub API
- Cloud Run Admin API
- Cloud Scheduler API
לפני שמתחילים
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Cloud de Confiance project.
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.enablepermission. 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.-
Install the Google Cloud CLI.
-
Configure the gcloud CLI to use your federated identity.
For more information, see Sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init - אם אין לכם מופע Filestore בפרויקט, אתם צריכים ליצור אחד.
יצירת חשבונות שירות של לקוחות לפונקציות של Cloud Scheduler ו-Cloud Run
אם עוד לא עשיתם את זה, ב Cloud de Confiance מסוף לוחצים על Activate Cloud Shell.
יוצרים חשבון שירות של לקוח ש-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"יוצרים חשבון שירות של לקוח שפונקציות 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 באזור שבו רוצים לאחסן את הגיבוי.
יצירת פונקציה שיוצרת גיבוי
נכנסים לדף פונקציות Cloud Run במסוף Cloud de Confiance .
לוחצים על Write a function (כתיבת פונקציה) ומגדירים את הפונקציה באופן הבא:
- הגדרה:
- שם השירות: בדוגמה הזו, נותנים לפונקציה את השם
fsbackup. - אזור: בדוגמה הזו, בוחרים באפשרות
us-central1. - Runtime: בתפריט בוחרים כל Runtime נתמך של Python 3 שנתמך באופן מלא על ידי פונקציות Cloud Run.
- שם השירות: בדוגמה הזו, נותנים לפונקציה את השם
- טריגר:
- בדוגמה הזו לא צריך להגדיר טריגר.
- אימות: בוחרים באפשרות
Require authentication. - Ingress: בוחרים באפשרות
All. - קונטיינרים, נפחים, רישות, אבטחה
- עוברים לכרטיסייה אבטחה ובוחרים באפשרות
Service Account for FS Backups-GCF(backupagent@$PROJECT_ID.s3ns.iam.gserviceaccount.com) בתפריט.
- עוברים לכרטיסייה אבטחה ובוחרים באפשרות
- הגדרה:
לוחצים על יצירה וממשיכים בהגדרה באופן הבא:
- 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 באזור שבו רוצים לאחסן את הגיבוי.
לוחצים על בדיקה.
סשן חדש של כרטיסייה ייפתח ב-Cloud Shell. אם הפעולה תצליח, תוחזר ההודעה הבאה:
Backup creation has begun!לוחצים על שמירה ופריסה מחדש ומחכים לסיום הפריסה.
חוזרים לכרטיסייה הקודמת של 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.
- Function entry point (נקודת כניסה לפונקציה): מזינים
הקצאת תפקידי IAM לחשבונות השירות של הלקוח
מוסיפים את סוכן השירות של 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נותנים לחשבון השירות של הלקוח של פונקציות 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מקצים לחשבון השירות של הלקוח ב-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 שמפעילה את הפונקציה לפי לוח זמנים שצוין
יצירת גיבוי
בדוגמה שלנו במדריך הזה, אם רוצים לתזמן גיבוי בכל יום חול בשעה 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.אפשר ליצור עד שישה גיבויים לכל מופע בשעה.
מפעילים את משימת Cloud Scheduler שנוצרה בשלב הקודם. בדוגמה שלנו, משתמשים בפקודה
scheduler jobs runsכדי להריץ אותה באופן מיידי:gcloud scheduler jobs run fsbackupscheduleהפונקציה
fsbackupמופעלת מיד על ידי המשימהfsbackupscheduleכשמריצים את הפקודה, ואז היא מופעלת שוב בכל יום עסקים בשעה 22:00 עד שהמשימה מושהית.בודקים את היומנים של הפונקציה
fsbackupכדי לראות אם היא מופעלת כמו שצריך ומחזירהstatus 200.כדי לראות את היומנים במסוף Cloud de Confiance , משתמשים ב-Logs Explorer:
-
במסוף Cloud de Confiance , נכנסים לדף Logs Explorer:
אם משתמשים בסרגל החיפוש כדי למצוא את הדף הזה, בוחרים בתוצאה שכותרת המשנה שלה היא Logging.
היומנים האחרונים מוצגים בחלונית Query results.
-
בודקים את הסטטוס של הגיבויים הקיימים באמצעות הפקודה
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
מחיקת גיבוי
בדוגמה שלנו במדריך הזה, אם רוצים לתזמן פעולה למחיקת גיבוי בכל יום חול בשעה 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שמשויכות לאותו מופע מקור צריכות להתבצע אחת בכל פעם. מידע נוסף זמין במאמר בנושא גיבויים.מפעילים את משימת Cloud Scheduler שנוצרה בשלב הקודם. בדוגמה שלנו, אנחנו משתמשים בפקודה
scheduler jobs runsכדי להריץ אותה באופן מיידי:gcloud scheduler jobs run deletefsbackupscheduleהפעולה
deletefsbackupscheduleמפעילה את הפונקציהdeletefsbackupמיד כשמריצים את הפקודה, ואז מפעילה אותה שוב בכל יום חול בשעה 22:00 עד שהפעולה מושהית.בודקים את היומנים של הפונקציה
deletefsbackupכדי לראות אם היא מופעלת כמו שצריך ומחזירהstatus 200.כדי לראות את היומנים במסוף Cloud de Confiance , משתמשים ב-Logs Explorer:
-
במסוף Cloud de Confiance , נכנסים לדף Logs Explorer:
אם משתמשים בסרגל החיפוש כדי למצוא את הדף הזה, בוחרים בתוצאה שכותרת המשנה שלה היא Logging.
היומנים האחרונים מוצגים בחלונית Query results.
-
בודקים את הסטטוס של הגיבויים הקיימים באמצעות הפקודה
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
התראות על מכסה נמוכה לגיבויים
אם ההטמעה של גיבויים מתוזמנים מעמידה אתכם בסיכון של חריגה ממכסת הגיבויים, מומלץ להגדיר התראות על מכסת גיבויים נמוכה. כך תקבלו התראה כשהמכסה של הגיבויים תהיה נמוכה.
הסרת המשאבים
אחרי שמסיימים את המדריך, אפשר למחוק את המשאבים שנוצרו, כדי שהם יפסיקו להשתמש במכסה ולצבור חיובים. בסעיפים הבאים מוסבר איך למחוק או להשבית את המשאבים האלו.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.
כדי למחוק את הפרויקט:
- במסוף Cloud de Confiance , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.