Einfache Implementierung von "Google Übersetzer" Anwendung in Python 3 Cloud Run (Docker)

1. Übersicht

Diese Reihe von Codelabs (selbstgesteuerte, praktische Tutorials) soll Entwicklern helfen, die verschiedenen Optionen für die Bereitstellung ihrer Anwendungen zu verstehen. In diesem Codelab erfahren Sie, wie Sie die Google Cloud Translation API mit Python verwenden und entweder lokal ausführen oder auf einer serverlosen Compute-Plattform in der Cloud (App Engine, Cloud Functions oder Cloud Run) bereitstellen. Die Beispiel-App im Repository dieses Tutorials kann mit nur geringfügigen Konfigurationsänderungen auf mindestens acht verschiedene Arten bereitgestellt werden:

  1. Lokaler Flask-Server (Python 2)
  2. Lokaler Flask-Server (Python 3)
  3. App Engine (Python 2)
  4. App Engine (Python 3)
  5. Cloud Functions (Python 3)
  6. Cloud Run (Python 2 über Docker)
  7. Cloud Run (Python 3 über Docker)
  8. Cloud Run (Python 3 über Cloud Buildpacks)

In diesem Codelab geht es darum, diese App auf den oben fettgedruckten Plattformen bereitzustellen.

In diesem Kurs lernen Sie, wie Sie

Voraussetzungen

  • Ein Google Cloud-Projekt mit einem aktiven Cloud-Rechnungskonto
  • Flask ist für die lokale Ausführung installiert oder eine serverlose Cloud-Computing-Plattform ist für cloudbasierte Bereitstellungen aktiviert.
  • Grundlegende Python-Kenntnisse
  • Grundkenntnisse der grundlegenden Betriebssystembefehle

Umfrage

Wie werden Sie diese Anleitung verwenden?

Lesen und Übungen machen Nur lesen

Wie würden Sie Ihre Erfahrung mit Python bewerten?

Anfänger Mittelstufe Fortgeschrittene

Wie würden Sie Ihre Erfahrungen mit Google Cloud-Diensten bewerten?

