无法从 Google Cloud Function 访问存储在 Secrets Manager 中的秘密

Can't access secret stored in Secrets Manager from Google Cloud Function

在测试我编写的 Google 云函数时尝试访问存储在 Secret Manager 中的秘密时,我收到此错误:Error: 7 PERMISSION_DENIED: Permission 'secretmanager.versions.access' denied for resource '<resource-name>' (or it may not exist).

我的代码:

const {SecretManagerServiceClient} = require('@google-cloud/secret-manager');
const secretClient = new SecretManagerServiceClient();

...

const [version] = await secretClient.accessSecretVersion({
  name: secretName
});
const secret = version.payload.data.toString();

我已经按照文档中的步骤操作,在调用服务时指定了密钥的全名(projects/<project-id>/secrets/<secret-name>/versions/latest,所以问题在 doesn't apply here) and giving the service account that runs my cloud functions the "Secret Manager Secret Accessor" role (which should rule out the root problem in Why isn't my Firebase app connecting to Google Secret Manager?)。

我在尝试使用 curl 在本地触发函数时以及在 UI(GCF > 函数详细信息 > 测试)中测试它时都看到了这个问题。

这里有什么我遗漏的吗?

事实证明,我将“Secret Manager Secret Accessor”角色赋予了错误的服务帐户 - 我将其赋予了 GCF administrative service account, which is used to create/update/delete functions (service-<project-id>@gcf-admin-robot.iam.gserviceaccount.com) instead of to the runtime service account,这正是 运行 函数实际使用的角色( <project-id>@appspot.gserviceaccount.com).

将上述角色(以及其他所需功能)添加到 运行时间服务帐户后,功能成功完成。