Cloud Functionsでfirestoreからspreadsheetへデータ書き込み定時実行の手順
Cloud Functionsを定時実行し、firestoreからデータを取得 |> spreadsheetへ書き込む方法のメモを自分用に残しておきます。
サービスアカウントとOAuth2つ認証を使う点が少し混乱しました。
サービスアカウント作成
- IAMと管理 > サービスアカウント > サービスアカウントの作成
- 権限(IAMロール)の付与
- IAMと管理 > IAM > アクセス権を付与
- 「新しいプリンシパル」に作成したサービスアカウントアドレスを入力
- 「ロールを割り当てる」に下記のロールを割り当て
- Firebase管理者(firestoreへのアクセス)
- Cloud Datastoreインポート/エクスポート管理者
- IAMと管理 > IAM > アクセス権を付与
Spreadsheetへの書き込み
-
ソースコード記述
- npm install
- Node.jsでSpreadsheetに書き込み
https://qiita.com/Lassieena/items/ba16b220d88bfd596b35 - google-cloud/local-authのSCOPESが書き込み可能になっていることを確認
-
credentials.json(OAuth2.0クライアントID)の発行
- https://developers.google.com/sheets/api/quickstart/nodejs -
Node.js上で実行しブラウザで認証手続きを行ってcredentials.jsonからtoken.jsonを取得
- google apis 権限のあるアカウント?で認証する
- ./functions/token.json へ配置
- これがないとCloud Functions上で認証できずにtime outする
-
APIの有効化
- Google Spreadsheet APIを有効化
firestoreから取得
-
serviceAccountKey.json取得
- IAMと管理 > サービスアカウント > (1.で作成したサービスアカウト) > 鍵を追加
- https://firebase.google.com/docs/firestore/quickstart?hl=ja#:~:text=index.js-,%E7%8B%AC%E8%87%AA%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A7%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B,-%E7%8B%AC%E8%87%AA%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC
-
ソースコード記述
デプロイ
$ firebase deploy --only functions
Cloud Schedulerの作成
- デプロイで勝手に作られる
- https://cloud.google.com/firestore/docs/solutions/schedule-export?hl=ja#test_your_job_and_cloud_function
エラー
GaxiosError: invalid_grant
https://oeconomicus.jp/2021/06/google-api-error/
OAuthの期限切れ(テスト環境では7日で切れる)
再発行する.
token.jsonは消しておくこと.
まとめ
OAuthを使う必要がなければサービスアカウントの認証のみでfirestore、spreadsheetどちらもアクセスできそうだしそれでよさそう。