פרויקט Firebase הוא למעשה רק Google Cloudפרויקט שמופעלים בו שירותים והגדרות נוספים שספציפיים ל-Firebase. המשמעות היא שכל קטגוריית Cloud Storage שבה אתם משתמשים עם Cloud Storage for Firebase נגישה ב-Google Cloud (כולל המסוף וממשקי ה-API שלה).
שיקולים לגבי חשבונות שירות
Firebase משתמש בGoogle Cloud חשבונות שירות כדי להפעיל ולנהל שירותים בלי לשתף פרטי כניסה של משתמשים. כשיוצרים פרויקט Firebase שמשתמש ב-Cloud Storage, יכול להיות שתשימו לב שחשבון שירות תואם כבר זמין בפרויקט:
.
מידע נוסף מופיע במאמר סקירה כללית על חשבונות שירות של Firebase.
Google Cloud Storage
אתם יכולים להשתמש בממשקי Google Cloud Storage API כדי לגשת לקבצים שהועלו דרך ערכות ה-SDK של Firebase ל-Cloud Storage, במיוחד כדי לבצע פעולות מורכבות יותר, כמו העתקה או העברה של קובץ, או הצגת רשימה של כל הקבצים שזמינים בהפניה.
חשוב לציין שהבקשות האלה משתמשות בGoogle Cloud Storage אפשרויות של בקרת גישה, ולא ב-Firebase Authentication וב-Cloud Storage Security Rules.
ממשקי API
בנוסף לערכות ה-SDK של Firebase ל-Cloud Storage, יש עוד כמה דרכים לגשת לנתונים שמאוחסנים בדלי Cloud Storage, בהתאם לפעולה שרוצים לבצע. אם אתם ניגשים לנתונים בשרת, אנחנו מציעים ספריות בצד השרת, וגם ממשק RESTful API תואם ל-JSON ול-S3 XML. אם אתם צריכים לכתוב סקריפטים לשינויים או לבצע משימות ניהול אחרות, יש לנו כלי לשורת הפקודה שיכול לעזור לכם.
Google Cloud ערכות SDK לשרתים
Google Cloud מציעה ערכות SDK איכותיות לשרתים למספר מוצרים בענן, כולל Cloud Storage. הספריות האלה זמינות ב-Node.js, Java, Go, Python, PHP ו-Ruby.
למידע נוסף, כולל הוראות התקנה, אימות ופתרון בעיות, אפשר לעיין בתיעוד הספציפי לפלטפורמה שמקושר למעלה.
למטה מוצגת דוגמה לשימוש ב-SDK בגרסה Google Cloud Storage:
Node.js
// Require gcloud var gcloud = require('google-cloud'); // Enable Cloud Storage var gcs = gcloud.storage({ projectId: 'grape-spaceship-123', keyFilename: '/path/to/keyfile.json' }); // Reference an existing bucket. var bucket = gcs.bucket('my-existing-bucket'); // Upload a local file to a new file to be created in your bucket. bucket.upload('/photos/zoo/zebra.jpg', function(err, file) { if (!err) { // "zebra.jpg" is now in your bucket. } }); // Download a file from your bucket. bucket.file('giraffe.jpg').download({ destination: '/photos/zoo/giraffe.jpg' }, function(err) {});
Java
// Enable Cloud Storage Storage storage = StorageOptions.builder() .authCredentials(AuthCredentials.createForJson(new FileInputStream("/path/to/my/key.json")) .build() .service(); // Upload a local file to a new file to be created in your bucket. InputStream uploadContent = ... BlobId blobId = BlobId.of("my-existing-bucket", "zebra.jpg"); BlobInfo blobInfo = BlobInfo.builder(blobId).contentType("text/plain").build(); Blob zebraBlob = storage.create(blobInfo, content); // Download a file from your bucket. Blob giraffeBlob = storage.get("my-existing-bucket", "giraffe.jpg", null); InputStream downloadContent = giraffeBlob.getInputStream();
Go
// Enable Cloud Storage client, err := storage.NewClient(ctx, option.WithServiceAccountFile("path/to/keyfile.json")) if err != nil { log.Fatal(err) } // Download a file from your bucket. rc, err := client.Bucket("my-existing-bucket").Object("giraffe.jpg").NewReader(ctx) if err != nil { log.Fatal(err) } defer rc.Close() body, err := ioutil.ReadAll(rc) if err != nil { log.Fatal(err) }
Python
# Import gcloud from google.cloud import storage # Enable Cloud Storage client = storage.Client() # Reference an existing bucket. bucket = client.get_bucket('my-existing-bucket') # Upload a local file to a new file to be created in your bucket. zebraBlob = bucket.get_blob('zebra.jpg') zebraBlob.upload_from_filename(filename='/photos/zoo/zebra.jpg') # Download a file from your bucket. giraffeBlob = bucket.get_blob('giraffe.jpg') giraffeBlob.download_as_string()
PHP
// Require gcloud require 'vendor/autoload.php'; use Google\Cloud\Storage\StorageClient; // Enable Cloud Storage $storage = new StorageClient([ 'projectId' => 'grape-spaceship-123' ]); // Reference an existing bucket. $bucket = $storage->bucket('my-existing-bucket'); // Upload a file to the bucket. $bucket->upload( fopen('/photos/zoo/zebra.jpg', 'r') ); // Download a file from your bucket. $object = $bucket->object('giraffe.jpg'); $object->downloadToFile('/photos/zoo/giraffe.jpg');
Ruby
# Require gcloud require "google/cloud" # Enable Cloud Storage gcloud = Google::Cloud.new "grape-spaceship-123", "/path/to/keyfile.json" storage = gcloud.storage # Reference an existing bucket. bucket = storage.bucket "my-existing-bucket" # Upload a file to the bucket. bucket.create_file "/photos/zoo/zebra.jpg", "zebra.jpg" # Download a file from your bucket. file = bucket.file "giraffe.jpg" file.download "/photos/zoo/#{file.name}"
API בארכיטקטורת REST
אם אתם משתמשים בשפה שאין לה ספריית לקוח, רוצים לעשות משהו שספריות הלקוח לא עושות או פשוט יש לכם לקוח HTTP מועדף שאתם מעדיפים להשתמש בו, Google Cloud Storage מציע ממשקי API ל-JSON ול-XML.
בנוסף לממשקי ה-API האלה לגישה לנתוני אחסון, כדי לנהל מאגרי Cloud Storage לשימוש בפרויקטים של Firebase, אפשר להשתמש ב-Cloud Storage for Firebase API.
gsutil
gsutil הוא כלי לשורת הפקודה שמאפשר גישה ישירה ל-Cloud Storage. אפשר להשתמש ב-gsutil כדי לבצע מגוון רחב של משימות לניהול קטגוריות ואובייקטים, כולל:
- העלאה, הורדה ומחיקה של אובייקטים.
- הצגת קטגוריות ואובייקטים.
- העברה, העתקה ושינוי שם של אובייקטים.
- עריכת רשימות ACL של אובייקטים ושל קטגוריות.
gsutil מאפשרות לבצע פעולות מתקדמות אחרות, כמו העברת קבצים מספרייה אחת לאחרת או מחיקת כל הקבצים מתחת למיקום מסוים.
כדי להעביר את כל הקבצים מקובץ עזר אחד לקובץ עזר אחר, פשוט מבצעים את הפעולות הבאות:
gsutil mv gs://bucket/old/reference gs://bucket/new/reference
מחיקה של כל הקבצים שמתחת לקובץ עזר מתבצעת באופן דומה ואינטואיטיבי:
# Delete all files under a path gsutil rm -r gs://bucket/reference/to/delete# Delete all the files in a bucket but not the bucket gsutil rm -r gs://bucket/**
# Delete all the files AND the bucket # Removing the default bucket will break the Firebase SDKs for Cloud Storage and is strongly discouraged gsutil rm -r gs://bucket
בקשת תעריפים
Google Cloud Storage הוא שירות שניתן להתאמה, המשתמש בטכנולוגיה של התאמה אוטומטית לעומס כדי להשיג קצבי בקשות גבוהים מאוד.
Google Cloud Storage הוא שירות מרובה דיירים (multi-tenant), כלומר המשתמשים חולקים את אותה קבוצה של משאבים בסיסיים. כדי לנצל את המשאבים המשותפים בצורה הטובה ביותר, הקיבולת הראשונית של כל קטגוריה היא:
כשמתכננים לשלב את Cloud Storage for Firebase באפליקציה, כדאי לחשוב על קצב הבקשות המינימלי שהאפליקציה צריכה כדי להשיג ביצועים טובים, ועל דרכים לשלוח בקשות בצורה יעילה. כדאי לעיין בהנחיות לגבי קצב בקשות, ובמיוחד בהנחיות לגבי הגברת קצב הבקשות בהדרגה.
ניהול גרסאות של אובייקטים
קרה לך פעם שמחקת משהו בטעות ולא היה לך גיבוי?
Google Cloud Storage תומך בשמירת גרסאות של אובייקטים, שמאפשרת לגבות את הנתונים באופן אוטומטי ולשחזר אותם מהגיבויים האלה. אפשר להפעיל ניהול גרסאות של אובייקטים באמצעות הפקודה gsutil versioning set:
gsutil versioning set on gs://<your-cloud-storage-bucket>
Cloud Storage תמיד בוחר את הגרסה העדכנית ביותר, לכן אם רוצים לשחזר אובייקט, צריך להשתמש באחד מהממשקי ה-API או הכלים האחרים שצוינו למעלה כדי להגדיר את האובייקט הרצוי כעדכני ביותר.
ניהול מחזור חיים של אובייקטים
היכולת להעביר לארכיון או למחוק קבצים לא פעילים באופן אוטומטי היא תכונה שימושית להרבה אפליקציות. למזלכם, Google Cloud Storage מספקת את התכונה ניהול מחזור חיים של אובייקטים, שמאפשרת לכם למחוק או לארכב אובייקטים אחרי פרק זמן מסוים.
נניח שיש לכם אפליקציה לשיתוף תמונות שבה אתם רוצים למחוק את כל התמונות תוך יום אחד. כדי להגדיר מדיניות בנושא מחזור החיים של אובייקט:
// lifecycle.json { "lifecycle": { "rule": [ { "action": {"type": "Delete"}, "condition": {"age": 1} } ] } }
פורסים אותו באמצעות הפקודה gsutil lifecycle set:
gsutil lifecycle set lifecycle.json gs://<your-cloud-storage-bucket>
שימו לב שההגדרה הזו חלה על כל הקבצים בקטגוריה. לכן, אם אתם מאחסנים גיבויים חשובים של משתמשים שאתם רוצים לשמור לטווח ארוך לצד תמונות שאתם רוצים למחוק מדי יום, כדאי להשתמש בשתי קטגוריות נפרדות או לבצע מחיקות באופן ידני באמצעות gsutil או השרת שלכם.
Google Cloud Functions (בטא)
Google Cloud Functions הוא פתרון קל משקל, מבוסס-אירועים ואסינכרוני למחשוב, שמאפשר ליצור פונקציות קטנות למטרה יחידה שמגיבות לאירועים בלי צורך לנהל שרת או סביבת זמן ריצה. אפשר להשתמש בפונקציות האלה כדי לבצע טרנסקוד של סרטונים, לסווג תמונות באמצעות למידת מכונה או לסנכרן מטא-נתונים עם Firebase Realtime Database. עם תקורה נמוכה עוד יותר מאשר ב-App Engine, שירות Cloud Functions הוא הדרך המהירה ביותר להגיב לשינויים ב-Cloud Storage.
Google Cloud Vision API
Google Cloud Vision API מאפשר למפתחים להבין את התוכן של תמונה באמצעות שימוש במודלים מתקדמים של למידת מכונה בממשק API קל לשימוש. היא מסווגת תמונות במהירות לאלפי קטגוריות, מזהה אובייקטים ותווי פנים בתמונות, מאתרת ומקריאה מילים מודפסות שמופיעות בתמונות, מזהה תוכן פוגע ואפילו מספקת ניתוח סנטימנט של תמונות.
Google Cloud Speech API
בדומה ל-Vision API, Google Cloud Speech API מאפשר למפתחים לחלץ טקסט מקובץ אודיו שמאוחסן ב-Cloud Storage. ממשק ה-API מזהה יותר מ-80 שפות ווריאציות, כדי לתמוך בבסיס המשתמשים הגלובלי שלכם. בשילוב עם Google Cloud Natural Language API, מפתחים יכולים לחלץ את הטקסט הגולמי ולהסיק משמעויות לגבי הטקסט הזה. אם נדרש קהל גלובלי, אפשר לשלב את התכונה הזו עם Google Translate API כדי לתרגם את הטקסט ליותר מ-90 שפות.
Google App Engine
ב-Cloud Storage for Firebase יש שני פורמטים שונים של שמות לקטגוריות ברירת מחדל, בהתאם למועד שבו יצרתם את הקטגוריה:
- קטגוריות ברירת מחדל שנוצרו אחרי
ספטמבר 2024 : קטגוריות ברירת מחדל הן נפרדות מ-Google App Engine.*.firebasestorage.app - קטגוריות ברירת מחדל מדור קודם:
קטגוריות ברירת המחדל
משותפות עם Google App Engine.*.appspot.com
Google App Engine הוא 'פלטפורמה כשירות' שמבצעת באופן אוטומטי שינוי גודל של לוגיקת ה-Backend בתגובה לכמות התנועה שהיא מקבלת. פשוט מעלים את הקוד של הקצה העורפי ו-Google תנהל את הזמינות של האפליקציה. לא צריך להקצות שרתים או לתחזק אותם. App Engine היא דרך מהירה ופשוטה להוסיף כוח עיבוד נוסף או ביצוע מהימן לאפליקציית Firebase.
שילוב של App Engine מדור קודם
אם יש לכם קטגוריית ברירת מחדל מדור קודם של *.appspot.com
בסביבות הרגילות של Java, Python ו-Go ל-App Engine כלול Images API של App Engine (Java | Python | Go), שמאפשר לשנות את הגודל של תמונה, לסובב אותה, להפוך אותה ולחתוך אותה, וגם להחזיר כתובת URL להצגת תמונה שמאפשרת לבצע שינויים בצד הלקוח, בדומה ל-Cloudinary ול-Imgix.
שיקולים לגבי קטגוריות משותפות
אם אתם משתמשים בקטגוריית ברירת המחדל מדור קודם *.appspot.com
קבצים מסוג Firebase Security Rules ו-App Engine: קבצים שמועלים באמצעות App Engine שותפים לאותו מאגר (bucket) וכפופים לאותן הגדרות אבטחה. אם תגדירו את Firebase Security Rules לגישה ציבורית, גם קבצים חדשים שתעלו ל-App Engine יהיו נגישים לכולם.
הגדרת הרשאות: כשמייבאים פרויקט Google Cloud קיים ל-Firebase, יכול להיות שיהיה צורך להגדיר את בקרת הגישה שמוגדרת כברירת מחדל לאובייקטים כדי לאפשר ל-Firebase לגשת אליהם. מריצים את הפקודה הבאה באמצעות
gsutil:gsutil -m acl ch -r -u service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com gs://BUCKET_NAME
בעיות מוכרות ב-Cloud Storage וב-App Engine
יש שני מקרים ידועים שבהם אי אפשר לייבא את אפליקציית App Engine:
הפרויקט מכיל אפליקציית App Engine Datastore Master/Slave לשעבר.
לפרויקט יש מזהה פרויקט עם קידומת של דומיין, לדוגמה:
domain.com:project-1234.
בכל אחד מהמקרים האלה, הפרויקט לא יתמוך ב-Cloud Storage for Firebase, ותצטרכו ליצור פרויקט חדש ב-Firebase כדי להשתמש ב-Cloud Storage. אם יש לכם שאלות, אתם יכולים לפנות לתמיכה של Firebase.