שילוב עם 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

אתם יכולים להשתמש בממשקי 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, היא משותפת אוטומטית עם אפליקציית App Engine בפרויקט. המשמעות היא שאם אתם יוצרים אפליקציה, אתם יכולים להשתמש בממשקי ה-API המובנים של App Engine כדי לשתף נתונים בין הבאקט הזה לבין App Engine.App Engine האפשרות הזו שימושית לביצוע קידוד אודיו, המרת קידוד וידאו, שינוי תמונות ועיבוד רקע אינטנסיבי אחר.

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

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

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

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

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

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