Google I/O 2023で発表されたFirebaseの新機能まとめ

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[@mogmet](https://twitter.com/mogmet)です。
![mogmet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/92f25cca-666e-50db-2739-bf9c445d2d2a.jpeg)
最近Subwayのフォトコンテストに参加するためにたくさんSubway食ってます。痩せそうです。

本日はGoogle I/O 2023で発表されたFirebaseの新機能について紹介致します！

https://www.youtube.com/watch?v=emIxn-f9bK0

https://firebase.blog/posts/2023/05/whats-new-at-google-io


## Cloud Functions for Firebase

第２世代のCloud Functions for Firebaseを昨年リリースしました。
第２世代を使うと、単一のインスタンスが最大1000のリクエストを処理できるようになったことで、コールドスタートが減ってレスポンスを早くすることができます。

先月、第２世代のCloud FunctionsでFirestoreトリガーのプレビュー版が導入されました。

![CleanShot 2023-05-11 at 06.55.24@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/8b04e622-100c-f869-7088-43c880a2fa5c.png)

また、本日より第２世代Cloud FunctionsがGAになりました。
![CleanShot 2023-05-11 at 06.56.50@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/4dc063ef-e9ec-4666-15a3-7026e43545a1.png)

Cloud FunctionsでPython（public preview）をサポートするようになりました。
![CleanShot 2023-05-11 at 06.57.21@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/23abccd8-a21b-9740-8922-981ab761281b.png)

コード例

```py
from firebase_functions import firestore_fn
@firestore_fn.on_document_created(document="announcements/{id}")
def notifyusers(event):
  announcement = event.data
  firebase_admin.initialize_app()
  message = messaging.Message(
    notification=messaging.Notification(
      title='New announcement!',
      body=announcement,
    ),
    topic='announce-opt-in'
  )
  fcm_response = messsaging.send(message)
...
    
```

Firestoreでも全てのイベントでCloud functions対応しています。

![CleanShot 2023-05-11 at 07.01.41@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/fdbfccaa-0a24-80dd-98f0-e8c9f2c0abea.png)

## Firebase Extensions
### PaLM API Extensions
継続的な対話のためのチャットインターフェース、要約テキスト機能などの生成AI機能を提供できるPaLM APIを使用したチャットボットを提供できるようになりました。

![CleanShot 2023-05-11 at 07.03.24@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/e9a57461-3589-0148-f3c0-ca5ce47becc5.png)

デモでは、promptをいれると生成が始まり、
![CleanShot 2023-05-11 at 07.07.05@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/ccb3f2f7-6ab2-4050-ffae-11762acdb4bd.png)

しばらくすると応答が帰ってきました
![CleanShot 2023-05-11 at 07.07.56@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/94af9e2f-03ed-00db-ff34-583899303276.png)

### Build & Publish

誰でも独自の拡張機能を構築して公開できるようになりました。

![CleanShot 2023-05-11 at 07.08.33@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/f8a33222-cce0-ffb3-38e2-7b4ed2c597ff.png)

## CLoud Firestore

Cloud Firestore は、サーバーに触れることなく、モバイルアプリやウェブアプリのデータを大規模に保存、同期、クエリできるようにするNoSQLドキュメントデータベースです。

### CountクエリのGA
昨年Countクエリを発表しましたが、これがGAになりました

![CleanShot 2023-05-11 at 07.10.29@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/f42d6438-0483-5e0e-6471-6ad962dcae36.png)

### OR Queriesの導入

今まではIn句やArray-Contains-Any句を使って複雑なロジックの検索を実装していました。

![CleanShot 2023-05-11 at 07.11.06@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/1f6dda58-0595-c3de-e1a3-1faf47925b50.png)

![CleanShot 2023-05-11 at 07.11.25@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/5c8049f3-26be-c0f7-c84e-ce54fe3a9424.png)

新しくORクエリーが実装されたことにより、複数のフィールドで複数の条件を組み合わせることができるようになりました。
例えば4つ星も含まれるホテルを検索する実装としては下記のようになります。

<img width="1781" alt="CleanShot 2023-05-11 at 07 20 36@2x" src="https://user-images.githubusercontent.com/1166342/237527590-767998b8-43bd-4113-a82d-4b8a115c999f.png">

Order Byも組み合わせて使うことができます。

また、IN演算子も拡張して、最大30個の一致する値を検索できるようになりました。（以前は10個）

https://qiita.com/mogmet/items/fe0047ddb81d2ff4e794



## App Check

Identify Platformを使用したFirebase AuthenticationでもApp Checkが可能になりました。

![CleanShot 2023-05-11 at 09.13.46@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/52d7400d-a016-8861-1719-ae09b1c0c4c7.png)

UnityとC++でもAppCheckが対応しました。これによりチート対策もすることができます。

![CleanShot 2023-05-11 at 09.15.00@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/72e18e63-635e-cb9a-d307-51c2348cbba6.png)

### Replay Protection

Cloud Functionsのエンドポイントに対してリプレイ攻撃から守る機能を追加しました

![CleanShot 2023-05-11 at 09.15.32@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/de00c32b-2d1a-cdae-8ce7-f0b11a19b164.png)


## Terraform

Firebaseの構築にTerraformを使って自動構築することができるようになりました。

![CleanShot 2023-05-11 at 09.17.01@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/022c3f4e-488d-af7e-673b-10ba4fc0eed7.png)

すべての環境で統一したインフラ環境を提供することができます。

![CleanShot 2023-05-11 at 09.17.27@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/31fd4de4-70fe-2a97-d89c-0a4fea84afa4.png)

対応してるサービス一覧です。

![CleanShot 2023-05-11 at 09.18.14@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/8a309df5-a3d5-b43c-5314-49216c1e5082.png)

例えばこのようなTerraformを書くことで...

```tf
resource "google_firestore_database" "prod" {
  provider         = google-beta
  project          = google_firebase_project.prod.project
  name             = " (default)"
  location_id      = "name-of-region"
  type             = "FIRESTORE NATIVE"
  concurrency_mode = "OPTIMISTIC"
  depends_on       = [
    google_project_service.prod,
  ]
}
resource "google_firebaserules_ruleset" "prod" {
  provider = google-beta
  project  = google_firebase_project.prod.project
  source {
    files {
      name    = "firestore.rules"
      content = file("firestore rules")
    }
  }
  depends_on = [
    google_firestore_database.prod,
  ]
}
resource "google _firebaserules_release" "prod" {
  provider     = google-beta
  name         = "cloud. firestore"
  ruleset_name = google_firebaserules_ruleset.prod.name
  project      = google_firebase_project.prod.project
}
```

terafformを実行することができます。

<img width="1878" alt="CleanShot 2023-05-11 at 09 32 55@2x" src="https://user-images.githubusercontent.com/1166342/237542328-f9e73bda-7b4d-4b39-8ef5-8bb7fdbc5d19.png">

詳細はこちらを参照ください。

https://firebase.google.com/docs/projects/terraform/get-started?hl=ja

## Firebase Hosting

### サポートする動的フレームワークの追加

昨年Next.jsやAngular Universalなどの動的ウェブフレームワークをFirebase Hostingに簡単にデプロイできるようにしました。　
今年は、さらにAstro, SvelteKit, Nuxtのサポートを追加しました。

![CleanShot 2023-05-11 at 09.40.19@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/e30f4bcc-72c7-a043-152d-60718fb88a9d.png)

更に、Pythonが使えることになったことにより、Flask, Djangoのサポートも追加しました。

![CleanShot 2023-05-11 at 09.41.16@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/18d34dbf-1d5d-5dd2-11e8-33594df65ddb.png)

### Dynamic Preview Channels

Firebase Hostingでは静的なhostingに対してのプレビュー機能が使えていましたが、動的フレームワークに関してもプレビュー機能が実装されました。

![CleanShot 2023-05-11 at 09.41.16@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/7c648e10-8dab-e84a-534e-f4042243361a.png)

以前は最後にデプロイされたバージョンを指していましたが...

![CleanShot 2023-05-11 at 09.44.20@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/329e1b33-9a93-d90c-a515-2e141122b317.png)
　
Cloud Functionsでhostingをデプロイするとリビジョンを相互にリンクすることができるようになりました。
![CleanShot 2023-05-11 at 09.44.45@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/408db915-1331-0cf8-178c-0f7db02746cd.png)

Github Actionsでも作動してPRにコメントしてくれます。

![CleanShot 2023-05-11 at 09.45.56@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/4a8713ac-a940-7ed7-3caf-c565116ce66b.png)


下記はFlaskをデプロイするデモになります。

deployコマンドを実行するとFlaskアプリであることを検出して自動的にCloudFunctionを構築します。
<img width="1531" alt="CleanShot 2023-05-11 at 09 48 27@2x" src="https://user-images.githubusercontent.com/1166342/237544410-dd2132cb-01c5-4bfb-8169-ad3754cd8230.png">
![CleanShot 2023-05-11 at 09.49.31@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/43a43cd1-dcbf-a71f-45c3-4d09897f16e8.png)

静的コンテンツも自動的にCDNにアップロードされます。
<img width="1524" alt="CleanShot 2023-05-11 at 09 49 53@2x" src="https://user-images.githubusercontent.com/1166342/237544547-8eac0a00-dc60-4388-82e2-560cdfae49ca.png">


詳細は下記を御覧ください。

https://firebase.google.com/docs/hosting/functions

https://firebase.google.com/docs/hosting/frameworks/frameworks-overview?hl=ja


## Flutter

### Flutter webのFirebase Hosting

Flutter Web に対する Firebase Hostingの公式サポートされるようになりました。

https://firebase.google.com/docs/flutter/setup?hl=ja&platform=web

### Android SDKの改善

Flutterで、Android SDKと同等の機能が使えるようになりました。
例えば、下記のような機能が使えます。
- Cloud MessagingからBigQueryに配信指標をエクスポートしてキャンペーンを追跡する
- Apple, Google, Githubサインインの使用
- ServerTimestampBehaviorプロパティの使用


更に、バックグラウンドプロセスの活用や、初期化遅延を入れることでAndroidの起動が早くなりました。

![CleanShot 2023-05-11 at 10.00.40@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/6e070e4f-634d-b39f-c566-2c260973db2a.png)


### App Quality Insights in Android Studio

App Quality Insights（以下AQI）はAndroid Studio Flamingoで安定版になりました。

![CleanShot 2023-05-11 at 10.02.09@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/b9fcf5b9-d355-6b73-8bc0-cce70b4cdbbc.png)


更に、AQIからCloseする機能を追加しました。

![CleanShot 2023-05-11 at 10.02.43@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/ed0396f9-dc21-3866-694b-026950bc57ee.png)

他にも下記の機能を追加しております。

- クラッシュに最適な対処方法を話し合ったりできるようにメモ機能
- Crashlyticsシグナルによって問題をフィルターできるようになることで、何をいつ修正するかをより適切に優先順位付けが可能

![CleanShot 2023-05-11 at 10.03.19@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/bea1f6b5-6fa2-0764-7b65-51cf060c45fa.png)


## Firebase App Distribution

### アプリ内フィードバック

アプリ内フィードバックが追加されました。

![CleanShot 2023-05-11 at 10.07.19@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/e8739a6e-7308-c2f0-77c0-1539e3fea832.png)

アプリを振るだけでスクリーンショットを含むフィードバックを送信できます。

![CleanShot 2023-05-11 at 10.08.04@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/ef731133-f464-7f55-ca51-4f30db8204f6.png)

また、App Distributionフィードバック用にEventrcサポートを追加しました。
これを使えばSlackやJIRAなど、別のツールへ連携することができます。

## Remote Config

### Real-time Remote Config

新機能や修正などのアプリの変更を迅速に展開できるReal-time Remote Configを追加しました。

![CleanShot 2023-05-11 at 10.10.45@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/0c103f49-ff13-bb41-db98-1a1bfab0184a.png)


デモではSwiftUIを使って、色がすぐに変わるデモを実施しました。
下記のように、RemoteConfigの値を読み取ってボタンの色を変えるソースになっています。
![CleanShot 2023-05-11 at 10.12.02@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/28b977be-fb41-005e-1ddc-f8537f5b72b2.png)

Real-time Remote Configを使う場合はリスナーを登録します。
![CleanShot 2023-05-11 at 10.13.00@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/a84f635a-4868-d812-d950-ba7ecb005847.png)
　
実際にコンソールで変更するとすぐに変更されることが確認できます。
![CleanShot 2023-05-11 at 10.14.31.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/0b2b2bac-67dc-ccc9-665d-0a1d2c2993a2.gif)

Real-time Remote ConfigはAndroid, iOS、Unity2で利用できます。


## まとめ

発表された内容のまとめです。

- Cloud Funtionsがpythonをサポート
- 独自のFirebase Extensionsが誰でも公開可能に
- FirestoreでORクエリーの導入
- App Checkの強化
- Terraform対応
- Firebase Hostingでの動的フレームワークの追加
- FlutterでのSDK強化
- App Quality Insightsの機能追加
- App Distributionでアプリ内フィードバックを追加
- Real-time Remote Configの追加

もぐめっと的にはようやくFirebase Extensionsが誰でも公開可能になったので、車輪の再発明がより一層減らすことができそうと感じております！

最後に、スノボの楽しく滑るコツを掴める [cotsume](https://cotsume.page.link/blog) というアプリを作ってます！よかったらDLしてみてね！

https://cotsume.page.link/blog

また、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)、フリーランスのコミュニティの[NextFreelance](https://next-freelance.net/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

https://next-freelance.net/

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com