[PYTHON] Comment exécuter automatiquement la fonction d'exportation de GCP Datastore

Cette fois, je vais vous présenter comment effectuer une sauvegarde automatique du magasin de données de Google Cloud Platform.

supposition

--L'entité existe dans le magasin de données

procédure

1, faites un seau pour sauvegarder avec le stockage

Accédez à GoogleCloudPlatformStorage (https://console.cloud.google.com/projectselector2/storage/browser?supportedpurview=project) et sélectionnez un projet スクリーンショット 2019-11-26 9.20.37.png

Cliquez sur Créer un compartiment pour créer un compartiment スクリーンショット 2019-11-26 14.17.00.png

--Mettez un nom dans le seau

[Cliquez ici pour plus de détails](https://cloud.google.com/storage/docs/locations?_ga=2.5981299.-176719181.1568084299) --Choisissez une classe de stockage par défaut pour vos données - Standard: idéal pour le stockage à court terme et les données fréquemment consultées --Nearline: Idéal pour les données et les sauvegardes accessibles moins d'une fois par mois --Coldline: Idéal pour les données et les sauvegardes accessibles moins d'une fois par an --Choisissez comment contrôler l'accès aux objets - Gestion détaillée --Uniforme - Paramètres détaillés (facultatif)

Appuyez sur [Créer] lorsque les réglages sont terminés. スクリーンショット 2019-11-26 15.13.57.png J'ai fait un seau pour mettre une sauvegarde comme celle-ci. Ensuite, configurez pour placer la sauvegarde dans le compartiment

2. Créez un code source qui reçoit l'entité Datastore et la sauvegarde.

Ici, https://cloud.google.com/datastore/docs/schedule-export?hl=ja Je vais l'ajouter avec Yaml et Python en y faisant référence. Tout d'abord, créez ** [app.yaml] ** avec Yaml. (S'il existe déjà, créez un dossier et créez-le dedans) Capture d'écran 26/11/2019 15.33.34.png ← Je l'ai mis dans le dossier de sauvegarde comme ceci

L'app.yaml ici est préparé pour les paramètres Python.

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

Ensuite, préparons ** [cloud_datastore_admin.py] ** en Python.

cloud_datastore_admin.py


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)

Si vous pouvez entrer comme ça, déployons

  1. Utilisez [config set] pour configurer gcloud pour le bon projet
gcloud config set project [Nom du projet]
  1. Déployez [app.yaml] dans le projet * Ne vous méprenez pas sur le répertoire où se trouve [app.yaml]! !!
gcloud app deploy

Si vous pouvez le déployer avec succès, vous êtes prêt pour la sauvegarde automatique. Nous allons l'automatiser ensuite.

3. Configuré pour s'exécuter automatiquement dans le travail cron

Voir aussi https://cloud.google.com/datastore/docs/schedule-export?hl=ja Je vais procéder à

Commencez par configurer une tâche cron qui appelle la planification-datastore-exportations GCP Créez ** [cron.yaml] **.

cron.yaml


cron:
- description: "Texte explicatif"
  url: /cloud-datastore-export?output_url_prefix=gs://[Nom du godet]
  target: cloud-datastore-admin
  timezone: Asia/Tokyo
  schedule: every 12 hours


Si cela vous convient, déployons

gcloud app deploy cron.yaml

Pour les paramètres détaillés ~ Sélection ~

Utilisez kind si vous souhaitez exporter uniquement certains types d'entités lors de la sauvegarde

url: /cloud-datastore-export?output_url_prefix=gs://[Nom du godet]&kind=[Nom du type d'entité]

Il est également possible d'en spécifier plusieurs spécifiques

url: /cloud-datastore-export?output_url_prefix=gs://[Nom du godet]&kind=[Nom du type d'entité]&kind=[Nom du type d'entité]

Si vous souhaitez exporter si l'espace de noms existe pour une entité particulière

url: /cloud-datastore-export?output_url_prefix=gs://[Nom du godet]&kind=[Nom du type d'entité]&kind=[Nom du type d'entité]

Vous pouvez également définir des paramètres détaillés en entrant

Pour les paramètres détaillés ~ Réglage de l'heure ~

Précisons l'heure d'exécution de la sauvegarde dans ** [planning] ** Actuellement, il est configuré pour effectuer une sauvegarde toutes les 12 heures, mais si c'est une fois par jour

schedule: every 24 hours

Si vous souhaitez effectuer une sauvegarde tous les jours à 00h00

schedule: every day 00:00

Peut être réglé largement Pour plus d'informations [https://cloud.google.com/appengine/docs/flexible/java/scheduling-jobs-with-cron-yaml?hl=ja#defining_the_cron_job_schedule](https://cloud.google.com/appengine/ Les détails peuvent être trouvés dans docs / flexible / java / scheduling-jobs-with-cron-yaml? Hl = ja #defining_the_cron_job_schedule). À propos, si vous souhaitez définir l'heure de référence pour exécuter la sauvegarde vers l'heure du Japon

timezone: Asia/Tokyo

Si c'est le cas, ce sera fait au Japon.

4, implémentation du travail cron

Testons si cela fonctionne réellement

Si le travail cron AppEngine est affiché comme ceci, cron fonctionne bien

スクリーンショット 2019-11-27 10.48.33.png

Maintenant, déplaçons-le avec [Exécuter maintenant] Maintenant!

Wow, Elatter (´ ゚ д ゚ `) スクリーンショット 2019-11-27 10.49.27.png Dans un tel cas, voyons l'erreur dans [View] du journal.

Voir l'erreur dans le journal

Quand j'ai affiché le journal, c'était 403. スクリーンショット 2019-11-27 10.49.43.png

Lorsque vous l'ouvrez, il est dit "L'appelant n'a pas la permission" ... En d'autres termes, "je n'ai pas le pouvoir d'importer et d'exporter". スクリーンショット 2019-11-27 10.50.26.png

Allons donner l'autorité

Donner autorité

Ouvrir IAM dans IAN et administration スクリーンショット 2019-11-27 11.14.34.png Modifiez-y [ID de projet] @ appspot.gserviceaccount.com スクリーンショット 2019-11-27 11.22.26.png Appuyez sur [Ajouter un autre rôle] Sélectionnez [Cloud Datastore Import / Export Administrator] dans Datastore et enregistrez! スクリーンショット 2019-11-27 11.22.58.png

Alors revenons à la course à pied スクリーンショット 2019-11-27 10.49.27.png Si vous appuyez à nouveau sur [Exécuter maintenant] ... スクリーンショット 2019-11-27 11.24.49.png C'est fait! !!

Maintenant, il collecte des données toutes les 12 heures!

finalement

Comment était tout le monde, ça a marché? Je me demande si ce commentaire s'est bien passé (´ ゚ д ゚ `)

Mais si vous sauvegardez les données dans le magasin de données comme ceci Vous pouvez l'effacer par erreur humaine ou résoudre tout problème. Je ne pense pas qu'il y ait de perte à le faire

Cela fait longtemps, mais merci! !!

URL de référence

https://cloud.google.com/storage/docs/locations?_ga=2.5981299.-176719181.1568084299

https://cloud.google.com/datastore/docs/schedule-export?hl=ja

https://cloud.google.com/appengine/docs/flexible/java/scheduling-jobs-with-cron-yaml?hl=ja#defining_the_cron_job_schedule

Recommended Posts