Saya mencoba memigrasikan kode saya dari menggunakan kunci API yang disimpan di file .env ke menggunakan Google Cloud Platform Secrets Manager. Saya telah mengikuti petunjuk di sini tetapi saya menemukan kesalahan yang mengatakan bahwa saya tidak memiliki izin untuk mengakses rahasia.

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)

Dan itulah kesalahan yang saya dapatkan:

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

Saya memang membuat Akun Layanan dengan izin "Pemilik", mengunduhnya dan membuat export GOOGLE_APPLICATION_CREDENTIALS=/Users/.... Lokasi file .json akun layanan saya ditampilkan dengan benar saat saya menjalankan echo $GOOGLE_APPLICATION_CREDENTIALS.

Saya benar-benar tidak tahu apa yang saya lakukan salah.

11
Bartek Pacia 18 April 2020, 03:22

3 jawaban

Jawaban Terbaik

Saat Anda mengakses rahasia, Anda perlu menentukan proyek:

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

Seharusnya

await secretClient.accessSecretVersion({ name: "projects/my-project/secrets/TELEGRAM_TOKEN" })
12
sethvargo 18 April 2020, 14:55

Jawaban-jawaban ini membimbing saya, tetapi butuh waktu lama bagi saya untuk membuatnya berfungsi. Anda harus memasukkan PROJECT_ID dan bukan Project-Name.

Temukan ID Proyek Anda:

Kolom kedua di sini menunjukkan ID Proyek:

enter image description here

Sekarang gunakan itu dan jalankan skrip

await secretClient.accessSecretVersion({
  name: "projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest"
})
1
Keet Sugathadasa 23 Februari 2021, 12:11

Saya baru saja mengalami masalah yang sama dan saya pribadi harus menambahkan /versions/latest setelah menentukan nama proyek dalam nama rahasia.

await secretClient.accessSecretVersion({
  name: "projects/my-project/secrets/TELEGRAM_TOKEN/versions/latest"
})
4
abalexandre 13 Oktober 2020, 12:34