Déployez une version de base de Google Traduction application sur Python 2 App Engine

1. Présentation

Cette série d'ateliers de programmation (tutoriels pratiques et d'auto-formation) vise à aider les développeurs à comprendre les différentes options dont ils disposent pour déployer leurs applications. Dans cet atelier de programmation, vous allez apprendre à utiliser l'API Google Cloud Translation avec Python, et à l'exécuter en local ou à la déployer sur une plate-forme de calcul Cloud sans serveur (App Engine, Cloud Functions ou Cloud Run). L'exemple d'application qui se trouve dans le dépôt de ce tutoriel peut être déployé (au moins) hui manières différentes avec seulement des modifications de configuration mineures:

  1. Serveur Flask local (Python 2)
  2. Serveur Flask local (Python 3)
  3. App Engine (Python 2)
  4. App Engine (Python 3)
  5. Cloud Functions (Python 3)
  6. Cloud Run (Python 2 via Docker)
  7. Cloud Run (Python 3 via Docker)
  8. Cloud Run (Python 3 via Cloud Buildpacks)

Cet atelier de programmation porte sur le déploiement de cette application sur les plates-formes en gras ci-dessus.

Vous apprendrez à effectuer les tâches suivantes :

Prérequis

  • Un projet Google Cloud avec un compte de facturation Cloud actif
  • Flask installé pour une exécution en local, ou plate-forme de calcul sans serveur cloud activée pour les déploiements dans le cloud
  • Des connaissances de base en Python
  • Connaissance pratique des commandes de base du système d'exploitation

Enquête

Comment allez-vous utiliser ce tutoriel ?

<ph type="x-smartling-placeholder"></ph> Je vais le lire et effectuer les exercices Lecture seule

Quel est votre niveau d'expérience avec Python ?

Débutant Intermédiaire Expert

Quel est votre niveau d'expérience avec les services Google Cloud ?

<ph type="x-smartling-placeholder"></ph> Débutant Intermédiaire Expert
.

2. Préparation

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères qui n'est pas utilisée par les API Google, et que vous pouvez modifier à tout moment.
  • L'ID du projet doit être unique sur l'ensemble des projets Google Cloud et doit être immuable (vous ne pouvez pas le modifier une fois que vous l'avez défini). Cloud Console génère automatiquement une chaîne unique dont la composition importe peu, en général. Dans la plupart des ateliers de programmation, vous devrez référencer l'ID du projet (généralement identifié comme PROJECT_ID), donc s'il ne vous convient pas, générez-en un autre au hasard ou définissez le vôtre, puis vérifiez s'il est disponible. Il est ensuite "gelé" une fois le projet créé.
  • La troisième valeur est le numéro de projet, utilisé par certaines API. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans Cloud Console afin d'utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour arrêter les ressources afin d'éviter qu'elles ne vous soient facturées après ce tutoriel, suivez les instructions de nettoyage indiquées à la fin de l'atelier. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai gratuit pour bénéficier d'un crédit de 300 $.

3. Activer l'API Translation

Pour notre exemple d'application, vous allez activer l'API Cloud Translation et le service App Engine en suivant les instructions ci-dessous.

Activer les API Cloud

Introduction

Quelle que soit l'API Google que vous souhaitez utiliser dans votre application, vous devez les activer. L'exemple suivant montre deux façons d'activer l'API Cloud Vision. Après avoir appris à activer une API Cloud, vous pourrez activer d'autres API, car le processus est similaire.

Option 1: Depuis Cloud Shell ou votre interface de ligne de commande

Bien que l'activation des API à partir de la console Cloud soit plus courante, certains développeurs préfèrent tout faire à partir de la ligne de commande. Pour ce faire, vous devez rechercher le "nom de service" d'une API. Son URL ressemble à ceci: SERVICE_NAME.googleapis.com. Vous pouvez les trouver dans le tableau des produits compatibles ou les interroger de manière programmatique avec l'API Google Discovery.

Grâce à ces informations, vous pouvez activer une API à l'aide de Cloud Shell (ou de votre environnement de développement local sur lequel l'outil de ligne de commande gcloud est installé) :

gcloud services enable SERVICE_NAME.googleapis.com

Par exemple, la commande suivante active l'API Cloud Vision:

gcloud services enable vision.googleapis.com

Cette commande active App Engine:

gcloud services enable appengine.googleapis.com

Vous pouvez également activer plusieurs API avec une seule requête. Par exemple, cette ligne de commande active Cloud Run, Cloud Artifact Registry et l'API Cloud Translation:

gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

Option 2: Dans la console Cloud

