GitHub ActionからFirebase Functionsに デプロイできない問題
Firebase FunctionsのデプロイはGitHub Actionsで自動化している。
いつものように、デプロイ用のアクションをトリガーしたところ、⚠ functions: failed to update function xxx
と表示されてしまい、他の関数のデプロイまでもが止まってしまう現象が起きた。
念の為、失敗した対象の関数を一度削除した。
そして、もう一度トリガーしてみることに。
今度は⚠ functions: failed to create function xxx
と表示された。
ちなみにこの関数はPub/Subに関連しているである。
調べていたら、以下のコメントを見つけた。
試しにCloud Scheduler APIを無効にしてみる。
再度、有効にしてみる。
試しにPub/Sub APIも無効にしてみる。
しかし、怖い注意画面がでたので余計なことはしないでおく。
ダミーのcronジョブを作成してみる。
作成方法はこちらを参照。
トピックは適当に「dummy-topic」という名前をつけて作成した。
もう一度トリガーしてみた。
結果はまた失敗。。。
もう一回Firebase Functionsのログを見に行った。 そしたらなんか出てた。
Invalid function service account requested: default. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.
よくみるとオーナー権限でCI用のトークンが発行されていたぽい。 なので、サービスアカウントをCI用に準備してそのアカウントを使用してトークンを発行する。
ログに表示されていたトラブルシューティングのページにそれっぽい内容を発見した。
まず、サービスアカウントを用意して、必要な権限を与える。
必要な権限
- roles/iam.serviceAccountUser
- サービス アカウント ユーザー
- roles/cloudfunctions.admin
- Cloud Functions 管理者
- cloudscheduler.jobs.update
- Cloud Scheduler 管理者
IAMのページにアクセスして、付与したいサービスアカウントの一番右にある鉛筆マークをクリックする。
表示されたメニューからロールを追加を選択する。別のロールを追加をクリックして、サービス アカウント ユーザー権限を付与して保存する。
次に、鍵を発行する。
サービスアカウントのページで、対象のサービスアカウントのメールアドレスをクリックする。
キーをクリックする。
鍵を追加をクリックして、新しい鍵を作成をクリックする。 鍵はJSONで発行する。
ダウンロードしたJSONファイルをBase64でエンコードする。
cat service-account.json | base64
出力された文字列をGitHub Actionsのsecretsに保存する。
続いて、設定したsecretをワークフローファイル内で使用できるようにする。
--project
を使ってプロジェクト名を付与するのを忘れずに行う。
// .github/workflows/deploy_functions.yml ... - name: シークレットの内容をデコードする run: echo ${{ secrets.FIREBASE_SERVICE_ACCOUNT }} | base64 --decode > ./service-account.json working-directory: ./packages/functions - name: functionsをデプロイする run: | firebase deploy --only functions --project ${{ secrets.FIREBASE_PROJECT_ID }} env: GOOGLE_APPLICATION_CREDENTIALS: "./service-account.json" working-directory: ./packages/functions
そしてトリガーを実行するも、また失敗。。。。
もうこなったらと思い、ローカルからデプロイしてみた。
firebase deploy --only functions --project project-name
結果はあっさり成功した。
今度はサービスアカウントを指定してローカルで実行してみる。
firebase logout export GOOGLE_APPLICATION_CREDENTIALS=./service-account.json firebase deploy --only functions --project project-name
これも成功した。
なぜかGitHub Actionsからはデプロイできない・・・
そんな中、こんなIssueが最近立っていた。
firebase-tools
のバージョンが11.2.0
で同様の問題が起きているらしい。
そこで、firebase-tools
をインストールする際に@11.1.0
にダウングレードしてインストールすると解決することが提起されている。
実際にワークフローの設定を修正して反映し、動かしてみた。
... - name: Install Firebase Emulator Suite run: yarn global add firebase-tools@11.1.0 working-directory: ./packages/functions ...
すると、求めていたDeploy complete!
が表示された。
やはり、@11.2.0
系でなにやら問題があるようだ。
もしCI/CDでデプロイする場合はバージョンを@11.1.0
にダウングレードしてfirebase-tools
をインストールしてみるとうまくいくかもしれない。