Как правильно настроить служебную учетную запись в Google AppEngine Flex с Python? - PullRequest
0 голосов
/ 04 сентября 2018

Я использую гибкую среду Google AppEngine (GAE) с настраиваемой средой выполнения (python2.7). Я использую пользовательский режим, поэтому я могу просто управлять Dockerfile и иметь четкое соотношение между моим ноутбуком и при развертывании в GAE.

У меня есть приложение Python 2.7 Flask, которое выполняет запрос к DataStore. Я получаю следующее (при запуске python main.py в моем локальном докере):

root@24dcf9b8712d:/home/vmagent/app# curl localhost:5000/things
'/home/vmagent/app/clientid-searchapp.json'
[2018-09-04 14:54:19,969] ERROR in app: Exception on /things [GET]
Traceback (most recent call last):
  File "/env/local/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/env/local/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/env/local/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/env/local/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/env/local/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "main.py", line 55, in products
    for rec in query.fetch(limit=100):
  File "/env/lib/python2.7/site-packages/google/api_core/page_iterator.py", line 199, in _items_iter
    for page in self._page_iter(increment=False):
  File "/env/lib/python2.7/site-packages/google/api_core/page_iterator.py", line 230, in _page_iter
    page = self._next_page()
  File "/env/local/lib/python2.7/site-packages/google/cloud/datastore/query.py", line 517, in _next_page
    query=query_pb,
  File "/env/local/lib/python2.7/site-packages/google/cloud/datastore_v1/gapic/datastore_client.py", line 294, in run_query
    request, retry=retry, timeout=timeout, metadata=metadata)
  File "/env/lib/python2.7/site-packages/google/api_core/gapic_v1/method.py", line 139, in __call__
    return wrapped_func(*args, **kwargs)
  File "/env/lib/python2.7/site-packages/google/api_core/retry.py", line 260, in retry_wrapped_func
    on_error=on_error,
  File "/env/lib/python2.7/site-packages/google/api_core/retry.py", line 177, in retry_target
    return target()
  File "/env/lib/python2.7/site-packages/google/api_core/timeout.py", line 206, in func_with_timeout
    return func(*args, **kwargs)
  File "/env/lib/python2.7/site-packages/google/api_core/grpc_helpers.py", line 56, in error_remapped_callable
    six.raise_from(exceptions.from_grpc_error(exc), exc)
  File "/env/local/lib/python2.7/site-packages/six.py", line 737, in raise_from
    raise value
PermissionDenied: 403 Missing or insufficient permissions.
127.0.0.1 - - [04/Sep/2018 14:54:19] "GET /things HTTP/1.1" 500 -
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request.  Either the server is overloaded or there is an error in the application.</p>

Отрывки из main.py

app = Flask(__name__)
ds = datastore.Client()
<snip>
@app.route("/things")
def things():
    global ds
    pprint(os.environ['GOOGLE_APPLICATION_CREDENTIALS'])
    query = ds.query(kind='Things', order=('thing_name',))
    results = list()
    for rec in query.fetch(limit=100):
        results.append(rec)
    return jsonify(results)

Выход gcloud auth list:

root@24dcf9b8712d:/home/vmagent/app# gcloud auth list
              Credentialed Accounts
ACTIVE  ACCOUNT
*       <myapp>@<project-name>.iam.gserviceaccount.com

Это настроенная учетная запись службы. Я переоценил это с чрезмерным членством Роли; Я почти уверен, что служебной учетной записи не хватает разрешений. Фактически, у него есть «Владелец хранилища данных»

В main.py Я выводлю: pprint (os.environ [ 'GOOGLE_APPLICATION_CREDENTIALS'])

И это выводит путь к моему client-<myapp>.json файлу для учетной записи службы. Это тот же файл, что и в Dockerfile, и

RUN gcloud auth activate-service-account --key-file=clientid-<myapp>.json --project <project-name> --quiet

Я получаю те же результаты при запуске приложения Flask в локальной среде Docker и при развертывании в GAE Flexible. Приложение Flask имеет другие конечные точки, которые работают так, как будто они не вызывают другие службы. Только /things использует API для вызова DataStore и получает вышеуказанную ошибку.

Я прошел все документы. Я уверен, что это что-то простое и очевидное, но на самом деле все выглядит правильно.

UPDATE: Я попытался создать клиент DataStore с явным указанием имени проекта без изменений в результате. Кроме того, я выполнил эту команду из контейнера Docker, и мне это показалось необычным, но я не знаю, что это неправильно для учетной записи службы.

root@e02b74cd269d:/home/vmagent/app# gcloud projects list
API [cloudresourcemanager.googleapis.com] not enabled on project 
[<project id>]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)?  y

Когда я отвечаю w / Y:

ERROR: (gcloud.projects.list) PERMISSION_DENIED: Not allowed to get project settings for project <project id>

Выход gcloud config list:

root@d18c83cae166:/home/vmagent/app# gcloud config list
[core]
account = <myapp>@<myproject>.iam.gserviceaccount.com
disable_usage_reporting = False
project = <myproject>

Your active configuration is: [default]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...