firebase functionsがdeployできない
2021年4月28日にはデプロイできていたfirebase functionsが、5月5日にはデプロイできなくなった。functionsの内容は変更しているが、4/28時点の内容に戻しても、変わらずエラーが発生した。
4月28日に各npm packageとfirebase-toolsのアップデートは行っているので、現時点での最新版を利用している。
firebase-admin 9.7.0
firebase-functions 3.13.2
firebase-tools 9.10.0
エラー内容
Functions deploy had errors with the following functions:
{functionName1}(asia-northeast1)
{functionName2}(asia-northeast1)
To try redeploying those functions, run:
firebase deploy --only "functions:{functionName1},functions:{functionName2}"
To continue deploying other features (such as database), run:
firebase deploy --except functions
Error: Functions did not deploy properly.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! {projectName}@0.1.0 deploy:stg:f: `npm run use:stg && firebase deploy --only functions`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the {projectName}@0.1.0 deploy:stg:f script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
firebase functionsの管理画面
- エラーログは出ているが、特に有用なログは出ていない
- エラーログの中に、GCPコンソールのこのログを見ろというリンクが含まれているので、それを見る
GCPコンソールのログ
Already have image (with digest): {path}
0mfailed to initialize cache: failed to create image cache: accessing cache image "{path}": failed to get OS from config file for image '{path}'
というエラーが出て失敗しているようだ。
GCPのアクティビティページ
ここにもエラー内容が出ている。
google.devtools.cloudbuild.v1.CloudBuild.CreateBuild を実行できませんでした
前提条件で失敗しました(HTTP 400)
と出ている。
GCPのcloudbuildのログ
GCPコンソールからcloudbuildの管理画面を開き、自分の使っているリージョンを開くと、そこからもエラーログを見ることができる。しかし、先ほど見たログを同じ内容だった。
確認した内容
functionsで障害が発生していないか
特に発生していなかった。
firebase cliからログアウト、ログインをする
特に変わらず。
billingの設定
きちんと5月にもクレジットカードからの引き落としがあり、問題ない。
前提条件で失敗しました(HTTP 400)
というエラーは、billingがきちんと設定していない時に発生することもあるらしい。
※前提知識としては、firebase functionsは有料プランにしていないと使えない。
前提条件で失敗しましたの英語は「FAILED_PRECONDITION」
原因
リクエストの前提条件が満たされていなかったことを示します。エラー レスポンスのメッセージ フィールドで、失敗した前提条件に関する情報が提供されます。考えられる原因の 1 つとして、クエリが未定義のインデックスを必要としていることが挙げられます。
対処
問題を解決してから再試行します。
課金以外の原因も考えられるっぽい。
nodeのバージョン指定
ローカル環境では、nodeの14系を使用している。
今までは、functions deployでは、nodeの10系を指定していたが、ローカルとデプロイ先のfunctionsのnodeバージョンが異なっていても問題なかった。
念のため、デプロイ先のfunctionsのnodeのバージョンを12や14に変更してみたが、状況は変わらずエラーが発生した。
nodeのバージョン指定方法
参考
hostingでもdeployエラーが発生しているらしいので、同じワークアラウンド策を試してみた
- .firebaseディレクトリを消去
- デプロイファイルを少し変更する
特に状況変わらず。
--forceオプションを追加してみる
firebase deploy --only functions --force
というオプションがあるらしいので、試してみたが、エラー文言が少し変わるだけで、エラーは発生した。
firebase toolsのアップデート
5/6にfirebase toolsの9.10.1がリリースされたので、アップデートしてみたが変わらず。
参考情報
つい最近の投稿で同じような目に合っている人
deploy時のContainer Registryの問題?
この辺りは、直接GCPを触っているわけではなく、firebaseが面倒を見ているので対応しにくい。
firebase toolsでデプロイ関連のissue
関係なさそう
これも関係なさそう
関係なさそう
tweetから
多分関係ないけど、メモ
今後の対応
- firebase側の問題の可能性もあるので、しばらく様子を見る
- ローカルで使用するnodeバージョンを変えてみる
私も同じ状況だったんですが、こちらを試してみるとデプロイできました。おそらくダウンタイムもなかったように思いますが、ご自身でも検証いただけると幸いです!
こちらでgcf(Google Cloud Function)のimageを全部消して再デプロイをすると大丈夫でした。(絶対にダウンタイムがないとは言い切れないのでご利用される場合は自己責任でお願いします🙏
#!/bin/sh
PROJECT="your project id"
CONTAINER_REGISTRY="asia.gcr.io/$PROJECT/gcf/asia-northeast1"
IMAGE_LIST=`gcloud container images list --repository=$CONTAINER_REGISTRY | awk 'NR!=1'`
for line in $IMAGE_LIST; do
gcloud container images --project $PROJECT delete "$line/worker" --quiet & gcloud container images --project $PROJECT delete "$line/cache" --quiet &
done
wait
mogaさんからの情報提供により、解決することができました。
ありがとうございます!
scrap化しておいて良かった。
mogaさんからのURLの内容で解決できると思いますが、一応、もう少し詳しい情報を載せておきます。
解決方法
Container Registryにアクセスする
asia.gcr.io/{project-name}/gcf/asia-northeast1/{hash}/worker
asia.gcr.io/{project-name}/gcf/asia-northeast1/{hash}/cache
の中にdocker imageがあるので、それを削除する。workerとcacheの両方を削除する必要がある。docker imageのworkerとcacheの両方を削除すると、{hash}のフォルダ自体も消えた。フォルダごと削除はできない。
リージョンのフォルダ以下に、フォルダ2つが存在し、3/5と4/28に作成されたdocker imageが存在した。3/5の方の削除だけではダメで、4/28の方の削除も必要だった。
つまり、リージョンフォルダ以下を空にする必要があった。
docker imageを削除しても、正常にデプロイ済みのfunctionsを呼び出すことができた。トリガーファンクションが実行されることで、それを確認した。
その後、functionsをデプロイすると、正常にデプロイできた。
次に内容を変更してfunctionsをデプロイした場合も、正常にデプロイできた。
問題解決!
コメントを書いている間にmogaさんのコメントが変更されていました。
僕は、GCPコンソールから、ぽちぽち手動でdocker imageを削除しました。
ダウンタイムに関しては、僕の方でもなさそうなことは確認していますが、確かに絶対ないとは言い切れないですね。これを参考にする方も、自己責任にて作業していただければ幸いです。
Firebase toolsのリリースの中に「Delete Container Registry images left after Functions deployment」との記載が。
これでfunctionsのデプロイに失敗する問題が解消するかも。次回のfunctionsデプロイ時に試す。