Интеграция с Google Cloud

Cloud Storage for Firebase тесно интегрирован с Google Cloud . Пакеты Firebase SDK для 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 для доступа к файлам, загруженным через Firebase SDKs для Cloud Storage , особенно для выполнения более сложных операций, таких как копирование или перемещение файла или вывод списка всех файлов, доступных по ссылке.

Важно отметить, что эти запросы используют параметры управления доступом к Google Cloud Storage , а не Firebase Authentication и Cloud Storage Security Rules .

API-интерфейсы

Помимо Firebase SDK для Cloud Storage , существует ряд других способов доступа к данным, хранящимся в контейнере Cloud Storage , в зависимости от ваших задач. Если вы обращаетесь к данным на сервере, мы предлагаем серверные библиотеки, а также совместимый с JSON и S3 XML RESTful API. Если же вам нужно записать изменения в скрипт или выполнить другие административные задачи, у нас есть удобный инструмент командной строки.

Пакеты SDK для серверов Google Cloud

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) {});
    

Ява

    // 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();
    

Идти

    // 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)
    }
    

Питон

    # 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');
    

Руби

    # 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}"
    

REST API

Если вы используете язык без клиентской библиотеки, хотите сделать что-то, чего не делают клиентские библиотеки, или просто у вас есть любимый HTTP-клиент, который вы предпочитаете использовать, Google Cloud Storage предлагает API для JSON и XML .

В дополнение к этим API доступа к данным хранилища, для управления контейнерами Cloud Storage для использования в проектах Firebase можно использовать API Cloud Storage for Firebase .

gsutil

gsutil — это инструмент командной строки, обеспечивающий прямой доступ к Cloud Storage . gsutil можно использовать для выполнения широкого спектра задач по управлению контейнерами и объектами, включая:

  • Загрузка, скачивание и удаление объектов.
  • Перечисление контейнеров и объектов.
  • Перемещение, копирование и переименование объектов.
  • Редактирование списков контроля доступа объектов и контейнеров.

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 — это многопользовательский сервис, то есть пользователи используют один и тот же набор базовых ресурсов. Для оптимального использования этих общих ресурсов контейнеры имеют начальную ёмкость ввода-вывода.

Планируя интеграцию Cloud Storage for Firebase в своё приложение, подумайте о минимальной частоте запросов, необходимой вашему приложению для обеспечения высокой производительности, а также об эффективности выполнения запросов. Ознакомьтесь с рекомендациями по частоте запросов и, в частности, по её увеличению .

Версионирование объектов

Вы когда-нибудь случайно удаляли что-то и не имели резервной копии? Google Cloud Storage поддерживает Object Versioning (управление версиями объектов), что обеспечивает автоматическое резервное копирование данных и восстановление из этих резервных копий. Вы можете включить Object Versioning с помощью команды gsutil versioning set :

gsutil versioning set on gs://<your-cloud-storage-bucket>

Cloud Storage всегда выбирает самую последнюю версию, поэтому, если вы хотите восстановить объект, вам необходимо использовать один из других API или инструментов, указанных выше, чтобы сделать нужный объект самым последним.

Управление жизненным циклом объектов

Возможность автоматического архивирования или удаления устаревших файлов — полезная функция для многих приложений. К счастью, Google Cloud Storage предоставляет функцию управления жизненным циклом объектов (Object Lifecycle Management) , которая позволяет удалять или архивировать объекты по истечении определённого периода времени.

Представьте себе приложение для обмена фотографиями, в котором вы хотите удалить все фотографии в течение одного дня. Вы можете настроить политику жизненного цикла объекта следующим образом:

// 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 (бета)

Google Cloud Functions — это лёгкое, основанное на событиях, асинхронное вычислительное решение, позволяющее создавать небольшие специализированные функции, реагирующие на события, без необходимости управления сервером или средой выполнения. Эти функции можно использовать для перекодирования видео, классификации изображений с помощью машинного обучения или синхронизации метаданных с Firebase Realtime Database . Cloud Functions — это самый быстрый способ реагирования на изменения в Cloud Storage , требующий ещё меньших накладных расходов, чем App Engine .

API Google Cloud Vision

API Google Cloud Vision позволяет разработчикам анализировать содержание изображений, инкапсулируя мощные модели машинного обучения в простой в использовании API. Он быстро классифицирует изображения по тысячам категорий, распознаёт отдельные объекты и лица на изображениях, находит и считывает печатные слова на изображениях, определяет оскорбительный контент и даже анализирует тональность изображений.

API Google Cloud Speech

Подобно 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 включают 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 . Обратитесь в службу поддержки , чтобы мы могли вам помочь.