无法访问 GCP Secret Manager 中的密钥

Can't access secret in GCP Secret Manager

提问人:Bartek Pacia 提问时间:4/18/2020 最后编辑:Bartek Pacia 更新时间:8/4/2023 访问量:16336

问:

我正在尝试将我的代码从使用存储在文件中的 API 密钥迁移到使用 Google Cloud Platform Secrets Manager。我已按照此处的说明进行操作,但遇到错误,指出我无权访问该密钥。.env

import * as admin from "firebase-admin"
import { SecretManagerServiceClient } from "@google-cloud/secret-manager"

admin.initializeApp()
const secretClient = new SecretManagerServiceClient()

async function main() {
  async function getSecret(): Promise<string | null | undefined> {
    const [version] = await secretClient.accessSecretVersion({ name: "TELEGRAM_TOKEN" })

    return version.payload?.data?.toString()
  }

  const TELEGRAM_TOKEN = await getSecret()
  console.log(TELEGRAM_TOKEN)
}

main().catch(console.error)

这就是我得到的错误:

> node lib/app.js --telegram

{ Error: 7 PERMISSION_DENIED: Permission denied on resource project TELEGRAM_TOKEN.
    at Object.callErrorFromStatus (/Users/bartekpacia/dev/node/telegram-lang-enforcer/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
    at Object.onReceiveStatus (/Users/bartekpacia/dev/node/telegram-lang-enforcer/node_modules/@grpc/grpc-js/build/src/client.js:174:52)
    at Object.onReceiveStatus (/Users/bartekpacia/dev/node/telegram-lang-enforcer/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:340:141)
    at Object.onReceiveStatus (/Users/bartekpacia/dev/node/telegram-lang-enforcer/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:303:181)
    at Http2CallStream.outputStatus (/Users/bartekpacia/dev/node/telegram-lang-enforcer/node_modules/@grpc/grpc-js/build/src/call-stream.js:114:27)
    at Http2CallStream.maybeOutputStatus (/Users/bartekpacia/dev/node/telegram-lang-enforcer/node_modules/@grpc/grpc-js/build/src/call-stream.js:153:22)
    at Http2CallStream.endCall (/Users/bartekpacia/dev/node/telegram-lang-enforcer/node_modules/@grpc/grpc-js/build/src/call-stream.js:140:18)
    at Http2CallStream.handleTrailers (/Users/bartekpacia/dev/node/telegram-lang-enforcer/node_modules/@grpc/grpc-js/build/src/call-stream.js:262:14)
    at ClientHttp2Stream.emit (events.js:198:13)
    at emit (internal/http2/core.js:265:8)
  code: 7,
  details: 'Permission denied on resource project TELEGRAM_TOKEN.',
  metadata:
   Metadata {
     internalRepr:
      Map {
        'google.rpc.help-bin' => [Array],
        'grpc-status-details-bin' => [Array],
        'grpc-server-stats-bin' => [Array] },
     options: {} },
  note:
   'Exception occurred in retry method that was not classified as transient' }

我确实创建了一个具有“所有者”权限的服务帐户,下载了它并制作了.我的服务帐户.json文件位置在执行时正确显示。export GOOGLE_APPLICATION_CREDENTIALS=/Users/...echo $GOOGLE_APPLICATION_CREDENTIALS

我真的不知道我做错了什么。

google-cloud-platform gcloud google-secret-manager

评论

3赞 sethvargo 4/18/2020
名称应为 projects/my-project/secrets/TELEGRAM
0赞 Bartek Pacia 4/18/2020
谢谢!现在我看到它在文档中非常明显。咄。
0赞 sdfsdf 4/19/2020
你的代码库如何将自己标识为可以查看你的秘密的人?在这里遇到问题 stackoverflow.com/questions/61301133/...
0赞 Bartek Pacia 4/19/2020
嗨,我按照此处描述的说明进行操作 cloud.google.com/secret-manager/docs/quickstart

答:

25赞 sethvargo 4/18/2020 #1

访问密钥时,需要指定项目:

await secretClient.accessSecretVersion({ name: "TELEGRAM_TOKEN" })

应该是

await secretClient.accessSecretVersion({ name: "projects/my-project/secrets/TELEGRAM_TOKEN/versions/latest" })

评论

1赞 TommyBs 6/2/2020
现在查看文档很明显,但“name”参数等在注释中并因此融入其中,您在代码示例中没有注意到它们,这无济于事!
0赞 Oliver Dixon 8/7/2020
这个目录也指的是什么?它是基于GCloud的吗?
3赞 Oliver Dixon 8/7/2020
对于像我一样迷路的其他人,它在秘密管理器页面上,在“秘密”的标题下有一条路径。这么奇怪的添加秘密的方式。
0赞 SebastianG 3/9/2021
现在我遇到了错误:3 INVALID_ARGUMENT:资源 ID [projects/123123123123/secrets/mongo_uri] 格式无效。
1赞 sethvargo 7/26/2022
@TheTanadu,传入一个数字将返回该版本。
8赞 someRandomDev 9/16/2020 #2

我刚刚遇到了同样的问题,我个人不得不在秘密名称中指定项目名称后添加。/versions/latest

await secretClient.accessSecretVersion({
  name: "projects/my-project/secrets/TELEGRAM_TOKEN/versions/latest"
})
6赞 Keet Sugathadasa 2/23/2021 #3

这些答案指导了我,但我花了很长时间才让它发挥作用。您需要输入 而不是 .PROJECT_IDProject-Name

查找您的项目 ID:

此处的第二列显示项目 ID:

enter image description here

现在使用它并运行脚本

await secretClient.accessSecretVersion({
  name: "projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest"
})
0赞 Singh5025 5/3/2023 #4

您也可以使用PROJECT_NUMBER。更新PROJECT_NUMBER权限问题为我解决了。您也可以尝试。

“projects/<PROJECT_NUMBER>/secrets/TELEGRAM_TOKEN/versions/latest”

-1赞 Shubham Verma 8/4/2023 #5

如果要使用 SDK 或代码访问 GCP Secret Manager 值,可以按照以下步骤操作:

第 1 步:下载 GCP CLI

第 2 步:在本地计算机上对 GCP CLI 进行身份验证

步骤 3:使用以下代码创建服务:

import { Injectable } from '@nestjs/common';
const { SecretManagerServiceClient } = require('@google-cloud/secret-manager').v1;


@Injectable()
export class AppService {
  async getHello(): Promise<string> {
    try {
      const secretmanagerClient = new SecretManagerServiceClient();
      const request = {
        name: 'projects/<YOUR_PROJECT_CODE>/secrets/<YOUR_SECRET_NAME>/versions/1',
      };
      let response = await secretmanagerClient.accessSecretVersion(request);
      response = response[0].payload.data.toString('utf8')
      console.log(response);
      return response;
    }
    catch (err) {
      console.log('err:', err)
    }

  }
}

第 4 步:运行代码并调用服务方法。