von Google Cloud Functions auf ein Secret zugreifen

Secret Manager in FlutterFlow Cloud-Function

FlutterFlow bietet die Möglichkeit, Google Cloud Functions zu nutzen. Diese bieten sich an, wenn Skripts direkt am Server ausgeführt und nicht nach außen dringen sollen. Um Passwörter o. ä. in solchen Funktionen zu speichern, bietet sich der Google Secrets Manager an: Dort liegen die Kennwörter wesentlich sicherer als direkt im Quellcode.

Doch wie greife ich mit eine Google Cloud Function, die ich in FlutterFlow erstelle, auf ein Secret zu? Genau das zeige ich jetzt kurz.

package.json

Um ein zusätzliches Paket zu installieren (und genau das benötigen wir hier) öffnen wir in FlutterFlow die Cloud Functions – Seite und wählen „package.json„. Dort tragen wir unter dependencies diese neue Zeile ein:

  "dependencies": {
    "firebase-admin": "^11.8.0",
    "firebase-functions": "^4.3.1",
    "@google-cloud/secret-manager": "^5.6.0"
  },

Diese Datei wird wirksam, sobald wir das nächste Mal deployen.

Zugriff auf das Secret in der Cloud Function

Als nächsten Schritt legen wir unsere Function an. Eine Zeile ist dabei vor der Funktion wichtig:

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

In der Function selbst greifen wir auf das Secret zu:

    try {
      // Initialize the SecretManagerServiceClient
      const secretManagerClient = new SecretManagerServiceClient();

      // Access the secret value
      const [version] = await secretManagerClient.accessSecretVersion({
        name: 'projects/<project-id>/secrets/<secret-name>/versions/latest',
      });
      const secretValue = version.payload.data.toString('utf8');

    } catch (error) {
      console.error('Error:', error);
      return { success: false, message: 'An error occurred while processing the request.' };
    }

Beim „Return“-Wert könnt ihr natürlich flexibel sein – ich liefere sehr oft ein JSON mit einem Success [True/False]-Wert und einer Message [String] zurück.

Berechtigung für den Schlüssel-Zugriff

Wenn wir nun die Funktion in einer FlutterFlow-Action ausführen, werden wir in den Google Cloud Logs erkennen, dass wir einen „Permission-Error“ haben: Der Service-Account, der die Funktion ausführt, hat keine Berechtigung, auf den Schlüssel bzw. auf den ganzen Secrets-Manager zuzugreifen.
Daher gehen wir wie folgt vor:

  1. Die Google Cloud Console öffnen
  2. IAM & Admin > IAM wählen
  3. Den Service-Account identifizieren (schaut meist so aus: <PROJECT-ID>@appspot.gserviceaccount.com)
  4. Wir geben diesem 2 zusätzliche Rollen: Secret Manager Secret Accessor und Secret Manager Viewer.

Speichern, neu deployen und – es sollte funktionieren!

Ergänzende Hinweise

  • Beim Angeben des Keys immer den vollständigen Pfad verwenden, also: projects/<project-id>/secrets/<secret-name>/versions/latest
  • In einzelfällen (eher nicht bei FF-Functions) kann es notwendig sein, dass der Default compute service account (e. g. <project_number>-compute@developer.gserviceaccount.com) auch diese Berechtigungen erhält.
  • Claude 3.5 schlägt für die Berechtigungen einen anderen Weg vor: Man erstellt für den Service Account einen JSON-Key (das findet sich auch dort in IAM), lädt diesen im Secrets-Manager beim richtigen Secret hoch und gibt ihm die Rolle Secret Manager Secret Accessor. Ich habe es noch nicht versucht.
1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (1)

Loading…
Avatar von manuel

AUTOR

manuel