Ich arbeite an einem Programm, das auf Google Cloud Run ausgeführt wird und Dateien im Google Cloud-Speicher gespeichert hat.
Das Problem tritt auf, wenn versucht wird, eine signierte URL zum Herunterladen einer Datei aus dem Cloud-Speicher zu generieren, die normalerweise privat ist. Auf meinem lokalen Computer funktioniert es einwandfrei, bei Ausführung in Cloud Run jedoch nicht.
Vor Ort verwende ich ein Dienstkonto, dem die Storage Object Admin
Rolle zugewiesen ist. Ich lade die Berechtigungen mithilfe einer Umgebungsvariablen, GOOGLE_APPLICATION_CREDENTIALS
deren absoluter Pfad der von der Cloud-Konsole heruntergeladene .json-Schlüsseldatei ist.
Bei Cloud Run habe ich dem Dienstkonto dieselbe Rolle zugewiesen, unter der der Dienst ausgeführt wird. Wenn ich jedoch versuche, dort etwas zu unterschreiben, erhalte ich eine Ausnahme:
java.io.IOException: Fehlercode 403 beim Signieren der bereitgestellten Bytes: Der Aufrufer hat keine Berechtigung
In meinem Code wähle ich kein Dienstkonto explizit aus, da die SDK-Dokumentation mich glauben lässt, dass dies automatisch erfolgt. In Cloud Run habe ich keine GOOGLE_APPLICATION_CREDENTIALS
Variable festgelegt, da ich dachte, dass dies auch automatisch erfolgt.
Was mich verwirrt, ist, dass die in Cloud Run ausgeführte Anwendung weiterhin Dateien in den Cloud-Speicher hochladen kann. Daher denke ich, dass sie von irgendwoher Anmeldeinformationen enthält.
Was mache ich falsch?
TL; DR: Stellen Sie sicher, dass das Dienstkonto über die iam.serviceAccounts.signBlob
Berechtigung verfügt.
Nach weiteren Untersuchungen der Methode, mit der ich Anmeldeinformationen für Cloud Run erworben habe:
GoogleCredentials credentials = ComputeEngineCredentials.create();
Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
Ich habe den Javadoc gelesen für ComputeEngineCredentials
:
OAuth2-Anmeldeinformationen, die das integrierte Dienstkonto für eine Google Compute Engine-VM darstellen. Ruft Zugriffstoken vom Metadatenserver der Google Compute Engine ab. Diese Anmeldeinformationen verwenden die IAM-API zum Signieren von Daten. Weitere Informationen finden Sie unter sign (byte []).
Danach las ich das Javadoc für sign(byte[])
(Hervorhebung von mir):
Signiert die bereitgestellten Bytes mit dem privaten Schlüssel, der dem Dienstkonto zugeordnet ist. Das Projekt der Compute Engine muss die IAM-API (Identity and Access Management) aktivieren, und das Dienstkonto der Instanz muss über die Berechtigung iam.serviceAccounts.signBlob verfügen .
Aus iam.serviceAccounts.signBlob
diesem Grund habe ich eine neue Rolle nur mit der Berechtigung erstellt und sie dem Dienstkonto zugewiesen, das in meiner Cloud Run-Konfiguration verwendet wird. Danach verschwand das Problem sofort (keine erneute Bereitstellung erforderlich)
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen