FirebaseでCloud Functionsを使うと、サーバー管理なしで柔軟なバックエンド処理を実装できます。
本記事では、Cloud Functionsとは何か?という基本から、デプロイ時に発生しやすい「Could not build the function due to a missing permission」エラーの対処法まで解説しています。
さらに、Blazeプランへの変更手順や、請求先を別アカウントに切り替える方法もあわせて紹介しています。
Cloud Functionsとは何か?
Cloud Functions(クラウド・ファンクションズ)とは、サーバー側のバックエンド処理を行う機能です。
Cloud Functionsにあらかじめ関数を登録しておき、データを渡すと、それを処理した結果を返してくれます。
Cloud Functionsはいつ必要?
例えば、Firebase Hostingでページを公開している場合、HostingにアップしているのはHTMLやCSS、JavaScript、画像といった静的ファイルです。
このため、HostingでAPI連携といったサーバー側のバックエンド処理はできません。
しかし、Hostingで公開している静的なWEBサイトでも、StripeやSquareなどの決済と連携させたり、Firebase Authnticationのデータを同期して削除や編集したい場合があります。
そんなときに使うのがCloud Functionsです。
Cloud Functionsの入り口は2つ
Cloud Functionsは、FirebaseとGoogle Cloudのそれぞれで使うことができます。
Firebaseで使うには無料のSparkから有料のBlazeプランにする必要があります。ただし、Blazeプランにしても無料枠があるので、いきなり課金されることはありません。
なお、FirebaseのBlazeプランのCloud Functionsの無料枠は、Google Cloudの無料枠と同じです。
もし、Firebase Hostingで公開しているなら、FirebaseのCloud Functionsを使った方が開発がスムーズです。
Cloud Functionsの使い方(Firebase)
アップグレード(Blazeプラン)にする
Cloud Functionsを使うにはクレカの登録を行うBlazeプランにアップグレードする必要があります。
Firebaseコンソールに入り、Functionsをクリックします。

「プロジェクトをアップグレード」をクリックします。

必要に応じて「Cloud請求先アカウント」を作成します。

プロジェクト開発で使っているGoogleアカウントとは、異なるGoogleアカウントを請求先として登録することができます。
※割り当てるには、請求先作成/選択画面で、Googleアカウントを切り替え、権限を付与する必要があります。付与する権限は「請求先アカウントユーザー」です。

なお、請求先の名前やデフォルトで付与される「My-First-Porject」といった名前は、請求先となるアカウントのGoogle ClouldコンソールのIAMの設定から変更することができます。
請求先アカウントの紐づけが完了したら、Blazeプランを使用できます。

Firebase CLIのインストール
Firebase CLIをローカルにインストールします。既にインストール済みの場合は、自動でアップデートします。
npm install -g firebase-toolsFirebaseのプロジェクトの初期設定(functionsの初期設定)
プロジェクトの初期設定をします。
firebase init既にfirebase initを実行済みで「firebase.json」がある場合は、functionsだけ初期設定を行います。
firebase init functions※既にfirebase.jsonがある状態でfirebase initをしても、元の設定が消えるわけではありません。選択肢に応じて再度設定を上書きしなおす処理となります。
選択肢は以下のように進めていきます。
Are you ready to proceed? Y
? What language would you like to use to write Cloud Functions? ※自分のプロジェクトに合った言語を選択
JavaScript
❯ TypeScript
Python
Dart
? Do you want to use ESLint to catch probable bugs and enforce style? N※既存のES Lintがある場合
? Do you want to install dependencies with npm now? Y
? Would you like to install agent skills for Firebase? Y/n ※どちらでもいい既にES Lintがインストールされている場合は、ここでfunctions用のES LintをインストールするとES Lintのバージョンの不整合が発生し、deploy時にエラーが発生することがあります。
このため、Nにしておく方が安全です。
「Agent Skills」は基本的にYで問題ありません。有効にすると、以下のようなメリットがあります。
CursorやGitHub Copilot、またはGoogleが提供するIDXなどのAIエージェントが、プロジェクト内のFirebase設定を正確に理解できるようになります。
ドキュメントの自動参照によりFirebaseの最新の仕様やベストプラクティスに基づいたコード生成が、より正確になります。
Functionsのエラーなどが発生した際、AIが設定ファイル(firebase.json や firebaserc)を読み取って、デバッグの効率化がしやすくなります。
AIを一切使わず、全て手動でやりたい場合や、とりあえずNにしておいて、後から設定で変更する場合はNでも問題ありません。
設定が完了すると、firebase.jsonにfunctionsが追加されます。これによりfirebase deployを実行したときに、functionsもデプロイされます。
{
"firestore": {
"database": "(default)",
"location": "asia-northeast1",
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
},
"hosting": {
"public": "out",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
]
},
"functions": [
{
"source": "functions",
"codebase": "default",
"disallowLegacyRuntimeConfig": true,
"ignore": [
"node_modules",
".git",
"firebase-debug.log",
"firebase-debug.*.log",
"*.local"
],
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint",
"npm --prefix \"$RESOURCE_DIR\" run build"
]
}
]
}
上記は、firestore, hosting, functionsを使ったプロジェクトの例です。
functionsの関数ファイルを作成
functionsをデプロイする前に、cloud functionsに登録する関数を「functions/src/index.ts」に記述します。
import { onRequest } from "firebase-functions/v2/https";
import * as logger from "firebase-functions/logger";
// 最もシンプルなHello World関数
export const helloWorld = onRequest((request, response) => {
logger.info("Hello logs!", {structuredData: true});
response.send("Firebase Functions へのデプロイに成功しました!");
});デプロイ完了時にFunctions URLという、デプロイした関数を実行するためのURLが表示されます。
ただし、今回でデプロイしたコードは認証されたユーザーしか実行できません。もし、実際に試したい場合は、functions/src/index.tsのコードを以下に書き換えて、再度デプロイしてください。
import { onRequest } from "firebase-functions/v2/https";
// { invoker: "public" } を追加することで、認証なしでのアクセスを許可します
export const helloWorld = onRequest({ invoker: "public", cors: true }, (request, response) => {
response.send("Firebase Functions へのアクセスに成功しました!");
});invoker: "public" を設定すると、Google Cloud 側で「未認証の呼び出しを許可」する設定が自動的に適用され、ブラウザからURLを叩くだけでレスポンスが返ってくるようになります。※実行数は無料枠の消費や課金対象となるため注意して実行してください。
デプロイする
作成したfunctionsのファイルをcloud上にデプロイします。
cloud functionsのみをデプロイしたい場合は「–only functions」オプションをつけます。
firebase deploy --only functions
実行結果の最後「古いビルドデータを何日分残すか」と聞かれます。
? How many days do you want to keep container images before they're deleted? (1)デフォルトのまま「1」(またはそのままEnter)でOKです。
これは、古いデータが溜まって課金が発生するのを防ぐための親切な機能です。1日に設定しておけば、常に最新に近いものだけが残り、コストを抑えられます。
デプロイが完了すると、Firebaseコンソールのfunctionsにデプロイした関数が表示されます。

エラー対処法
権限不足によるビルドの失敗
今回ビルドを実行した際に以下のエラーが表示されました。
Build failed with status: FAILURE. Could not build the function due to a missing permission on the build service account. If you didn’t revoke that permission explicitly, this could be caused by a change in the organization policies. Please refer to the following documentation for more details and resolution: https://cloud.google.com/functions/docs/troubleshooting#build-service-account
You can also view the logs at https://console.cloud.google.com/cloud-build/builds;region=us-central1/90C356307-61ec-4b1b-9af7-9ebd8bf2c1e4?project=1111111111
これは、Google Cloud 側でビルドを行うための権限がないために発生したエラーです。
権限の付与
Google Consoleコンソールで 「IAMと管理 > IAM」に入ります。
「[プロジェクト番号]@cloudbuild.gserviceaccount.com」というプリンシパルが存在するので編集アイコンをクリックします。(※プロジェクト番号は、エラーログにあったproject=1111111111 です)

「別のロールを追加」をクリックします。

「Cloud Buildサービスアカウント」を追加します。

これで再度デプロイを実行します。
firebase deploy --only functions
・
・
・
+ functions[helloWorld(us-central1)] Successful update operation.
Function URL (helloWorld(us-central1)): https://helloworld-xyz-uc.a.run.app
+ Deploy complete!
無事デプロイが成功しました。
firebaseコンソール上のエラーも消えます。

【※超重要】無課金で使うための注意点と鉄則
Cloud Functionsを使うと、Google Cloudの他の様々なサービスも自動で使うことになります。
このときに知らず知らずのうちに課金が発生していた…という状況を防ぐためにも以下のポイントを押さえておくことが重要です。


