Firebase 功能部署上的 Google Cloud Secret 权限被拒绝

问题描述 投票:0回答:3

我有一个带有谷歌云功能的 Firebase 项目,如下所示:

export const myFun = functions.region("europe-west1")
    .runWith({ timeoutSeconds: 10, secrets: ['MY_SECRET'] })
    .https.onCall((data, context) => {/*doStuff()*/});

该函数使用 MY_SECRET 访问数据库。当我从本地计算机构建并部署此功能到谷歌云时,一切都工作得很好。我可以访问它并从数据库中获取结果,一切都很好。

但是,我设置了一个 github 操作来为我将此功能部署到云端。为此,我设置了一个服务帐户作为 github 秘密,这样我就可以在 github 操作中运行

npx firebase-tools deploy
。这一直有效,直到我将
secrets: ['MY_SECRET']
添加到云函数中。

在本地我仍然可以成功部署,但是github操作失败:

Error: Failed to validate secret versions:
- FirebaseError HTTP Error: 403, Permission 'secretmanager.versions.get' denied for resource 'projects/my-project/secrets/MY_SECRET/versions/latest' (or it may not exist).

我确保秘密确实存在于正确的谷歌云项目中,并且我在github中使用的服务帐户确实具有角色

Secret Manager Secret Accessor 
,但我仍然收到错误。

我注意到的一件事是,当我转到浏览器中的秘密管理器并单击我的秘密时,我看到:

Resource ID    projects/123456789/secrets/MY_SECRET

错误显示

projects/my-project/secrets/MY_SECRET/versions/latest

因此,在构建步骤中,使用了项目名称,并且在秘密管理器中我看到了项目 ID。不确定这是否相关,只是我注意到的......

为什么这不起作用?我尝试了几个小时,但越来越绝望,请帮助😅

firebase google-cloud-platform google-cloud-functions google-secret-manager
3个回答
12
投票

...好吧,在浪费了很多时间后找到了解决方案...

原来

Secret Manager Secret Accessor
角色还不够,还需要
Secret Manager Viewer
角色! 🤦u200d♂️🤦u200d♂️🤦u200d♂️


0
投票

Secret Accessor 是正确的角色,需要将其赋予函数运行时服务帐户。请参阅此答案:无法从 Google Cloud Function 访问存储在 Secrets Manager 中的密钥

运行时服务帐户:https://cloud.google.com/functions/docs/concepts/iam#runtime_service_accounts


0
投票

如果您使用第二代 Firebase Functions,Firebase 现在使用不同的 IAM 帐户,因此您可能需要更新您的权限。

https://cloud.google.com/functions/docs/concepts/iam#runtime_service_accounts

在运行时,Cloud Functions(第一代)默认使用 App Engine 默认服务帐户 ([email protected]),该帐户对项目具有编辑者角色。 Cloud Functions(第二代)默认使用 Compute Engine 默认服务帐户 ([email protected]),该帐户还具有项目的编辑者角色。

© www.soinside.com 2019 - 2024. All rights reserved.