Vous pouvez également activer l'API Vision dans le gestionnaire d'API. Dans la console Cloud, accédez à Gestionnaire d'API, puis sélectionnez Bibliothèque.

fb0f1d315f122d4a.png

Si vous souhaitez activer l'API Cloud Vision, commencez à saisir "vision" dans la barre de recherche. Tous les résultats qui correspondent à votre saisie s'affichent:

2275786a24f8f204.png

Sélectionnez l'API que vous souhaitez activer, puis cliquez sur Activer:

2556f923b628e31.png

Coût

Si de nombreuses API Google peuvent être utilisées sans frais, l'utilisation des produits Google Cloud et Les API ne sont pas sans frais. Lors de l'activation des API Cloud, vous pouvez être invité à indiquer un compte de facturation actif. Il est cependant important de noter que certains produits Google Cloud proposent un service niveau (quotidien/mensuel), que vous devez dépasser pour que des frais vous soient facturés ; Sinon, votre carte de crédit (ou le mode de paiement spécifié) ne sera pas débitée.

Les utilisateurs doivent consulter les informations tarifaires d'une API avant de l'activer, en particulier en indiquant s'il s'agit d'une version sans frais et, le cas échéant, de quelle version il s'agit. Si vous activez l'API Cloud Vision, vous devez consulter la page d'informations tarifaires. Cloud Vision propose un quota sans frais. Tant que vous respectez les limites agrégées (au cours de chaque mois), aucuns frais ne vous sont facturés.

Les tarifs et les niveaux de sans frais varient selon les API Google. Exemples :

La procédure de facturation est différente selon les produits Google. Par conséquent, assurez-vous de vous référer à la documentation de votre API pour obtenir ces informations.

Résumé

