提问人:Bartek Pacia 提问时间:4/18/2020 最后编辑:Bartek Pacia 更新时间:8/4/2023 访问量:16336
无法访问 GCP Secret Manager 中的密钥
Can't access secret in GCP Secret Manager
问:
我正在尝试将我的代码从使用存储在文件中的 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
我真的不知道我做错了什么。
答:
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_ID
Project-Name
查找您的项目 ID:
此处的第二列显示项目 ID:
现在使用它并运行脚本
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 步:运行代码并调用服务方法。
评论