Нет доступа к секрету в GCP Secret Manager

Я пытаюсь сохранить свои ключи API в .envк использованию Google Cloud Platform Secrets Manager. Я выполнил приведенные здесь инструкции, но обнаружил ошибку о том, что у меня нет разрешений на доступ к секрету.

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' }

Я создал учетную запись службы с разрешениями "Владелец", загрузил ее и сделал export GOOGLE_APPLICATION_CREDENTIALS=/Users/.... Расположение файла.json моей служебной учетной записи отображается правильно, когда я выполняюecho $GOOGLE_APPLICATION_CREDENTIALS.

Я действительно понятия не имею, что делаю не так.

5 ответов

Решение

Когда вы получаете доступ к секрету, вам нужно указать проект:

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

должно быть

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

Я столкнулся с той же проблемой, и мне лично пришлось добавить /versions/latest после указания имени проекта в секретном имени.

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

Эти ответы направили меня, но мне потребовалось много времени, чтобы заставить это работать. Вам нужно ввести PROJECT_ID а не Project-Name.

Найдите свой идентификатор проекта:

Во втором столбце отображается идентификатор проекта:

Теперь используйте это и запустите скрипт

      await secretClient.accessSecretVersion({
  name: "projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest"
})

Вы также можете использовать PROJECT_NUMBER. После обновления проблема с разрешением PROJECT_NUMBER для меня решена. Вы также можете попробовать.

"projects/<PROJECT_NUMBER>/secrets/TELEGRAM_TOKEN/versions/latest"

Если вы хотите получить доступ к значениям GCP Secret Manager с помощью SDK или кода, вы можете выполнить следующие шаги:

Шаг 1. Загрузите интерфейс командной строки GCP.

Шаг 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. Запустите код и вызовите метод службы.

Другие вопросы по тегам