Firestoreでデータ保持したり読み出したりするSlackAppを作っていて少々込みいったことやChatOps的なことをやりたくなってくると、DBのように保持しておく必要のあるデータを持ちたくなります。Firestoreを使って組みこんでみます。#FirestoreはGoogleの提供するNoSQL系のデータストアです。データのリアルタイム性やクライアントサイドからでも操作可能なところが特徴です。ある程度のアクセスまで無料に使えて導入も比較的簡単なためお手軽NoSQLサーバーとして扱うことができます。#普通につかってもお手軽ですが、前々回にGAEにデプロイしたのでさらに管理は楽です。NoSQLのためスキーマレスでSlackApp程度の規模のものの場合、カッチリとスキーマを設定せずに柔軟に扱うほうが向いているケースも多いでしょう。#まずプロジェクトでFirestoreを有効にする必要があります。FirebaseFirebasehttps://firebase.google.com/そして、プロジェクトにfirebase-adminを追加します。#FirestoreをGCP系以外(ローカル含む)から使う場合には、以前デプロイの時にGAE用のサービスキーを取得したようにFirebase用をキーを取得します。SDKの「操作」から鍵を作成しダウンロードしておきます。今回はそれをserviceAccountKey.jsonという名前でプロジェクトルートに置いておくことにしましょう。#Boltの初期化と同じようにFirestoreの初期化用のファイルを/src/initializers/firestore.tsに作ります。admin.firestore()このシリーズでは本番環境はGAEを使用するので本番と開発環境で初期化方法を分けています。GAEの場合、同じプロジェクトにあるFirebaseには鍵を指定せずに使うことができます。開発環境では先ほどダウンロードしてきた鍵JSONを読み込む必要があります。この鍵ファイルは秘匿情報なので、gitignoreとgcloudignoreに無視対象として追記するを忘れないようにご注意します。#実際にFirestoreに格納する、格納したデータを使う、実装をしてみます。文字列で任意の文字列を記録し、/getで任意の文字列をメッセージとして返すようにしてみます。#では/setというスラッシュコマンドを作ってみます。/src/commands/set.tsに以下のように書きます。})}ここではusersというコレクションの中に、idをSlackのIDにしたドキュメントを作り、messageというプロパティに指定した文字列を格納しています。#setとほぼ同じです。/src/commands/get.tsを作り、以下のように書きます。})}詳しくはfirestoreの使い方になりますが、コレクションのリファレンスの中のSlackIDがidになってるデータをとってきて、メッセージにしています。#上記2つのファイルを作ってもindexに登録しないと使えませんので/src/index.tsを以下のようにします。${server.address().port}`)})()echo()notify()set()get()そしてSlackAppのWebの設定画面からset,getをSlashコマンドとして登録するのも忘れずに。おためしとコマンドを打ってみます。Appからの発言でメッセージを登録しましたと返答がきていて、firestoreのWebコンソールでみてみるとコレクションにusersが追加されていて、その中にドキュメントとして1件登録されていればOKです。/getと打つと登録した文字列が返ってくればOKです。#Firestoreの扱いさえ慣れればやることは簡単です。Firestoreは同期、非同期、クエリ、ドキュメント、リファレンスとの関係性の理解が必要なのでその部分で苦労するかもしれません。いえ、小さく使うなら無料で収まりますし、導入も手軽なので気軽に使えます。GAEにデプロイしているなら1プロジェクト内で簡潔できることや、全てJS(TS)で書きききれるのも見逃がせません。小さいものを作るにはシンプルなほうが楽です。サンプルコードはどれも簡素なものですが、複雑なことをやろうとしてもここからの応用ですでにいろいろなことができるはずです。