2

Firebaseクラウド関数の導入により、現在のnode.jsサーバサイドコードの一部をクラウド関数に移行しています。私が抱えている問題の1つは、GCSバケットからディスク上の一時ファイルにファイルをダウンロードし、それを添付ファイルとしてメールで送信することです(mailgun-jsを使用)。firebaseクラウド関数Google Cloud StorageのAPIエラー

私の悲しみを引き起こしてコードの一部は次のとおりです。私は機能のログに取得してい

return mkdirp(tempLocalDir).then(() => { 
    const bucket = gcs.bucket(gcsBucket); 
    const tempFilePath = tempLocalDir + gcsFile; 
    return bucket.file(gcsFile).download({ 
     destination: tempFilePath 
    }).then(() => { 
     console.log('File downloaded locally to', tempFilePath); 
     var messageSubject = "Test"; 
     var messageBody = "Test with attach"; 

     var mailgunData = { 
      from: , 
      to: agentEmail, 
      subject: messageSubject, 
      html: messageBody, 
      attachment: tempFilePath, 
     }; 
     mailgunAgent.messages().send(mailgunData, function (error, body) { 
      console.log(body); 
     }); 

    }); 

}); 

エラーメッセージは次のとおりです。

ApiError: Forbidden 
    at Object.parseHttpRespMessage (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:156:33) 
    at Object.handleResp (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:131:18) 
    at Duplexify.<anonymous> (/user_code/node_modules/@google-cloud/storage/src/file.js:724:21) 
    at emitOne (events.js:96:13) 
    at Duplexify.emit (events.js:188:7) 
    at emitOne (events.js:96:13) 
    at DestroyableTransform.emit (events.js:188:7) 
    at emitOne (events.js:96:13) 
    at Request.emit (events.js:188:7) 
    at Request.<anonymous> (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1108:14) 

私は、ファイルをダウンロードすることができましたよ要求を使用してディスク上の/ tmp /フォルダを作成してください。これはフォールバックオプションになりますが、可能であればGCSツールを使用したいと考えています。私はGCSの認証エラーだと思っていますが、それをどのように追跡するのかはわかりません。 Firebaseの場合とは異なり、GCSのクラウド関数.config()に異なる認証パラメータを設定する必要がありますか?もしそうなら、私はどのように入力しますか?私たちのGCSバケツとプロジェクトは、Firebase Storageの導入に先行していますが、私たちはサーバ上で稼動するノード機能との併用に成功しました。 GoogleクラウドストレージAPIを使用できるようになる前に特定する必要があり、事前に

おかげで、 ザック

答えて

0

。また、他のAPIを使用することもできます。

これを行うには、googleクラウドプラットフォームのAPIログインページ(here)にアクセスし、対応するサービスアカウントキーをJSONファイルとしてダウンロードする必要があります。次に、このファイルをfirebaseプロジェクト内の関数フォルダに配置します。

最後の代わりに使用して:あなたのPROJECTIDとkeyFilenameで

const gcs = require('@google-cloud/storage'); 

const storageClient = gcs({ projectId: projectId, keyFilename: './keyFilename.json' }); const bucket = storageClient.bucket(gcsBucket);

const bucket = gcs.bucket(gcsBucket);

をあなたはこれを呼び出します。

+0

返信いただきありがとうございます。残念ながら私はそれを試みましたが、うまくいきません。私は認証問題があるかもしれないと思っていますが、それを追跡するのに問題があります。 – Zach

3

解決済み:最後に上記を解決しました。問題は@ google-cloud/storageの認証でGCSプロジェクトIDがIDとして必要でしたが、Firebase admin-sdkキーファイルでGCSプロジェクトのキーファイルではありませんでした。 FirebaseのプロジェクトIDをGCSのauthのIDとしてFirebaseのキーファイルとともに使用すると失敗しました。

_(ツ)_ /¯

私たちのプロジェクトのセットアップ中に奇妙な行動であってもよいが、それは私たちのために、関連する問題を解決するもので更新すると思ったかもしれません。

上記grllが提供する形式を使用して働いていた設定は次のとおりです。

const gcs = require('@google-cloud/storage'); 
const storageClient = gcs({ 
    projectId: "this is the GCS project ID, 
    keyFilename: 'this is the firebase admin-sdk keyFilename.json' 
}); 
const bucket = storageClient.bucket(gcsBucket); 
2

PROJECTIDまたはkeyFilenameを装着せずにこの問題を解決する別の方法:

  1. ゴープロジェクトのFirebaseコンソールへ
  2. 設定 - >アクセス許可
  3. IAMタブを開く必要があります
  4. 「ストレージ管理者」ロールの「App Engineのデフォルトサービスアカウント」と「Google APIサービスアカウント」のアクセス許可を
  5. 今すぐになります!
+0

ストレージ管理者の役割が見つかりません。そのロールに新しい1つのベースを作成し、それをアカウントに割り当てる必要がありますか?また、 'Google APIサービスアカウント'もはや存在しません。 – Xerri

関連する問題