【问题标题】:gcloud run & Firebase Admin SDKgcloud 运行 & Firebase Admin SDK
【发布时间】:2020-06-27 01:31:45
【问题描述】:

我已将一个 JVM 应用程序部署到 Google 云运行,该应用程序使用 Firebase Admin SDK 在 Firebase Cloud Messaging 上发送通知。 使用 GOOGLE_APPLICATION_CREDENTIALS 在本地一切正常。但是,部署的应用程序会引发如下错误:

java.lang.IllegalArgumentException: Project ID is required to access messaging service. Use a service account credential or set the project ID explicitly via FirebaseOptions. Alternatively you can also set the project ID via the GOOGLE_CLOUD_PROJECT environment variable.

我将 FirebaseMessaging 实例创建为:

FirebaseMessaging.getInstance(
FirebaseApp.initializeApp(
    FirebaseOptions.Builder().setCredentials(
        GoogleCredentials.getApplicationDefault()
    ).build()

我已使用具有 Cloud Run 管理员权限的服务帐户部署了 Cloud Run 实例。

我的理解是,部署到任何 GCP 服务的应用程序都会自动获取应用程序凭据。 Cloud Run 和 Firebase Admin SDK 的组合有什么不同吗?

任何帮助将不胜感激。

【问题讨论】:

    标签: firebase google-cloud-platform firebase-admin google-cloud-run


    【解决方案1】:

    你有两个选择:

    1. Query the cloud metadata service 查找您的 Cloud Run 实例部署到的项目 ID。这只能在 Cloud Run 中完成 - 如果您在本地进行测试,它将无法工作。
    2. 在部署期间以某种方式使项目 ID 可用于 Cloud Run。

    实现 #2 的一种简单方法是将项目 ID 放入环境中,以便 Admin SDK 自动获取。例如,一个 shell 脚本:

    service_id="your-service-id"
    project_id="your-project-id"
    
    gcloud run deploy "$service_id" \
        --project "$project_id" \
        --image "..." \
        --platform managed \
        --update-env-vars "GOOGLE_CLOUD_PROJECT=$project_id"
    

    注意填充GOOGLE_CLOUD_PROJECT--update-env-vars

    【讨论】:

    • 似乎已经做到了。非常感谢您的快速帮助!还有一个问题:我不知道 --update-env-vars 和 --set-env-vars 之间的区别是什么
    • gcloud 文档应该会告诉您其中的区别。如果不清楚,请发布一个新问题。
    • 这个答案很有用,但它没有解释为什么当我的应用部署到 Cloud Run/GKE 时我需要显式设置 project_id。 Firebase 文档说服务帐户应该可以在没有任何额外配置甚至recommends to do it 的情况下工作。 Quote: 强烈建议在 Compute Engine、Kubernetes Engine、App Engine 和 Cloud Functions 上运行的应用程序使用这种初始化 SDK 的方式。所以我很困惑。
    猜你喜欢
    • 2018-03-20
    • 1970-01-01
    • 2021-07-29
    • 2020-04-10
    • 1970-01-01
    • 2020-03-23
    • 2018-08-18
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多