Maintenant que vous savez comment activer les API Google en général, accédez au Gestionnaire d'API et activez à la fois l'API Cloud Translation et le service App Engine (si ce n'est pas déjà fait). La première consiste à activer la première pour notre application, et la seconde, car vous déployez une application App Engine. Si vous préférez le faire à partir de la ligne de commande, exécutez plutôt cette commande:

gcloud services enable appengine.googleapis.com translate.googleapis.com

Bien que son quota mensuel ne figure pas dans la liste des ressources "Toujours sans frais" la page de résumé du niveau de service, la page des tarifs de l'API Translation indique que tous les utilisateurs bénéficient d'un nombre fixe de caractères traduits chaque mois. Aucuns frais ne devraient vous être facturés par l'API si vous restez en dessous de ce seuil. Si d'autres frais sont liés à Google Cloud, ils sont abordés à la fin de la section "Effectuer un nettoyage". .

4. Obtenir le code de l'application exemple

Clonez le code en local dans le dépôt ou dans Cloud Shell (à l'aide de la commande git clone), ou téléchargez le fichier ZIP à partir du bouton vert Code, comme illustré dans la capture d'écran suivante:

5cd6110c4414cf65.png

Maintenant que vous avez tout ce qu'il faut, créez une copie complète du dossier pour suivre ce tutoriel, car cela impliquera probablement de supprimer ou de modifier les fichiers. Si vous souhaitez effectuer un autre déploiement, vous pouvez recommencer en copiant l'original afin de ne pas avoir à le cloner ni à le télécharger à nouveau.

5. Visite guidée de l'application exemple

L'application exemple est une application dérivée simple de Google Traduction qui invite les utilisateurs à saisir du texte en anglais pour obtenir la traduction équivalente en espagnol. Ouvrez maintenant le fichier main.py pour voir comment cela fonctionne. En l'absence des commentaires sur l'attribution de licence, la phrase se présente en haut et en bas:

from flask import Flask, render_template, request
import google.auth
from google.cloud import translate

app = Flask(__name__)
_, PROJECT_ID = google.auth.default()
TRANSLATE = translate.TranslationServiceClient()
PARENT = 'projects/{}'.format(PROJECT_ID)
SOURCE, TARGET = ('en', 'English'), ('es', 'Spanish')

# . . . [translate() function definition] . . .

if __name__ == '__main__':
    import os
    app.run(debug=True, threaded=True, host='0.0.0.0',
            port=int(os.environ.get('PORT', 8080)))
  1. Les importations intègrent les fonctionnalités Flask, le module google.auth et la bibliothèque cliente de l'API Cloud Translation.
  2. Les variables globales représentent l'application Flask, l'ID du projet Cloud, le client de l'API Translation et le "chemin d'accès de l'emplacement" parent. pour les appels de l'API Translation, ainsi que les langues source et cible. Dans ce cas, il s'agit de l'anglais (en) et de l'espagnol (es), mais n'hésitez pas à remplacer ces valeurs par d'autres codes de langue compatibles avec l'API Cloud Translation.
  3. Le grand bloc if situé en bas de l'écran est utilisé dans le tutoriel pour exécuter cette application en local. Il utilise le serveur de développement Flask pour diffuser notre application. Cette section est également disponible pour les tutoriels sur le déploiement de Cloud Run au cas où le serveur Web n'est pas intégré au conteneur. Vous êtes invité à activer le regroupement du serveur dans le conteneur. Toutefois, si vous l'oubliez, le code de l'application utilise le serveur de développement Flask. (Il ne s'agit pas d'un problème avec App Engine ou Cloud Functions, car il s'agit de plates-formes basées sur des sources, ce qui signifie que Google Cloud fournit et exécute un serveur Web par défaut.)

Enfin, au milieu de main.py se trouve le cœur de l'application, la fonction translate():

@app.route('/', methods=['GET', 'POST'])
def translate(gcf_request=None):
    """
    main handler - show form and possibly previous translation
    """

    # Flask Request object passed in for Cloud Functions
    # (use gcf_request for GCF but flask.request otherwise)
    local_request = gcf_request if gcf_request else request

    # reset all variables (GET)
    text = translated = None

    # if there is data to process (POST)
    if local_request.method == 'POST':
        text = local_request.form['text']
        data = {
            'contents': [text],
            'parent': PARENT,
            'target_language_code': TARGET[0],
        }
        # handle older call for backwards-compatibility
        try:
            rsp = TRANSLATE.translate_text(request=data)
        except TypeError:
            rsp = TRANSLATE.translate_text(**data)
        translated = rsp.translations[0].translated_text

    # create context & render template
    context = {
        'orig':  {'text': text, 'lc': SOURCE},
        'trans': {'text': translated, 'lc': TARGET},
    }
    return render_template('index.html', **context)

La fonction principale récupère l'entrée utilisateur et appelle l'API Translation pour effectuer le gros du travail. Voyons cela de plus près:

  1. Vérifiez si les requêtes proviennent de Cloud Functions à l'aide de la variable local_request. Cloud Functions envoie son propre objet de requête Flask, tandis que tous les autres (exécutés localement ou déployés sur App Engine ou Cloud Run) obtiennent l'objet de requête directement à partir de Flask.
  2. Réinitialisez les variables de base du formulaire. Cela concerne principalement les requêtes GET, car les requêtes POST contiennent des données qui les remplacent.
  3. S'il s'agit d'une requête POST, récupérez le texte à traduire et créez une structure JSON représentant l'exigence de métadonnées de l'API. Appelez ensuite l'API, en revenant à une version précédente de l'API si l'utilisateur utilise une bibliothèque plus ancienne.
  4. Dans tous les cas, mettez en forme les résultats réels (POST) ou aucune donnée (GET) dans le contexte du modèle et effectuez le rendu.

La partie visuelle de l'application se trouve dans le modèle de fichier index.html. Il affiche tous les résultats précédemment traduits (sinon, il est vide) suivis du formulaire demandant une traduction:

<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<h2>My Google Translate (1990s edition)</h2>

{% if trans['text'] %}
    <h4>Previous translation</h4>
    <li><b>Original</b>:   {{ orig['text'] }}  (<i>{{ orig['lc'][0] }}</i>)</li>
    <li><b>Translated</b>: {{ trans['text'] }} (<i>{{ trans['lc'][0] }}</i>)</li>
{% endif %}

<h4>Enter <i>{{ orig['lc'][1] }}</i> text to translate to <i>{{ trans['lc'][1] }}</i>:</h4>
<form method="POST"><input name="text"><input type="submit"></form>
</body></html>

6. Installer les packages/dépendances locaux (dans lib)

Comme indiqué précédemment, l'application exemple utilise le micro-framework Web Flask et la bibliothèque cliente de l'API Google Cloud Translation pour Python. Installez et mettez à jour pip et cette paire de packages à l'aide de la commande pip (ou pip3) :

pip install -t lib -r requirements.txt

Après avoir exécuté le commentaire ci-dessus, le résultat de l'installation devrait ressembler à ceci:

$ pip install -t lib -r requirements.txt
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
Collecting flask>=1.1.2
  Using cached Flask-1.1.4-py2.py3-none-any.whl (94 kB)
Collecting google-cloud-translate>=2.0.1
  Using cached google_cloud_translate-2.0.2-py2.py3-none-any.whl (91 kB)
Collecting click<8.0,>=5.1
  Using cached click-7.1.2-py2.py3-none-any.whl (82 kB)
Collecting Jinja2<3.0,>=2.10.1
  Using cached Jinja2-2.11.3-py2.py3-none-any.whl (125 kB)
Collecting Werkzeug<2.0,>=0.15
  Using cached Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Collecting itsdangerous<2.0,>=0.24
  Using cached itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting google-api-core[grpc]<2.0.0dev,>=1.15.0
  Downloading google_api_core-1.29.0-py2.py3-none-any.whl (93 kB)
     |████████████████████████████████| 93 kB 2.1 MB/s
Collecting google-cloud-core<2.0dev,>=1.1.0
  Using cached google_cloud_core-1.6.0-py2.py3-none-any.whl (28 kB)
Collecting MarkupSafe>=0.23
  Using cached MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl (17 kB)
Collecting protobuf>=3.12.0
  Downloading protobuf-3.17.2-cp27-cp27m-macosx_10_9_x86_64.whl (958 kB)
     |████████████████████████████████| 958 kB 21.6 MB/s
Collecting futures>=3.2.0; python_version < "3.2"
  Using cached futures-3.3.0-py2-none-any.whl (16 kB)
Collecting six>=1.13.0
  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting packaging>=14.3
  Using cached packaging-20.9-py2.py3-none-any.whl (40 kB)
Collecting googleapis-common-protos<2.0dev,>=1.6.0
  Using cached googleapis_common_protos-1.52.0-py2.py3-none-any.whl (100 kB)
Collecting requests<3.0.0dev,>=2.18.0
  Using cached requests-2.25.1-py2.py3-none-any.whl (61 kB)
Collecting google-auth<2.0dev,>=1.25.0
  Using cached google_auth-1.30.1-py2.py3-none-any.whl (146 kB)
Collecting pytz
  Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)
Collecting setuptools>=40.3.0
  Using cached setuptools-44.1.1-py2.py3-none-any.whl (583 kB)
Collecting grpcio<2.0dev,>=1.29.0; extra == "grpc"
  Using cached grpcio-1.38.0-cp27-cp27m-macosx_10_10_x86_64.whl (3.8 MB)
Collecting pyparsing>=2.0.2
  Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Collecting chardet<5,>=3.0.2
  Using cached chardet-4.0.0-py2.py3-none-any.whl (178 kB)
Collecting urllib3<1.27,>=1.21.1
  Using cached urllib3-1.26.5-py2.py3-none-any.whl (138 kB)
Collecting idna<3,>=2.5
  Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Collecting certifi>=2017.4.17
  Downloading certifi-2021.5.30-py2.py3-none-any.whl (145 kB)
     |████████████████████████████████| 145 kB 61.1 MB/s
Collecting pyasn1-modules>=0.2.1
  Using cached pyasn1_modules-0.2.8-py2.py3-none-any.whl (155 kB)
Collecting rsa<4.6; python_version < "3.6"
  Using cached rsa-4.5-py2.py3-none-any.whl (36 kB)
Collecting cachetools<5.0,>=2.0.0
  Using cached cachetools-3.1.1-py2.py3-none-any.whl (11 kB)
Collecting enum34>=1.0.4; python_version < "3.4"
  Using cached enum34-1.1.10-py2-none-any.whl (11 kB)
Collecting pyasn1<0.5.0,>=0.4.6
  Using cached pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
Installing collected packages: click, MarkupSafe, Jinja2, Werkzeug, itsdangerous, flask, six, protobuf, futures, pyparsing, packaging, googleapis-common-protos, chardet, urllib3, idna, certifi, requests, pyasn1, pyasn1-modules, rsa, cachetools, setuptools, google-auth, pytz, enum34, grpcio, google-api-core, google-cloud-core, google-cloud-translate
ERROR: pip's legacy dependency resolver does not consider dependency conflicts when selecting packages. This behaviour is the source of the following dependency conflicts.
matplotlib 1.3.1 requires nose, which is not installed.
matplotlib 1.3.1 requires tornado, which is not installed.
Successfully installed Jinja2-2.11.3 MarkupSafe-1.1.1 Werkzeug-1.0.1 cachetools-3.1.1 certifi-2021.5.30 chardet-4.0.0 click-7.1.2 enum34-1.1.10 flask-1.1.4 futures-3.3.0 google-api-core-1.29.0 google-auth-1.30.1 google-cloud-core-1.6.0 google-cloud-translate-2.0.2 googleapis-common-protos-1.52.0 grpcio-1.38.0 idna-2.10 itsdangerous-1.1.0 packaging-20.9 protobuf-3.17.2 pyasn1-0.4.8 pyasn1-modules-0.2.8 pyparsing-2.4.7 pytz-2021.1 requests-2.25.1 rsa-4.5 setuptools-44.1.1 six-1.16.0 urllib3-1.26.5

7. Déployer le service

Pour déployer votre service de traduction sur Python 2 App Engine, exécutez la commande suivante:

gcloud app deploy

Le résultat doit se présenter comme suit et fournir quelques invites pour les étapes suivantes:

$ gcloud app deploy
Services to deploy:

descriptor:      [/private/tmp/nebulous-serverless-python/app.yaml]
source:          [/private/tmp/nebulous-serverless-python]
target project:  [PROJECT_ID]
target service:  [default]
target version:  [20210422t161025]
target url:      [https://PROJECT_ID.appspot.com]


Do you want to continue (Y/n)?

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 1290 files to Google Cloud Storage                       ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://PROJECT_ID.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse

Maintenant que votre application est disponible dans le monde entier, vous devriez pouvoir y accéder via l'URL (contenant l'ID de votre projet) fournie dans le résultat de votre déploiement:

da28f951c33a2c3d.png

Traduisez quelque chose pour voir ça fonctionner !

d911984d15dd5ef9.png

8. Conclusion

Félicitations ! Vous avez appris à activer l'API Cloud Translation, à obtenir les identifiants nécessaires et à déployer une application Web simple dans Python 2 App Engine. Pour en savoir plus sur ce déploiement, consultez ce tableau du dépôt.

Effectuer un nettoyage

L'API Cloud Translation vous permet d'exécuter sans frais un nombre fixe de caractères traduits par mois. App Engine dispose également d'un quota sans frais. Il en va de même pour Cloud Functions et Cloud Run. Des frais vous seront facturés en cas de dépassement. Si vous prévoyez de passer à l'atelier de programmation suivant, vous n'avez pas besoin d'arrêter votre application.

Toutefois, si vous n'êtes pas encore prêt à passer au tutoriel suivant ou si vous craignez qu'Internet découvre l'application que vous venez de déployer, désactivez votre application App Engine, supprimez votre fonction Cloud ou désactivez votre service Cloud Run pour éviter des frais. Lorsque vous serez prêt à passer au prochain atelier de programmation, vous pourrez le réactiver. En revanche, si vous ne comptez pas utiliser cette application ou d'autres ateliers de programmation, mais que vous souhaitez tout supprimer complètement, vous pouvez arrêter votre projet.

De plus, le déploiement sur une plate-forme de calcul sans serveur Google Cloud entraîne des coûts minimes de compilation et de stockage. Cloud Build et Cloud Storage disposent de leur propre quota sans frais. Pour plus de transparence, Cloud Build crée l'image de votre application, qui est ensuite stockée dans Cloud Container Registry ou dans Artifact Registry, son successeur. Le stockage de cette image utilise une partie de ce quota, tout comme la sortie réseau lors du transfert de cette image vers le service. Cependant, vous pouvez résider dans une région qui n'offre pas ce type de version sans frais. Vous devez donc surveiller l'utilisation de votre espace de stockage afin de réduire les coûts potentiels.

9. Ressources supplémentaires

Dans les sections suivantes, vous trouverez d'autres documents à lire ainsi que des exercices recommandés pour parfaire les connaissances acquises lors de ce tutoriel.

Étude supplémentaire

Maintenant que vous disposez d'une certaine expérience de l'API Translation, vous allez maintenant effectuer quelques exercices supplémentaires pour développer vos compétences. Pour poursuivre votre parcours de formation, modifiez notre application exemple comme suit:

  1. Suivez toutes les autres éditions de cet atelier de programmation pour une exécution en local ou un déploiement sur des plates-formes de calcul sans serveur Google Cloud (consultez le fichier README du dépôt).
  2. Suivez ce tutoriel dans un autre langage de programmation.
  3. Modifiez cette application pour qu'elle prenne en charge d'autres langues sources ou cibles.
  4. Mettre à niveau cette application pour pouvoir traduire du texte dans plusieurs langues modifier le fichier de modèle pour y inclure un menu déroulant des langues cibles prises en charge.

En savoir plus

Google App Engine

Google Cloud Functions

Google Cloud Run

Packs de création Google Cloud, Container Registry, Artifact Registry

Google Cloud Translation et Google ML Kit

Autres produits/pages Google Cloud

Python et Flask

Licence

Ce tutoriel est soumis à une licence générique Creative Commons Attribution 2.0, tandis que le code source du dépôt est sous licence Apache 2.