Anfänger Mittelstufe Fortgeschritten

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird und den Sie jederzeit aktualisieren können.
  • Die Projekt-ID muss für alle Google Cloud-Projekte eindeutig sein und ist unveränderlich (kann nach der Festlegung nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser aussieht. In den meisten Codelabs müssen Sie auf die Projekt-ID verweisen (die in der Regel als PROJECT_ID angegeben wird). Wenn Ihnen die ID nicht gefällt, können Sie eine andere zufällige ID generieren oder eine eigene ID ausprobieren und sehen, ob sie verfügbar ist. Nachdem das Projekt erstellt wurde, wird es „eingefroren“.
  • Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs verwenden zu können. Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Wenn Sie Ressourcen herunterfahren möchten, damit nach Abschluss dieses Codelabs keine Gebühren anfallen, folgen Sie den Bereinigungsanweisungen am Ende des Codelabs. Neue Nutzer von Google Cloud kommen für das Programm für kostenlose Testversionen mit einem Guthaben von 300$ infrage.

3. Translation API aktivieren

Cloud APIs aktivieren

In diesem Abschnitt erfahren Sie, wie Sie Google-APIs im Allgemeinen aktivieren. Für unsere Beispiel-App aktivieren Sie die Cloud Translation API, Cloud Run und Cloud Artifact Registry.

Einführung

Unabhängig davon, welche Google-API Sie in Ihrer Anwendung verwenden möchten, muss sie aktiviert sein. Im folgenden Beispiel sehen Sie zwei Möglichkeiten, die Cloud Vision API zu aktivieren. Wenn Sie wissen, wie Sie eine Cloud API aktivieren, können Sie auch andere APIs aktivieren, da der Vorgang ähnlich ist.

Option 1: Über Cloud Shell oder die Befehlszeile

Das Aktivieren von APIs über die Cloud Console ist zwar üblicher, aber einige Entwickler bevorzugen es, alles über die Befehlszeile zu erledigen. Dazu müssen Sie den „Dienstnamen“ einer API nachschlagen. Sie sieht aus wie eine URL: SERVICE_NAME.googleapis.com. Sie finden sie in der Tabelle mit unterstützten Produkten oder können sie programmatisch mit der Google Discovery API abfragen.

Mit diesen Informationen können Sie eine API in Cloud Shell (oder in Ihrer lokalen Entwicklungsumgebung mit dem gcloud-Befehlszeilentool) so aktivieren:

gcloud services enable SERVICE_NAME.googleapis.com

Mit diesem Befehl wird beispielsweise die Cloud Vision API aktiviert:

gcloud services enable vision.googleapis.com

Mit diesem Befehl wird App Engine aktiviert:

gcloud services enable appengine.googleapis.com

Sie können auch mehrere APIs mit einer Anfrage aktivieren. Mit dieser Befehlszeile werden beispielsweise Cloud Run, Cloud Artifact Registry und die Cloud Translation API aktiviert:

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

Option 2: Über die Cloud Console

Sie können die Vision API auch im API Manager aktivieren. Rufen Sie in der Cloud Console den API-Manager auf und wählen Sie Bibliothek aus.

fb0f1d315f122d4a.png

Wenn Sie die Cloud Vision API aktivieren möchten, geben Sie „vision“ in die Suchleiste ein. Alles, was mit dem übereinstimmt, was Sie bisher eingegeben haben, wird angezeigt:

2275786a24f8f204.png

Wählen Sie die API aus, die Sie aktivieren möchten, und klicken Sie auf Aktivieren:

2556f923b628e31.png

Kosten

Viele Google-APIs können kostenlos verwendet werden, die Nutzung von Google Cloud-Produkten und ‑APIs ist jedoch nicht kostenlos. Wenn Sie Cloud APIs aktivieren, werden Sie möglicherweise aufgefordert, ein aktives Rechnungskonto anzugeben. Es ist jedoch wichtig zu beachten, dass einige Google Cloud-Produkte ein kostenloses Kontingent (täglich/monatlich) haben, das Sie überschreiten müssen, damit Gebühren anfallen. Andernfalls wird Ihre Kreditkarte (oder das angegebene Abrechnungsinstrument) nicht belastet.

Nutzer sollten sich vor der Aktivierung die Preisinformationen für jede API ansehen und insbesondere darauf achten, ob es ein kostenloses Kontingent gibt und wie hoch dieses ist. Wenn Sie die Cloud Vision API aktivieren, sollten Sie die Preisinformationen aufrufen. Cloud Vision hat ein kostenloses Kontingent. Solange Sie die Limits insgesamt (innerhalb eines Monats) nicht überschreiten, sollten keine Gebühren anfallen.

Die Preise und kostenlosen Kontingente variieren je nach Google-API. Beispiele:

Die Abrechnung für verschiedene Google-Produkte erfolgt unterschiedlich. Weitere Informationen finden Sie in der Dokumentation Ihrer API.

Zusammenfassung

Nachdem Sie nun wissen, wie Sie Google-APIs im Allgemeinen aktivieren, rufen Sie den API Manager auf und aktivieren Sie die Cloud Translation API, Cloud Run und Cloud Artifact Registry (falls noch nicht geschehen). Sie aktivieren die erste Option, weil sie von unserer Anwendung verwendet wird. Sie aktivieren den letzteren Dienst, da dort unsere Container-Images gespeichert werden, bevor sie bereitgestellt werden, um Ihren Cloud Run-Dienst zu starten. Daher müssen Sie diesen Dienst aktivieren. Wenn Sie sie lieber alle mit dem gcloud-Tool aktivieren möchten, führen Sie stattdessen den folgenden Befehl über das Terminal aus:

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

Das monatliche Kontingent ist zwar nicht auf der Übersichtsseite für das „Always Free“-Kontingent aufgeführt, aber auf der Preisseite der Translation API wird angegeben, dass alle Nutzer monatlich eine bestimmte Anzahl von übersetzten Zeichen erhalten. Wenn Sie diesen Grenzwert nicht überschreiten, sollten keine Gebühren für die API anfallen. Andere Google Cloud-bezogene Gebühren werden am Ende im Abschnitt „Bereinigen“ behandelt.

4. Beispiel-App-Code abrufen

Klonen Sie den Code im Repository lokal oder in Cloud Shell (mit dem Befehl git clone) oder laden Sie die ZIP-Datei über die grüne Schaltfläche Code herunter, wie im folgenden Screenshot gezeigt:

5cd6110c4414cf65.png

Erstellen Sie nun eine vollständige Kopie des Ordners, um diese Anleitung durchzuarbeiten, da die Dateien wahrscheinlich gelöscht oder geändert werden müssen. Wenn Sie ein anderes Deployment durchführen möchten, können Sie von vorn beginnen, indem Sie das Original kopieren. So müssen Sie es nicht noch einmal klonen oder herunterladen.

5. Beispiel-App ansehen

Die Beispiel-App ist eine einfache Google Übersetzer-Variante, in der Nutzer aufgefordert werden, Text auf Englisch einzugeben, um die entsprechende Übersetzung ins Spanische zu erhalten. Öffnen Sie jetzt die Datei main.py, damit wir uns ansehen können, wie sie funktioniert. Wenn die auskommentierten Zeilen zur Lizenzierung weggelassen werden, sieht es oben und unten so aus:

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. Durch die Importe werden Flask-Funktionen, das google.auth-Modul und die Cloud Translation API-Clientbibliothek eingebunden.
  2. Die globalen Variablen stehen für die Flask-App, die Cloud-Projekt-ID, den Translation API-Client, den übergeordneten „Standortpfad“ für Translation API-Aufrufe sowie die Quell- und Zielsprachen. In diesem Fall sind das Englisch (en) und Spanisch (es). Sie können diese Werte aber auch in andere von der Cloud Translation API unterstützte Sprachcodes ändern.
  3. Der große if-Block unten wird im Tutorial zum lokalen Ausführen dieser App verwendet. Er nutzt den Flask-Entwicklungsserver, um unsere App bereitzustellen. Dieser Abschnitt ist auch für die Tutorials zur Cloud Run-Bereitstellung enthalten, falls der Webserver nicht im Container enthalten ist. Sie werden aufgefordert, das Bündeln des Servers im Container zu aktivieren. Falls Sie dies übersehen, wird für den App-Code der Flask-Entwicklungsserver verwendet. (Es handelt sich nicht um ein Problem mit App Engine oder Cloud Functions, da diese auf Quellcode basieren. Das bedeutet, dass Google Cloud einen Standard-Webserver bereitstellt und ausführt.)

In der Mitte von main.py befindet sich das Herzstück der Anwendung, die Funktion 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)

