CloudFunctionsのデプロイエラー3つの対処方法/nodeとArtifact Registryとconfigの問題について

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[@mogmet](https://twitter.com/mogmet)です。

今回はcloud functionsのデプロイにまつわるトラブルシュートな内容を共有します。

## node versionの問題の解決法

下記のようなエラーが出たときの問題の対処法です。

> Build failed: Build error details not available.Please check the logs at https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/xxx-xxxx-xxx-xxx?project=xxx. Please visit https://cloud.google.com/functions/docs/troubleshooting#build for in-depth troubleshooting documentation for build related errors.

以前こんな記事を書きましたが、実は根本的な解決にはなってませんでした。

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

どうやらデプロイするnodeのバージョンがあってないために起こっていたエラーだったようなのでcloud functionsのengineのnodeのバージョンをあげることで解決しました。
ということで早速engineのバージョンを16にあげます。

```package.json
{
...
  "engines": {
    "node": "16"
  },
}
```

次にfirebase-toolsも新しくしましょう。

```sh
$ npm install -g firebase-tools
```

firebase-toolsのバージョンを上げておかないとデプロイ時に下記のようなエラーが出ます。

> ⚠  functions: package.json indicates an outdated version of firebase-functions.
Please upgrade using npm install --save firebase-functions@latest in your functions directory.


## Artifact Registryの問題の解決法

node16の世界へようこそ！
しかし、次にデプロイに待ち受けるエラーとして下記のようなエラーが出ることがあります。

> Cloud Functions uses Artifact Registry to store function docker images. Artifact Registry API is not enabled in your project. To enable the API, visit https://console.developers.google.com/apis/api/artifactregistry.googleapis.com/overview?project=xxx or use the gcloud command 'gcloud services enable artifactregistry.googleapis.com' then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

どうやら**Artifact Registry API**を有効化しろとのこと。
エラーログにはurlがのってますが、そこからやっても有効化はできませんでした。
そのためログで言われてる通り下記のコマンドを実行してあげましょう。

```sh
$ gcloud services enable artifactregistry.googleapis.com
```

もしupdateしてねと言われたら`gcloud components update`を実行した上でもう一度やってみましょう。

```shell
Updates are available for some Google Cloud CLI components.  To install them,
please run:
  $ gcloud components update
```


## configのエラーの問題の対処法

次にこんなエラーが言われた場合の対処方法です。

> ✔  functions: required API cloudbuild.googleapis.com is enabled
> 
> Error: Cloud Runtime Config is currently experiencing issues, which is preventing your functions from being deployed. Please wait a few minutes and then try to deploy your functions again.
Run `firebase deploy --except functions` if you want to continue deploying the rest of your project.

こちらにも書いてありますが、firebase functions:configの影響でこけます。

https://zenn.dev/canoypa/scraps/63184fafb95537

secret managerに移行するでもいいのですが、.runtimeconfig.jsonから自分は同期をとるようにしたかったため、頑張って解決しました。
原因は新しいバージョンから**変数名にキャメルケースを使うと落ちる**みたいです。（新しいバージョンではスネークケースを使ってほしいみたい）
しかしソースの修正が面倒だったので無理くり実装しました。
それが下記コマンドになります。

```sh
$ cat .runtimeconfig.json | jq -r \"to_entries[]| [.key, (.value | tojson)] | join(\\\"='\\\")\" | sed -e \"s/}$/}'/\" | xargs firebase  -P dev functions:config:set
```

このコマンドを使うとよしなにキャメルケースで環境変数をセットしてくれます。

これで無事にデプロイもすることができました。


## まとめ

新しいバージョンは割と罠も多いので古いプロジェクトをupdateするときは気をつけましょう。

最後に、[ワンナイト人狼オンライン](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)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

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

https://virapture.com/

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

https://ragna-rock.com