在 firebase 函数部署上对 google 云机密的权限被拒绝

Permission denied to google cloud secret on firebase function deploy

我有一个带有 google 云函数的 firebase 项目,如下所示:

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

该函数使用 MY_SECRET 访问数据库。当我从我的本地机器构建和部署这个功能到 google 云时,一切都工作得很好。我可以访问它并从数据库中得到结果,一切都很好。

但是,我设置了一个 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).

我确保秘密确实存在于正确的 google 云项目中,并且我在 github 中使用的服务帐户确实具有角色 Secret Manager Secret Accessor ,但我仍然得到错误。

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

Resource ID projects/123456789/secrets/MY_SECRET

错误显示 projects/my-project/secrets/MY_SECRET/versions/latest

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

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

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

原来Secret Manager Secret Accessor作用还不够,还需要Secret Manager Viewer作用! ‍♂️‍♂️‍♂️

Secret Accessor 是正确的角色,需要将其赋予函数运行时服务帐户。看到这个答案:

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