שילוב עם Google Cloud

Cloud Storage for Firebase משולב בצורה אופטימלית עם Google Cloud. ערכות ה-SDK של Firebase Cloud Storageמאפשרות לאחסן קבצים ישירות בדליים של Google Cloud Storage, וככל שהאפליקציה גדלה, אפשר לשלב שירותים אחרים של Google Cloud, כמו מחשוב מנוהל כמו App Engine או Cloud Functions, או ממשקי API של למידת מכונה כמו Cloud Vision או Google Translate.

פרויקט Firebase הוא למעשה פשוט Google Cloudפרויקט שמופעלים בו שירותים והגדרות נוספים שספציפיים ל-Firebase. המשמעות היא שכל קטגוריית Cloud Storage שבה אתם משתמשים עם Cloud Storage for Firebase נגישה ב-Google Cloud (כולל המסוף וממשקי ה-API שלה).

שילוב עם Google Cloud, כולל ייבוא של מאגרי Cloud Storage קיימים, מחייב פרויקט Firebase בתוכנית התמחור Blaze של תשלום לפי שימוש.

שיקולים לגבי חשבונות שירות

‫Firebase משתמשת בGoogle Cloud חשבונות שירות כדי להפעיל ולנהל שירותים בלי לשתף פרטי כניסה של משתמשים. כשיוצרים פרויקט Firebase שמשתמש ב-Cloud Storage, יכול להיות שתשימו לב שחשבון שירות תואם כבר זמין בפרויקט: service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com. מידע נוסף זמין במאמר סקירה כללית של חשבונות שירות ב-Firebase.

Google Cloud Storage

אתם יכולים להשתמש בממשקי ה-API של Google Cloud Storage כדי לגשת לקבצים שהועלו באמצעות ערכות ה-SDK של Firebase ל-Cloud Storage, במיוחד כדי לבצע פעולות מורכבות יותר, כמו העתקה או העברה של קובץ, או הצגת רשימה של כל הקבצים שזמינים בהפניה.

חשוב לציין שהבקשות האלה משתמשות בGoogle Cloud Storage אפשרויות של בקרת גישה, ולא ב-Firebase Authentication וב-Cloud Storage Security Rules.

ממשקי API

בנוסף לערכות ה-SDK של Firebase ל-Cloud Storage, יש עוד כמה דרכים לגשת לנתונים שמאוחסנים בדלי Cloud Storage, בהתאם לפעולה שרוצים לבצע. אם אתם ניגשים לנתונים בשרת, אנחנו מציעים ספריות בצד השרת, וגם JSON ו-API תואם ל-S3 XML RESTful. אם אתם צריכים לכתוב סקריפטים לשינויים או לבצע משימות ניהול אחרות, יש לנו כלי לשורת הפקודה שיכול לעזור לכם.

Google Cloud SDKs לשרתים

Google Cloud מציעה ערכות SDK איכותיות לשרתים למספר מוצרים בענן, כולל Cloud Storage. הספריות האלה זמינות ב-Node.js,‏ Java,‏ go,‏ Python,‏ PHP ו-Ruby.

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

דוגמה לשימוש ב-Google Cloud Storage SDK:

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) שמבצעת באופן אוטומטי שינוי גודל של לוגיקת ה-Backend בתגובה לכמות התנועה שהיא מקבלת. פשוט מעלים את הקוד של הקצה העורפי ו-Google תנהל את הזמינות של האפליקציה. לא צריך להקצות או לתחזק שרתים. ‫App Engine היא דרך מהירה ופשוטה להוסיף כוח עיבוד נוסף או ביצוע מהימן לאפליקציית Firebase.

אם יש לכם קטגוריית Cloud Storage שמוגדרת כברירת מחדל עם פורמט השם PROJECT_ID.appspot.com, היא משותפת אוטומטית עם אפליקציית App Engine בפרויקט. המשמעות היא שאם אתם יוצרים אפליקציה של App Engine, אתם יכולים להשתמש בממשקי ה-API המובנים של App Engine כדי לשתף נתונים בין הבאקט הזה לבין App Engine. האפשרות הזו שימושית לביצוע קידוד אודיו, המרת קידוד של סרטונים, שינויים בתמונות ועיבודים אחרים ברקע שדורשים הרבה משאבי מחשוב.

בסביבות הרגילות של Java,‏ Python ו-Go ל-App Engine כלול Images API של App Engine (‫Java |‏ Python |‏ Go), שמאפשר לשנות את הגודל של תמונה, לסובב אותה, להפוך אותה ולחתוך אותה, וגם להחזיר כתובת URL להצגת תמונה שמאפשרת לבצע טרנספורמציות בצד הלקוח, בדומה ל-Cloudinary ול-Imgix.

כשמייבאים פרויקט Google Cloud קיים ל-Firebase, אם רוצים להפוך אובייקטים קיימים של App Engine לזמינים ב-Firebase, צריך להגדיר את בקרת הגישה שמוגדרת כברירת מחדל לאובייקטים כך שתאפשר ל-Firebase לגשת אליהם. כדי לעשות זאת, מריצים את הפקודה הבאה באמצעות gsutil:

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, אז יש לפרויקט גם אפליקציית App Engine שמשתמשת באותה קטגוריה.

אם תגדירו את Firebase Security Rules לגישה ציבורית (לא מאומתת), גם קובצי App Engine שתעלו יהיו נגישים לציבור.

בעיות מוכרות ב-Cloud Storage וב-App Engine

יש שני מקרים ידועים שבהם אי אפשר לייבא את אפליקציית App Engine:

  1. הפרויקט מכיל אפליקציית App Engine Datastore Master/Slave לשעבר.
  2. לפרויקט יש מזהה פרויקט עם קידומת של דומיין, לדוגמה: domain.com:project-1234.

בכל אחד מהמקרים האלה, הפרויקט לא יתמוך ב-Cloud Storage for Firebase, ותצטרכו ליצור פרויקט חדש ב-Firebase כדי להשתמש ב-Cloud Storage. כדי שנוכל לעזור לך, עליך לפנות לתמיכה.