概要
- 最近Cloud FunctionsがCloud Run Functionsにアップグレードされた
- Nuxt3をFirebaseへデプロイすると、Firebase HostingとSSR等のためにCloud Functionsへデプロイされる
- 手順
- Nitroがやってくれている
- アップグレードされたCloud Functionsへマイグレーションしたいなと思い試したところハマったのでメモする
前提
- Nuxt3とFirebaseを利用している
- Cloud Functionsは1 Genを利用している
マイグレーション手順
まず注意する点があります。Cloud Functions 1 Genをすでに利用している場合は、設定を変更しても2 Genとしてデプロイすることができません。
同じ名前の関数がある場合は、一度削除する必要があります。ただ、削除後デプロイという手順を踏むとサービスに影響を与えてしまうので(そのタイミングでフロントロードしようとするとエラーになる)、影響ないようにしたいです。
今回の手順は影響がないようにマイグレーションします。
nuxt.config.tsを変更する
おそらくですが、Nuxtの手順通りで1 Genを利用している場合、Cloud Functions上での関数名は server
になっていると思います。先ほどあげたハマりポイントとして、この名前を変更してデプロイしないと、デプロイ途中で失敗してしまうので、これを変更します。
Nuxt3は内部でNitroを利用しているので、2 Genを利用するように修正します。
// ...
nitro: {
preset: 'firebase',
firebase: {
+ serverFunctionName: 'nuxtServer', // こいつを足す
nodeVersion: '20',
gen: 2, // 2 genを利用するようにする
region: 'us-central1'
}
},
// ...
このとき、serverFunctionName
を指定することで、先ほど問題になるぞと書いたCloud Functionsの名前 server
問題を修正することができます。これでデプロイすると、nuxtServer
という名前の関数が作成されるようになります。
firebase.jsonを変更する
次に、firebase.jsonを修正します。これもNuxtの手順通りに行っているのであれば下記のようになっているはずですが、変更します。
// ...
"functions":
[
{
"source": ".output/server",
"codebase": "nuxt-server",
"runtime": "nodejs20"
}
],
"hosting": [
{
"site": "dev-cabin",
"public": ".output/public",
"cleanUrls": true,
"ignore": [
"**/_nuxt/*.map",
"firebase.*json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
- "function": "server"
+ "function": "nuxtServer"
}
]
}
],
// ...
Firebase hosting側のrewrites
-> function
の名前をnuxt.config.ts
のserverFunctionName
で設定した名前に変更します。
デプロイ
デプロイしましょう。
$ NITRO_PRESET=firebase yarn build && \
firebase --project ${PROJECT_ID} \
--config firebase.json deploy \
--only functions:nuxt-server,hosting \
--force
これでデプロイできると思います。デプロイするとnuxtServer
がCloud Run Functionsの画面に表示されていると思います。
1 Gen関数の削除
すべてのアクセスが、2 Genへ流れていることが確認できたら、1 Genを削除しましょう。これで完了ですー!
雑感
Cloud FunctionsからCloud Runベースになったのでまだまだわからないことが多いです