Google AppEngine Получение 403 запрещено при попытке обновить cron.yaml

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

Вот файлы

приложение.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.

Сервисные аккаунты!

Google AppEngine Получение 403 запрещено при попытке обновить cron.yaml

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
982
2

Ответы 2

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

-1 Предложение добавить роль редактора проекта только для того, чтобы включить развертывание cron для AppEngine, — это чрезмерное предоставление разрешений. Редактор проектов инкапсулирует более 1000 отдельных разрешений, поэтому с точки зрения безопасности никто не должен этого делать.

John 22.11.2019 17:11

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

To grant a user account the ability to deploy to App Engine:

  1. Click Add member to add the user account to the project and then select all of the roles for that account by using the dropdown menu:

    • Required roles to allow an account to deploy to App Engine:

      a. Set the one of the following roles:

      • Use the App Engine > App Engine Deployer role to allow the account to deploy a version of an app.
      • To also allow the dos.yaml or dispatch.yaml files to be deployed with an app, use the App Engine > App Engine Admin role instead.

      The user account now has adequate permission to use the Admin API to deploy apps.

      b. To allow use of App Engine tooling to deploy apps, you must also give the user account the Storage > Storage Admin role so that the tooling has permission to upload to Cloud Storage.

    • Optional. Give the user account the following roles to grant permission for uploading additional configuration files:

      • Cloud Scheduler > Cloud Scheduler Admin role: Permissions for uploading cron.yaml files.

Потенциально интересно:

Другие вопросы по теме