Comment se connecter à Google Cloud Storage à partir d'une fonction python?

Aug 24 2020

Je suis nouveau sur Google Cloud Storage et j'essaie de configurer une fonction qui télécharge un blob une fois par jour. Pour le moment, je travaille dans mon Jupyter Notebook mais finalement, le code s'exécutera dans une fonction Azure. J'ai du mal à configurer le client qui me connecte au bucket. J'ai un identifiant de compte de service JSON qui me permet de me connecter à google.

Localement j'ai trouvé une solution:

from google.cloud import storage

client = storage.Client.from_service_account_json('<PATH_TO_SERVICE_ACCOUNT_JSON>')

Le problème est que je n'ai pas de chemin où je stocke mon JSON dans le cloud mais je le stocke dans le coffre de clés. J'ai proposé la solution suivante:

from google.cloud import storage
import json
from google.oauth2 import service_account

string_key = get_key_from_key_vault()
service_account_info = json.loads(string_key)
google_credentials = service_account.Credentials.from_service_account_info(
    service_account_info
)
scoped_credentials = google_credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform.read-only'])
print(type(scoped_credentials))
client = storage.Client(credentials = scoped_credentials)

Je ne suis pas tout à fait sûr d'avoir besoin de la scoped_credentials = ...pièce, mais je n'ai que des autorisations de lecture sur le seau. (si je saute la partie, l'erreur reste la même)

Lorsque je cherche cette solution, j'obtiens l'erreur suivante:

DefaultCredentialsError: Could not automatically determine credentials. Please set 
GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application. For
 more information, please see https://cloud.google.com/docs/authentication/getting-started

Je n'ai aucune idée de ce que je fais mal car je pense que j'ai déjà défini les informations d'identification explicitement.

Meilleur P

Réponses

1 JanHernandez Aug 24 2020 at 20:44

vous pouvez définir la variable d'environnement GOOGLE_APPLICATION_CREDENTIALSavec le chemin du fichier json et authentifier votre fonction en démarrant le client de stockage sans paramètres.

client = storage.Client()

* par défaut, le client de stockage utilise le chemin du fichier sur la variable d'environnementGOOGLE_APPLICATION_CREDENTIALS

C'est le moyen le plus simple d'utiliser les informations d'identification JSON et il est compatible avec la plupart des bibliothèques python de Google Cloud.

1 Pet Aug 25 2020 at 08:41

après quelques tests supplémentaires, j'ai découvert que j'avais manqué d'ajouter project = None. Si vous l'ajoutez, utilisez la commande suivante pour créer le client, cela fonctionne:

client = storage.Client(project = None, credentials = scoped_credentials)

Merci pour votre aide et matière à réflexion :-)

guillaumeblaquiere Aug 24 2020 at 19:19

(J'utilise la partie réponse car le formatage du code dans le commentaire est horrible)

Pouvez-vous essayer ceci et me dire si vous voyez le jeton d'accès 2 imprimé?

from google.cloud import storage
import json
from google.oauth2 import service_account
from google.auth.transport import requests as grequests

string_key = get_key_from_key_vault()
service_account_info = json.loads(string_key)

google_credentials = service_account.Credentials.from_service_account_info(
    service_account_info
)
google_credentials.refresh(grequests.Request())
print(google_credentials.token)


scoped_credentials = google_credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform.read-only'])
scoped_credentials.refresh(grequests.Request())
print(scoped_credentials.token)