🐷

【Next.js,Vercel】error: could not load the default credentialsを解決

2024/02/19に公開

はじめに

今回はNext.jsやfirestoreなどを用いて作成したプロジェクトを、Vercelにデプロイした際に発生したエラーの解決について、備忘録として書いていきます。
Next.jsのバージョンは14.1.0です。

エラー内容

Vercelにデプロイした際に、Google Cloudの認証に関する以下のようなエラーが出ました。
ローカル環境では問題なく動いていました。

error: could not load the default credentials. browse to https://cloud.google.com/docs/authentication/getting-started for more information.

コードの該当箇所はAPI Routesに位置するファイルにありました。Firebaseアプリケーションの初期化とfirestoreサービスにアクセスするための設定箇所に問題がありました。

ローカル環境との差分

ローカル開発環境では、以下のコマンドを用いてGoogle Cloud APIにアクセスするためのデフォルトの認証情報を設定していました。

gcloud auth application-default login

認証が成功すると、取得した認証情報がローカルマシンに保存されます。これによって、Google CloudのリソースやサービスへのAPIリクエストを可能にしていました。
一方、Vercelのようなサーバレス環境では、異なる認証方法を用いる必要があります。

解決方法

そこで、該当箇所を以下のように書き換えました。

import * as admin from "firebase-admin";

if (!admin.apps.length) {
    admin.initializeApp({
        credential: admin.credential.cert({
            projectId: process.env.FIREBASE_PROJECT_ID,
            clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
            privateKey: process.env.FIREBASE_PRIVATE_KEY?.replace(/\\n/g, '\n'),
        }),
        databaseURL: process.env.FIREBASE_DATABASE_URL,
    });
}

const firestore = admin.firestore();

Firebase Admin SDKは、Firebaseプロジェクトのサーバーサイドでの管理操作を行うためのツールセットです。API Routesでの使用なので、Firebase Admin SDKを用います。
環境変数名について、サーバーサイドで呼び出しているので、NEXT_PUBLIC_は不要です。

Discussion