Die primäre Funktion übernimmt die Verarbeitung der Nutzereingabe und ruft die Translation API auf, um die eigentliche Arbeit zu erledigen. Sehen wir uns das mal genauer an:

  1. Prüfen Sie mit der Variablen local_request, ob Anfragen von Cloud Functions stammen. Cloud Functions sendet ein eigenes Flask-Anfrageobjekt, während alle anderen (lokal ausgeführt oder in App Engine oder Cloud Run bereitgestellt) das Anfrageobjekt direkt von Flask erhalten.
  2. Setzen Sie die grundlegenden Variablen für das Formular zurück. Das gilt hauptsächlich für GET-Anfragen, da POST-Anfragen Daten enthalten, die diese ersetzen.
  3. Wenn es sich um einen POST handelt, erfassen Sie den zu übersetzenden Text und erstellen Sie eine JSON-Struktur, die die API-Metadatenanforderung darstellt. Rufen Sie dann die API auf und greifen Sie auf eine frühere Version der API zurück, wenn der Nutzer eine ältere Bibliothek verwendet.
  4. Unabhängig davon müssen die tatsächlichen Ergebnisse (POST) oder keine Daten (GET) in den Vorlagenkontext formatiert und gerendert werden.

Der visuelle Teil der Anwendung befindet sich in der Vorlagendatei index.html. Es werden alle zuvor übersetzten Ergebnisse angezeigt (ansonsten leer), gefolgt vom Formular, in dem Sie angeben, was übersetzt werden soll:

<!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. Docker für die Erstellung von Python 3-Images einrichten

Öffnen Sie jetzt die Datei Dockerfile, die ohne die Lizenzinformationen so aussieht:

#FROM python:3-slim
FROM python:2-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "main.py"]

Standardmäßig ist Python 2 eingerichtet. Das können Sie ändern, indem Sie die FROM-Zeile von python:2-slim in python:3-slim ändern oder die obere Zeile auskommentieren und die alte FROM-Zeile löschen. Wenn Sie fertig sind, sollte Dockerfile so aussehen:

FROM python:3-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "main.py"]

7. Dienst bereitstellen

Jetzt können Sie Ihren Übersetzungsdienst in Cloud Run bereitstellen, indem Sie den folgenden Befehl ausführen:

gcloud run deploy translate --source . --allow-unauthenticated --platform managed

Die Ausgabe sollte so aussehen und einige Aufforderungen für die nächsten Schritte enthalten:

$ gcloud run deploy translate --source . --allow-unauthenticated --platform managed
Please specify a region:
 [1] asia-east1
 [2] asia-east2
. . . (other regions) . . .
 [28] us-west4
 [29] cancel
Please enter your numeric choice:  REGION_CHOICE

To make this the default region, run `gcloud config set run/region REGION`.

Deploying from source requires an Artifact Registry repository to
store build artifacts. A repository named [cloud-run-source-deploy] in
 region [REGION] will be created.

Do you want to continue (Y/n)?

