Flutter で Cloud Storage を使ってみる

Cloud Storage for Firebase を使用して画像や動画などのユーザー作成コンテンツをアップロードして共有し、リッチメディア コンテンツをアプリに組み込むことができます。データは Google Cloud Storage バケットに格納されます。これはエクサバイト規模のオブジェクト ストレージ ソリューションで、高い可用性とグローバルな冗長性を備えています。Cloud Storage for Firebase を使うと、モバイル デバイスやウェブブラウザから直接ファイルを安全にアップロードでき、不安定なネットワークでも安心して行えます。

始める前に

  1. まだ行っていない場合は、Flutter アプリのスタートガイドを完了してください。以下に例を示します。

    • Firebase プロジェクトの作成。

    • Flutter 用の Firebase SDK のインストールと初期化。

  2. Firebase プロジェクトで 従量課金制の Blaze 料金プランを利用していることを確認します。Firebase と Google Cloud を初めて使用する場合は、$300 のクレジットを利用できるかどうかご確認ください。

デフォルトの Cloud Storage バケットを作成する

  1. Firebase コンソールのナビゲーション パネルで [ストレージ] を選択します。

    プロジェクトが従量課金制の Blaze の料金プランにまだ登録されていない場合は、プロジェクトをアップグレードするよう求められます。

  2. [開始] をクリックします。

  3. デフォルトのバケットのロケーションを選択します。

  4. デフォルト バケットの Firebase Security Rules を構成します。開発時に公開アクセスルールの設定を考慮してください。

  5. [完了] をクリックします。

バケットは、Firebase コンソールの [Cloud Storage ファイル] タブで確認できます。デフォルトのバケット名の形式は PROJECT_ID.firebasestorage.app です。

公開アクセスを設定する

Cloud Storage for Firebase には宣言型のルール言語が用意されているため、データの構造化、インデックスの作成方法、データの書き込みと読み取りのタイミングを定義できます。認証ユーザーのみがデータの読み取りと書き込みができるように、Cloud Storage への読み取りと書き込みのアクセスはデフォルトでは制限されています。Firebase Authentication を設定せずに開始するには、公開アクセスルールを構成します。

この場合、アプリを使用しない人を含むあらゆる人々に Cloud Storage が公開されるため、認証を設定するときに必ず Cloud Storage へのアクセス制限を再設定してください。

アプリに Cloud Storage SDK を追加する

  1. Flutter プロジェクトのルートから、次のコマンドを実行してプラグインをインストールします。

    flutter pub add firebase_storage
    
  2. 完了したら、Flutter アプリケーションを再ビルドします。

    flutter run
    
  3. プラグインを Dart コードにインポートします。

    import 'package:firebase_storage/firebase_storage.dart';
    

Cloud Storage を設定する

  1. Flutter プロジェクト ディレクトリから flutterfire configure を実行します。これにより、アプリのコードベースにある Firebase 構成ファイル(firebase_options.dart)が更新され、デフォルトの Cloud Storage バケットの名前が付けられます。

  2. FirebaseStorage のインスタンスを作成して、Cloud Storage バケットにアクセスします。

    final storage = FirebaseStorage.instance;
    
    // Alternatively, explicitly specify the bucket name URL.
    // final storage = FirebaseStorage.instanceFor(bucket: "gs://<var>BUCKET_NAME</var>");
    

これで Cloud Storage が使えるようになりました。

次のステップでは、Cloud Storage 参照を作成する方法を学びます。

高度な設定

次のようないくつかの使用例では、追加の設定が必要です。

最初の使用例は、ユーザーが世界中に存在し、それぞれのユーザーの近くにデータを保存したい場合に最適です。たとえば、レイテンシを短縮するため、米国、ヨーロッパ、アジアの各リージョンでバケットを作成して、各リージョンのユーザーのデータをそこに保存するといったことができます。

2 番目の使用例は、アクセス パターンの異なるデータがある場合に役立ちます。たとえば、写真などの頻繁にアクセスされるコンテンツを格納するためにはマルチリージョンまたはリージョン バケットを、またユーザー バックアップなどのアクセス頻度の低いコンテンツを格納するためには Nearline または Coldline バケットをそれぞれ設定できます。

上述のどちらの場合も、複数の Cloud Storage バケットを使用します。

3 番目の使用例は、Google ドライブのような、ユーザーが複数のログイン アカウント(個人用アカウントや仕事用アカウントなど)を持つことができるアプリを作成する場合に役立ちます。カスタムの Firebase アプリ インスタンスを使用して、追加の各アカウントを認証できます。

複数の Cloud Storage バケットを使用する

上述のデフォルト以外の Cloud Storage バケットを使用する場合、または単一のアプリで複数の Cloud Storage バケットを使用する場合は、カスタム バケットを参照する FirebaseStorage のインスタンスを作成できます。

// Get a non-default Storage bucket
final storage = FirebaseStorage.instanceFor(bucket: "gs://my-custom-bucket");

インポートされたバケットの操作

既存の Cloud Storage バケットを Firebase にインポートする場合は、Google Cloud SDK に含まれている gsutil ツールを使用して、Firebase からファイルにアクセスできるようにする必要があります。

gsutil -m acl ch -r -u service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com gs://YOUR-CLOUD-STORAGE-BUCKET

プロジェクト番号を確認する方法については、Firebase プロジェクトの概要をご覧ください。

これは、新しく作成されるバケットには影響しません。新しく作成されるバケットには、Firebase を許可するデフォルトのアクセス制御が設定されます。これは暫定的な措置であり、将来は自動的に行われるようになります。

カスタムの Firebase アプリを使用する

カスタム FirebaseApp を使用してより複雑なアプリを作成するには、このアプリで初期化される FirebaseStorage のインスタンスを作成します。

// Use a non-default App
final storage = FirebaseStorage.instanceFor(app: customApp);

次のステップ