Учетные данные Python для GCP Firestore

У меня проблемы с отправкой данных с моей виртуальной машины Linux в хранилище GCP Firestore. Я просто пытаюсь обновить элемент в базе данных. У меня проблема с учетными данными. В зависимости от метода, который я использую, я получаю разные ошибки, однако я считаю, что все они связаны с одной и той же проблемой.

В качестве примечания, у меня есть учетная запись службы с учетными данными json. Я знаю, что эти учетные данные все еще действительны, потому что я могу использовать функцию преобразования речи в текст GCP. Единственное странное поведение, которое я получаю, - это при доступе к Firestore.

Примечание. Я использую Firestore из консоли GCP, а не из консоли Firebase. Я вижу, что есть небольшие различия в том, как они используются (в основном, меры безопасности).

Если я просто открываю новый терминал и запускаю свой скрипт python (я не устанавливаю ссылку на свой файл учетных данных). Данные успешно добавлены в базу данных, но я получаю следующее предупреждение:

UserWarning: Your application has authenticated using end user credentials from Google Cloud 
SDK. We recommend that most server applications use service accounts instead. If your 
application continues to use end user credentials from Cloud SDK, you might receive a "quota 
exceeded" or "API not enabled" error. For more information about service accounts, see 
https://cloud.google.com/docs/authentication/

С другой стороны, если я запустил строку export GOOGLE_APPLICATION_CREDENTIALS="folder/file.json" перед запуском того же сценария python. Вместо этого я получу эту ошибку:

Traceback (most recent call last):
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/grpc_helpers.py", line 57, in error_remapped_callable
    return callable_(*args, **kwargs)
  File "/home/vagrant/.local/lib/python3.6/site-packages/grpc/_channel.py", line 565, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/home/vagrant/.local/lib/python3.6/site-packages/grpc/_channel.py", line 467, in _end_unary_response_blocking
    raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
    status = StatusCode.PERMISSION_DENIED
    details = "Missing or insufficient permissions."
    debug_error_string = "{"created":"@653.64","description":"Error received 
from peer ipv4:...:","file":"src/core/lib/surface
/call.cc","file_line":1052,"grpc_message":"Missing or insufficient 
permissions.","grpc_status":7}"
>

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "sendToDB.py", line 28, in <module>
    update_create_if_missing(args.uid, args.words)
  File "sendToDB.py", line 16, in update_create_if_missing
    item.update({'text': firestore.ArrayUnion([words])})
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/firestore_v1/document.py", line 382, in update
    write_results = batch.commit()
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/firestore_v1/batch.py", line 147, in commit
    metadata=self._client._rpc_metadata,
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/firestore_v1/gapic/firestore_client.py", line 1042, in commit
    request, retry=retry, timeout=timeout, metadata=metadata
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/gapic_v1/method.py", line 143, in __call__
    return wrapped_func(*args, **kwargs)
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/retry.py", line 273, in retry_wrapped_func
    on_error=on_error,
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/retry.py", line 182, in retry_target
    return target()
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/timeout.py", line 214, in func_with_timeout
    return func(*args, **kwargs)
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/grpc_helpers.py", line 59, in error_remapped_callable
    six.raise_from(exceptions.from_grpc_error(exc), exc)
  File "<string>", line 3, in raise_from
google.api_core.exceptions.PermissionDenied: 403 Missing or insufficient permissions.

Если я укажу файл учетных данных непосредственно в файле python, используя строку, аналогичную этой db = firestore.Client(project="myproj-99999",credentials="folder/file.json"), я получу эту ошибку:

Traceback (most recent call last):
  File "sendToDB.py", line 23, in <module>
    update_create_if_missing(args.uid, args.words)
  File "sendToDB.py", line 9, in update_create_if_missing
    db = firestore.Client(project="earningstotext-251320",credentials="keys/gcpcmdlineuser.json")
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/firestore_v1/client.py", line 105, in __init__
    project=project, credentials=credentials, _http=None
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/client.py", line 227, in __init__
    Client.__init__(self, credentials=credentials, _http=_http)
  File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/client.py", line 130, in __init__
    raise ValueError(_GOOGLE_AUTH_CREDENTIALS_HELP)
ValueError: This library only supports credentials from google-auth-library-python. 
See https://google-cloud-python.readthedocs.io/en/latest/core/auth.html 
for help on authentication with this library.

Обратите внимание, что ссылка на readthedocs не работает.

По сути, я просто хотел бы иметь возможность обновлять и читать из моего Firestore с помощью python без каких-либо ошибок или предупреждений. Я также не могу понять, почему, единственный раз, когда это работает (когда я получаю предупреждение), - это когда я не устанавливаю никаких учетных данных.

Это вопрос, аналогичный моему предыдущему вопросу, найденному здесь. Однако я думаю, что моя новая информация требует отдельного вопроса.


person Matt Bart    schedule 23.09.2019    source источник
comment
Насколько вы уверены, что у учетной записи службы есть необходимые разрешения? API-интерфейсы Speech to Text не имеют ничего общего с Firestore и имеют разные роли IAM для разрешений, чем Firestore. Единственный действительно хороший способ проверить, какие роли связаны с учетной записью службы, - это использовать клиент командной строки gcloud и запустить: gcloud projects get-iam-policy ‹ВАШ ПРОЕКТ GCLOUD› --flatten = bindings []. Members - -format = 'table (bindings.role)' --filter = bindings.members: ‹ВАША СЕРВИСНАЯ УЧЕТНАЯ ЗАПИСЬ›   -  person Gabe Weiss    schedule 23.09.2019


Ответы (1)


Вам необходимо добавить роль «Владелец облачного хранилища данных» в учетную запись службы, которую вы используете.

  1. Перейдите в раздел IAM & admin> IAM на console.cloud.google.com.
  2. Найдите учетную запись службы, которую вы используете, и щелкните значок карандаша, чтобы отредактировать ее.
  3. Щелкните Добавить другую роль и найдите владельца хранилища данных.

Ссылка: https://cloud.google.com/firestore/docs/security/iam < / а>

person Kunal Deo    schedule 24.09.2019