Como fazer login no Google Cloud Storage a partir de uma função python?

Aug 24 2020

Eu sou novo no armazenamento em nuvem do Google e tento configurar uma função que baixa um blob uma vez por dia. No momento, estou trabalhando em meu Jupyter Notebook, mas, finalmente, o código será executado em uma Função do Azure. Estou lutando para configurar o cliente que me conecta ao balde. Tenho uma credencial de conta de serviço JSON que me permite conectar ao Google.

Encontrei uma solução localmente:

from google.cloud import storage

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

O problema é que não tenho um caminho onde armazeno meu JSON na nuvem, mas sim no cofre de chaves. Eu encontrei a seguinte solução:

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)

Não tenho certeza se preciso da scoped_credentials = ...peça, mas só tenho permissão de leitura no balde. (se eu pular a parte, o erro permanece o mesmo)

Quando procuro esta solução, obtenho o seguinte erro:

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

Não tenho a menor ideia do que estou fazendo de errado porque acho que já defini as credenciais explicitamente.

Melhor P

Respostas

1 JanHernandez Aug 24 2020 at 20:44

você pode definir a variável de ambiente GOOGLE_APPLICATION_CREDENTIALScom o caminho do arquivo json e autenticar sua função iniciando o cliente de armazenamento sem parâmetros.

client = storage.Client()

* por padrão, o cliente de armazenamento usa o caminho do arquivo na variável de ambienteGOOGLE_APPLICATION_CREDENTIALS

É a maneira mais fácil de usar credenciais JSON e é compatível com a maioria das bibliotecas Python do Google Cloud.

1 Pet Aug 25 2020 at 08:41

depois de mais alguns testes, descobri que falhei em adicionar project = None. Se você adicionar e usar o seguinte comando para criar o cliente, ele funcionará:

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

Obrigado pela sua ajuda e o que você pensa :-)

guillaumeblaquiere Aug 24 2020 at 19:19

(Eu uso a parte da resposta porque a formatação do código no comentário é horrível)

Você pode tentar isso e me dizer se você vê o token de 2 acesso impresso?

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)