שילוב עם Google Cloud

Cloud Storage for Firebase משולב בצורה אופטימלית עם Google Cloud. ערכות ה-SDK של Firebase ל-Cloud Storage שומרות קבצים ישירות בקטגוריות (buckets) של 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, בהתאם למה שאתם רוצים לעשות. אם אתם ניגשים לנתונים בשרת, אנחנו מציעים ספריות בצד השרת, וגם ממשק API מסוג RESTful XML שתואם ל-JSON ול-S3. אם אתם צריכים לכתוב סקריפטים לשינויים או לבצע משימות ניהוליות אחרות, יש לנו כלי שורת פקודה שיהיה שימושי.

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 הוא שירות שניתן להתאמה, המשתמש בטכנולוגיה להתאמה לעומס (scaling) כדי להשיג קצבי בקשות גבוהים מאוד.

Google Cloud Storage הוא שירות מרובה דיירים (multi-tenant), כלומר המשתמשים חולקים את אותה קבוצה של משאבים בסיסיים. כדי לנצל את המשאבים המשותפים בצורה הטובה ביותר, לכל קטגוריה יש קיבולת IO ראשונית.

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

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

הסביבות הסטנדרטיות של Java,‏ Python ו-Go ל-App Engine כוללות את App Engine Images API‏ (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. מומלץ לפנות לתמיכה כדי שנוכל לעזור לכם.