Google AppEngine Получение 403 запрещено пытаться обновить cron.yaml - PullRequest
0 голосов
/ 11 февраля 2019

Я следую документам о том, как сделать резервную копию хранилища данных с помощью AppEngine.Я выполняю команду gcloud app deploy cron.yaml на виртуальной машине GCE, которая предназначена для обновления cronjob в AppEngine.виртуальная машина GCE и cron AppEngine находятся в одном проекте, и я назначил администратора AppEngine виртуальной машине GCE через учетную запись службы по умолчанию.Когда я запускаю это на моей локальной машине, он обновляется нормально.Однако на экземпляре GCE возникают проблемы

Вот файлы

app.yaml

runtime: python27
api_version: 1
threadsafe: true
service: cloud-datastore-admin
libraries:
- name: webapp2
  version: "latest"
handlers:
- url: /cloud-datastore-export
  script: cloud_datastore_admin.app
  login: admin

cron.yaml

cron:
- description: "Daily Cloud Datastore Export"
  url: /cloud-datastore-export?namespace_id=&output_url_prefix=gs://<my-project-id>-bucket
  target: cloud-datastore-admin
  schedule: every 24 hours

cloud_datastore_export.yaml

import datetime
import httplib
import json
import logging
import webapp2
from google.appengine.api import app_identity
from google.appengine.api import urlfetch

class Export(webapp2.RequestHandler):
  def get(self):
    access_token, _ = app_identity.get_access_token(
        'https://www.googleapis.com/auth/datastore')
    app_id = app_identity.get_application_id()
    timestamp = datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
    output_url_prefix = self.request.get('output_url_prefix')
    assert output_url_prefix and output_url_prefix.startswith('gs://')
    if '/' not in output_url_prefix[5:]:
      # Only a bucket name has been provided - no prefix or trailing slash
      output_url_prefix += '/' + timestamp
    else:
      output_url_prefix += timestamp
    entity_filter = {
        'kinds': self.request.get_all('kind'),
        'namespace_ids': self.request.get_all('namespace_id')
    }
    request = {
        'project_id': app_id,
        'output_url_prefix': output_url_prefix,
        'entity_filter': entity_filter
    }
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + access_token
    }
    url = 'https://datastore.googleapis.com/v1/projects/%s:export' % app_id
    try:
      result = urlfetch.fetch(
          url=url,
          payload=json.dumps(request),
          method=urlfetch.POST,
          deadline=60,
          headers=headers)
      if result.status_code == httplib.OK:
        logging.info(result.content)
      elif result.status_code >= 500:
        logging.error(result.content)
      else:
        logging.warning(result.content)
      self.response.status_int = result.status_code
    except urlfetch.Error:
      logging.exception('Failed to initiate export.')
      self.response.status_int = httplib.INTERNAL_SERVER_ERROR
app = webapp2.WSGIApplication(
    [
        ('/cloud-datastore-export', Export),
    ], debug=True)

Ошибка, которую я получаю:

Configurations to update:
descriptor:      [/usr/local/sbin/pluto/<my-project-id>/datastore/cron.yaml]
type:            [cron jobs]
target project:  [<my-project-id>]
Do you want to continue (Y/n)?  
Updating config [cron]...
failed.
ERROR: (gcloud.app.deploy) Server responded with code [403]:
  Forbidden Unexpected HTTP status 403.
  You do not have permission to modify this app (app_id=u'e~<my-project-id>').

Я проверил другие сообщения, связанные с этим, однако они, похоже, имеют дело сстарая версия / развертывание appengine

Сервисные учетные записи!

Service Account Permissions

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

С Развертывание с использованием ролей IAM :

Чтобы предоставить учетной записи пользователя возможность развертывания в App Engine:

Нажмите Добавить участника, чтобы добавить учетную запись пользователя в проект, а затем выберите все роли для этой учетной записи, используя раскрывающееся меню:

  • Обязательно ролей, позволяющих развернуть учетную запись в App Engine:

    a.Установите одну из следующих ролей:

    • Используйте роль App Engine> App Engine Deployer , чтобы разрешить учетной записи развертывать версию приложения.
    • Чтобы также разрешить развертывание файлов dos.yaml или dispatch.yaml с приложением, используйте вместо этого роль App Engine> Администратор App Engine .

    Теперь учетная запись пользователя имеетадекватное разрешение на использование Admin API для развертывания приложений .

    b.Чтобы разрешить использование App Engine tooling для развертывания приложений, необходимо также предоставить учетной записи пользователя роль Storage> Storage Admin , чтобы у инструмента было разрешение на загрузку в Cloud Storage..

  • Дополнительно .Предоставьте учетной записи пользователя следующие роли для предоставления разрешения на загрузку дополнительных файлов конфигурации:

    • Cloud Scheduler> Cloud Scheduler Admin роль: разрешения на загрузку cron.yaml файлов.

Потенциально представляет интерес:

0 голосов
/ 11 февраля 2019

Хорошо, после некоторого возни.Я добавил роль редактора проекта в учетную запись службы, связанную с экземпляром GCE, на котором запущен мой сервер.Я не совсем понимаю, если это роль с наименьшими привилегиями, чтобы это работало.

enter image description here

...