פרויקט Firebase הוא למעשה רק Google Cloudפרויקט שמופעלים בו שירותים והגדרות נוספים שספציפיים ל-Firebase. המשמעות היא שכל קטגוריית Cloud Storage שבה אתם משתמשים עם Cloud Storage for Firebase נגישה ב-Google Cloud (כולל המסוף וממשקי ה-API שלה).
שילוב עם Google Cloud, כולל ייבוא של מאגרי Cloud Storage קיימים, מחייב פרויקט Firebase בתוכנית התמחור Blaze של תשלום לפי שימוש.
, גם בדלי ברירת מחדל, יהיה צורך בתוכנית התמחור Blaze.שיקולים לגבי חשבונות שירות
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 server SDKs
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 הוא שירות שניתן להתאמה, המשתמש בטכנולוגיה להתאמה לעומס (scaling) כדי להשיג קצבי בקשות גבוהים מאוד.
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
Google App Engine היא פלטפורמה כשירות (PaaS) שמבצעת באופן אוטומטי שינוי גודל של לוגיקת הקצה העורפי בתגובה לכמות התנועה שהיא מקבלת. פשוט מעלים את הקוד של הקצה העורפי ו-Google תנהל את הזמינות של האפליקציה. לא צריך להקצות שרתים או לתחזק אותם. App Engine היא דרך מהירה ופשוטה להוסיף כוח עיבוד נוסף או ביצוע מהימן לאפליקציית Firebase.
אם יש לכם קטגוריית Cloud Storage ברירת מחדל עם פורמט השם PROJECT_ID.appspot.com
standard environments של Java, Python ו-Go ל-App Engine כוללים את Images API של App Engine (Java | Python | Go), שמאפשר לשנות את הגודל של תמונה, לסובב אותה, להפוך אותה ולחתוך אותה, וגם להחזיר כתובת URL להצגת תמונה שמאפשרת לבצע טרנספורמציות בצד הלקוח, בדומה ל-Cloudinary ול-Imgix.
כשמייבאים פרויקט Google Cloud קיים ל-Firebase, אם רוצים שאובייקטים קיימים של Google Cloud יהיו זמינים ב-Firebase, צריך להגדיר את בקרת הגישה שמוגדרת כברירת מחדל לאובייקטים כדי לאפשר ל-Firebase לגשת אליהם. לשם כך, מריצים את הפקודה הבאה באמצעות gsutil:App Engine
gsutil -m acl ch -r -u service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com gs://BUCKET_NAME
שיקולים לגבי קבצים מסוג Firebase Security Rules ו-App Engine
אם יש לכם קטגוריית Cloud Storage שמוגדרת כברירת מחדל עם פורמט שם של *.appspot.com
אם תגדירו את Firebase Security Rules לגישה ציבורית (לא מאומתת), גם קובצי App Engine שתעלו יהיו נגישים לציבור.
בעיות מוכרות ב-Cloud Storage וב-App Engine
יש שני מקרים ידועים שבהם אי אפשר לייבא את אפליקציית App Engine:
- הפרויקט מכיל אפליקציית Master/Slave לשעבר של App Engine Datastore.
- לפרויקט יש מזהה פרויקט עם קידומת של דומיין, לדוגמה:
domain.com:project-1234.
בכל אחד מהמקרים האלה, הפרויקט לא יתמוך ב-Cloud Storage for Firebase, ותצטרכו ליצור פרויקט חדש ב-Firebase כדי להשתמש ב-Cloud Storage. כדי שנוכל לעזור לך, עליך לפנות לתמיכה.