This command is equivalent to running "gcloud builds submit --pack image=[IMAGE] ." and "gcloud run deploy translate --image [IMAGE]"

Building . . . and deploying container to Cloud Run service [translate] in project [PROJECT_ID] region [REGION]
✓ Building and deploying... Done.
  ✓ Creating Container Repository...
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/60e1b
  9bb-b991-4b4e-8d8a-HASH?project=PROJECT_NUMBER].
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [translate] revision [translate-00001-xyz] has been deployed and is serving 100 percent of traffic.
Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app

Ihre App ist jetzt weltweit verfügbar. Sie sollte unter der URL mit Ihrer Projekt-ID erreichbar sein, wie in der Bereitstellungsausgabe zu sehen:

169f6edf5f7d2068.png

Übersetzen Sie etwas, um zu sehen, wie es funktioniert.

31554e71cb80f1b4.png

8. Fazit

Glückwunsch! Sie haben gelernt, wie Sie die Cloud Translation API aktivieren, die erforderlichen Anmeldedaten abrufen und eine einfache Webanwendung in Python 3 Cloud Run bereitstellen.

Bereinigen

Mit der Cloud Translation API können Sie monatlich eine bestimmte Anzahl von Zeichen kostenlos übersetzen. App Engine hat auch ein kostenloses Kontingent, ebenso wie Cloud Functions und Cloud Run. Wenn eines der beiden überschritten wird, fallen Gebühren an. Wenn Sie mit dem nächsten Codelab fortfahren möchten, müssen Sie die App nicht schließen.

Wenn Sie jedoch noch nicht bereit sind, mit dem nächsten Tutorial fortzufahren, oder Bedenken haben, dass das Internet die gerade bereitgestellte App entdeckt, können Sie Ihre App Engine-App deaktivieren, Ihre Cloud-Funktion löschen oder Ihren Cloud Run-Dienst deaktivieren, um Gebühren zu vermeiden. Wenn Sie mit dem nächsten Codelab fortfahren möchten, können Sie es wieder aktivieren. Wenn Sie diese Anwendung oder andere Codelabs nicht mehr verwenden und alles vollständig löschen möchten, können Sie Ihr Projekt beenden.

Außerdem fallen bei der Bereitstellung auf einer serverlosen Computing-Plattform von Google Cloud geringe Build- und Speicherkosten an. Cloud Build und Cloud Storage haben jeweils ein eigenes kostenloses Kontingent. Für mehr Transparenz erstellt Cloud Build Ihr Anwendungs-Image, das dann entweder in der Cloud Container Registry oder in Artifact Registry, dem Nachfolger, gespeichert wird. Das Speichern dieses Bildes verbraucht einen Teil dieses Kontingents, ebenso wie der ausgehende Netzwerktraffic beim Übertragen des Bildes an den Dienst. Möglicherweise leben Sie jedoch in einer Region, in der es kein solches kostenloses Kontingent gibt. Achten Sie daher auf Ihre Speichernutzung, um potenzielle Kosten zu minimieren.

9. Zusätzliche Ressourcen

In den folgenden Abschnitten finden Sie zusätzliches Lesematerial sowie empfohlene Übungen, um Ihr Wissen aus diesem Tutorial zu erweitern.

Zusätzliche Studie

Nachdem Sie nun etwas Erfahrung mit der Translation API gesammelt haben, wollen wir einige zusätzliche Übungen machen, um Ihre Fähigkeiten weiter zu verbessern. Um mit dem Lernpfad fortzufahren, ändern Sie unsere Beispiel-App so, dass sie Folgendes ausführt:

  1. Führen Sie alle anderen Versionen dieses Codelabs aus, um lokal zu arbeiten oder auf serverlosen Compute-Plattformen von Google Cloud bereitzustellen (siehe README des Repositorys).
  2. Dieses Tutorial in einer anderen Programmiersprache durcharbeiten
  3. Ändern Sie die Anwendung, um andere Ausgangs- oder Zielsprachen zu unterstützen.
  4. Aktualisieren Sie diese Anwendung, um Text in mehr als eine Sprache übersetzen zu können. Ändern Sie die Vorlagendatei so, dass ein Drop-down-Menü mit unterstützten Zielsprachen angezeigt wird.

Weitere Informationen

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpacks, Container Registry, Artifact Registry

Google Cloud Translation und Google ML Kit

Andere Google Cloud-Produkte/-Seiten

Python und Flask

Lizenz

Dieses Tutorial ist unter der Creative Commons Attribution 2.0 Generic License lizenziert, während der Quellcode im Repository unter Apache 2 lizenziert ist.